微机原理与接口技术4章.ppt

上传人:max****ui 文档编号:2916556 上传时间:2019-12-04 格式:PPT 页数:84 大小:349KB
返回 下载 相关 举报
微机原理与接口技术4章.ppt_第1页
第1页 / 共84页
微机原理与接口技术4章.ppt_第2页
第2页 / 共84页
微机原理与接口技术4章.ppt_第3页
第3页 / 共84页
点击查看更多>>
资源描述
第四章 汇编语言程序设计,微机原理与接口技术,第四章 汇编语言程序设计,主要内容 汇编语言程序的结构 汇编语言语句类型和组成 汇编语言程序设计,文件名.ASM 文件名.OBJ 文件名.EXE,汇编语言 源程序,汇编,目标 程序,连接,执行/调试 程序,编辑程序 EDIT.EXE,汇编程序 MASM.EXE,连接程序 LINK.EXE,汇编语言程序的开发过程,4.1机器指令/汇编语言,ML 文件名.ASM,汇编语言程序的开发过程,1. 源程序的编辑: 源程序文件要以ASM为扩展名源程序文件的形成(编辑)可以通过任何一个文本编辑器实现: 如DOS中的全屏幕文本编辑器EDIT 2. 源程序的汇编 汇编是将源程序翻译成由机器代码组成的目标模块文件的过程. MASM hello.asm 如果源程序中没有语法错误,MASM将自动生成一个目标模块文件(hello.obj);否则MASM将给出相应的错误信息, 这时应根据错误信息,重新编辑修改源程序后,再进行汇编 3.目标模块的连接 连接程序能把一个或多个目标文件和库文件合成一个可执行程序(.EXE、.COM文件): LINK hello.obj 如果没有严重错误,LINK将生成一个可执行文件(hello.exe).,汇编语言程序的开发过程,4.可执行程序的运行与调试 经汇编、连接生成的可执行程序在操作系统(DOS)下只要输入文件名就可以运行: hello.exe 操作系统装载该文件进入主存,并开始运行。 在DOS下运行程序时,COMMAND.COM把.EXE文件装入内存。装入后,自动设置DS和ES寄存器指向程序段前缀,CS、IP、SS、SP寄存器设置为由连接程序传过来的值(所以必须在程序中给DS、ES赋值)。,PSP,DS,ES,用户程序区,汇编语言程序的开发过程,程序结束返回DOS的方法: START PROC FAR PUSH DS MOV AX,0 PUSH AX : RET START ENDP,如果出现运行错误, 可以从源程序开始排错, 也可以利用调试程序 帮助发现错误. 采用DEBUG.EXE调试程序: DEBUG hello.exe,4.2汇编语言源程序的结构,汇编语言的源程序是分段的,由几个段形成一个源程序,每一段有一个段名,以SEGMENT为段开始,以ENDS结束; 源程序最后以END作结束; 一般有DATA段,CODE段,STACK段; 一个段由若干语句组成,MY_DATA SEGMENT ;定义数据段 SUM DB ? ;为符号SUM保留一个字节 MY_DATA ENDS ;数据段结束 MY_CODE SEGMENT ;定义代码段 ASSUME CS:MY_CODE,DS:MY_DATA;规定CS,DS的内容 PORT_VAL EQU 3 ;端口的符号名 GO: MOV AX,MY_DATA ;DS初始化为 MY_DATA MOV DS,AX MOV SUM,0 ;SUM单元为0 CYCLE: CMP SUM,100 ;SUM与100比较 JNA NOT_DONE ;若未超过转至NOT_DONE MOV AL,SUM ;若超过把SUM的内容 OUT PORT_VAL,AL ;通过AL输出然后停机 HLT NOT_DONE: IN AL,PORT_VAL ;输入下一个字节 ADD SUM,AL ;与以前的结果累加 JMP CYCLE ;转至CYCLE MY_CODE ENDS ;码段结束 END GO ;整个程序结束,一、 汇编语言的语句格式 标号: 指令助记符 操作数;注解 名字 伪指令助记符 参数;注解,1标号(名字):是给指令或某一存储单元地址所起的名字。可由下列字符组成: 字母:A z ; 数字:0 9 ; 特殊字符:?、 、一、$ 。 当标识符后跟冒号时,表示是标号。它代表该行指令的起始地址;当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。 2(伪)指令助记符: 表示不同操作的指令,可为8088的指令助记符,或伪指令。 3操作(参)数:是指令执行的对象。依指令的要求,可能有一个、两个或者没有. 4注解,例如: COUNT: INC CX ;一个操作数 COST DB 3,4,5,6,7 ;伪指令,5个操作数 MOV AX,BP十4 ;二个操作数,4.2汇编语言源程序的结构,二、段定义语句与段寻址 段定义伪指令一般格式为 : 段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS (1)定位类型:用来规定段起始边界的要求,可以为以下四种,缺省为 PARA) PAGE: 16位段地址的最低8位必须为0,即从一页的起点开始。 PARA: 16位段地址的最低4位必须为0,即从一段的起点开始。 WORD: 16位段地址的最低1位必须为0,即从偶地址开始。 BYTE: 16位段地址可以为任意值,即段可以从任何字节开始,4.2汇编语言源程序的结构,(2)组合类型(表示本段与其他段的关系,为连接程序使 用,缺省为NONE): NONE:与其他段不发生关系,每段都有自己的基地址 PUBLIC:与其他同名同类别的段连接在一起,使用 一个共同的基地 址 STACK:与PUBLIC同样处理,但作为堆栈段 COMMON:与其他同名同类别的段相互重叠在一起,使用一个共同的 基地址 AT表达式:把本段装在表达式值所指定的段地址上(值为16位;不能 指定代码段) MEMORY:把本段定位在所有其他段之上,若有多个则只有 连接时遇到的第一个有效, 其余按COMMON处理) (3)类别名:为连接程序使用,把类别名相同的段放在连续的存储区间 (一般有STACK、CODE、DATA)。,4.2汇编语言源程序的结构,段寻址 格式: ASSUME 段寄存器:段名,段寄存器:段名, 例如, CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA ;DATA段值送AX MOV DS,AX ;AX内容送DS,DS才有实际段值 CODE ENDS,4.2汇编语言源程序的结构,四、汇编程序结束伪指令END 一般格式: END 表达式 其中表达式表示该汇编程序的启动地址。 例如: END START ;表明该程序的启动地址为START。,4.2汇编语言源程序的结构,stacks segment stack stack dw 100h dup(?) stacks ends data segment ; Contains all variables for the program msg db Hello World!,0Ah,0Dh,$ data ends,4.2汇编语言源程序的结构,code segment ; Contains all code assume cs:code, ds:data, ss:stacks org 100h main proc mov ax, data mov ds, ax mov ax, 0900h mov dx, offset msg int 21h mov ax, 4C00h ; terminate the program normally int 21h main endp code ends end main,4.3.1符号定义语句,1. 等值语句EQU 给符号定义一个值或别的符号名,或一条可执行的指令。 例:NEW_PORT EQU 32 COUNT EQU CX CBD EQU AAD 一个符号一经EQU赋值后,不能重新再定义。 2. 等号(Equal Sign) 语句 与EQU类似,使用它能对符号进行再定义。 例:B1 = 6 ; B1定义为6 B1 = 10 ;B1重新定义为10,4.3.2数据定义伪指令,格式1: 变量名 伪指令名 表达式1,表达式2, 这里伪指令可为DB, DW, DD, 表达式有以下几种情况: 数值表达式 例: DA_BYTE DB 50H , 50 , 0caH DA_WORD DW 0a3f1H , 498dH A1 DD 12345H ; Memory: 45H,23H,01H,00H ? 表达式,不带引号的?表示可预置任何内容 例: DA_B DB ? , ? ;要求分配两个字节单元 DA_W DW ? , ? ;要求分配两个字单元 字符串表达式 数据项可以写成字符串形式,但只能用DB、DW、DD定 义,而且DW、DD语句定义的串只允许包含两个字符。,例: S1 DB ABCDEF S2 DW AB, CD, EF S3 DD AB, CD 这几个变量在存储器中存放情况如下: S1 41H S2 42H S3 42H 42H 41H 41H 43H 44H 00H 44H 43H 00H 45H 46H 44H 46H 45H 43H 00H 00H,注意:定义多于两个以上字符的字符串时,只能使 用DB伪指令,不能使用DW和DD等伪指令。,4.3.2数据定义伪指令,格式2:变量名 伪指令名 表达式 DUP(表达式) 用于定义重复的数据或分配一数据块空间 例:D_B1 DB 20H DUP(?) ;保留20H个字节 D_B2 DB 10H DUP(ABCD);字符串ABCD 重复10H次 D_W1 DW 10H DUP(4) ;字4重复10H次,4.3.3 过程定义的伪指令PROC和ENDP 一个过程由伪指令PROC和ENDP来定义,其格式为: 过程名 PROC 类型 过程体 RET 过程名 ENDP 其中,过程名是为过程所起的名称,不能省略, 类型由FAR(远过程,为段间调用)和NEAR(近过程,在本段内调用)来确定,如果缺省类型,则该过程就默认为近过程。 ENDP表示过程结束。过程体内至少应有一条RET指令,以便返回被调用处。 过程可以嵌套,也可以递归使用。,4.3.4 ORG 伪指令 ORG伪指令规定了在某一段内,程序或数据代码存放的起始偏移地址。 一般格式: ORG 例如:DATA SEGMENT ORG 2000H BUFF DB STRING DATA ENDS 上述变量定义中,BUFF从DATA段偏移为2000H的单元开始存放。,4.4 常量、变量和标号 (1) 常量 二进制: 10111001B 十进制: 1234D或1234 八进制: 255Q或255O 十六进制: 3A5DH, 第一位为字母时前面加数字0 字符串常数:用单引号括起来的一个或多个字符组成一个 字符串常数,例如:The 在内存中以字符的 ASCII码值存放,注意一个空格也是一个字符。 如The ,在内存中是: 54H、68H、65H和20H。,(2)变量: 代表存放在某些存储单元的数据。这些数据在程序运行期间随时可以修改。变量有三个属性:段属性、偏移属性和类型属性(所具有的字节数)。 (3) 标号 标号是一条指令的目标代码的符号地址,它常用作转移指令(或子程序调用指令)的操作数。标号有三个属性:段属性、偏移属性和类型属性。段属性是该标号的段地址,偏移属性是该标号的偏移地址,类型属性是表示该标号的范围是本段(NEAR)或段间(FAR),或称为近或远属性。,4.5 汇编语言的表达式和运算符,表达式: 由常数、操作数、操作符和运算符组成。 有六种运算符: 算术运算符、逻辑运算符和关系运算符、分析运算 符、综合运算符和分离运算符。 1、算术运算符 +、*、/、MOD(取余)、SHL(左移)、SHR(右移) 例: 32 MOD 5 ;结果为2 21H SHL 2 ;结果为84H 2、逻辑运算符(按位操作) AND(与) 24H AND 0FH = 04H OR (或) 24H OR 0FH = 2FH XOR (异或) 24H XOR 0FH = 2BH NOT (非) NOT 24H = 0DBH,4.5 汇编语言的表达式和运算符,3、关系运算符 关系运算是逻辑判定,当为真时结果为全1(0FFFFH),为假时结果为全0。 EQ (等于) ;若PP=25,则25 EQ PP = 0FFFFH NE (不等于) ;25 NE PP = 0 LT (小于) ;25 LT 26 = 0FFFFH LE (小于等于) ;25 LE PP = 0FFFFH GT (大于) ;26 GT PP = 0FFFFH GE (大于等于) ;24 GE PP = 0 关系运算符一般不单独使用,常与其它运算符结合使用。 例如: ADD AX, (port GT 60) AND 50) OR (port LE 60) AND 70) 当port 的值大于60时,上述指令汇编为 ADD AX, 50 当port 的值小于或等于60时,上述指令汇编为 ADD AX, 70,4、分析运算符 把存储器地址操作数分解成它的组成部分: SEG (求段地址), 格式: SEG 符号名 OFFSET(求偏移地址), 格式 : OFFSET 符号名 TYPE (求符号名类型值),格式:TYPE 符号名 SIZE ,求为符号名分配的字节数 格式: SIZE 符号名 回送分配给该符号名的字节数,但此值是LENGTH的值 和TYPE的值的乘积。,4.5 汇编语言的表达式和运算符,LENGTH,求为符号名分配的项数。 格式: LENGTH 符号名 这里为符号名定义的数据项必须是用 重复格式DUP( ) 定义的。而对于其他情况则回送1。 例 :K2 DW 10 DUP (?) 则 LENGTH K2 = 10 TYPE K2 = 2 SIZE K2 = 20 例:AARR DW 2,4,6 则 LENGTH AARR = 1, TYPE AARR = 2 SIZE AARR = 2 可以看出: SIZE = ( LENGTH ) * ( TYPE 符号名),4.5 汇编语言的表达式和运算符,4.5 汇编语言的表达式和运算符,5、综合运算符 (1) 定义符号名为新类型 格式: 类型 PTR 符号名 PTR的功能归纳如下: 保证运算时操作数类型的匹配 例: F1 DB 16H,38H F2 DW 1234H,26ABH MOV AX,WORD PTR F1 ;AX=3816H MOV BL,BYTE PTR F2 ;BL=34H,4.5 汇编语言的表达式和运算符, 通过PTR指明是字单元还是字节单元 例: MOV BYTE PTR BX,10H;BX为字节单元 MOV WORD PTR SI,20H;SI为字单元 用PTR来改变距离属性 例: JMP FAR PTR LLOOP ;段间转移 CALL DWORD PTR BX ;远程调用 (2)指定新类型 格式: 符号名 EQU THIS 类型 例: LABC EQU THIS BYTE ;LABC是字节类型 LABD DW 4321H, 2255H;LABD是字类型 MOV AL , LABC ;AL = 21H MOV AX , LABD ;AX = 4321H,4.5 汇编语言的表达式和运算符,(3) 分离运算符 取低字节 格式:LOW 符号名 取高字节 格式:HIGH 符号名 例:设SSY=2050H mov al , LOW 3080H ; al = 80H mov ah , HIGH SSY ; ah = 20H mov cl , LOW 3a4bH ; cl = 4bH (4)$运算符,返回地址计数器的当前值 例:ARRAY DW 1,2,$+4, 3,4, $+4 如果在汇编时,ARRAY的偏移地址是 0074H,则 在ARRAY数组中,两个$+4得到的结果是不同的, 这是由于$的值是在不断变化的,4.5 汇编语言的表达式和运算符,$运算符用在伪操作的参数字段时,和用在指令中的情况是不同的,用在伪操作中它表示的是地址计数器的当前值。用在指令中它只表示该指令的首地址,而与$本身所在的字节无关。 例如指令 JNE $+6, 表示满足条件时转移到该指令 的首地址加6以后所在的单元。 1000:2543 JNE $+6 则转移地址是2549H 例:下面的数据段定义,COUNT 表示什么? DATA SEGMENT BUF DB 0123456789ABCD COUNT EQU $ - BUF DATA ENDS 这里,COUNT的值就是数据区的长度,所以COUNT=14,4.5 汇编语言的表达式和运算符,(5)段超越运算符 格式:段寄存器加冒号 强迫当前指令的操作数的寻址不按约定的段进行,而由段超越运算符指定的段寻址 例:MOV AX, ES:BX ;强迫操作数来自ES段 (6) SHORT运算符 通知汇编器,转移目标在+127 - -128之间 例:JMP SHORT F1,问题:,例: FAR DB 23H, 45H AAA:MOV AX,FAR 例: MOV BX,OFFSET VAR1 MOV BX,7,常量和变量的名字及标号 不能用宏汇编的保留字,此程序段汇编时会出现 “操作类型不明确“错误需要修改为: MOV BYTE PTR BX,7 ;字节操作 或 MOV WORD PTR BX,7 ;字操作,4.6基本结构程序设计,程序设计步骤 1、分析问题 2、确定算法 3、画流程图,简单程序也可以不画流程图, 直接编程。 4、内存空间分配 5、编写程序 6、静态检查 7、上机调试,4.6基本结构程序设计,1、顺序结构 顺序结构程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP内容自动增加的顺序进行。 例:用数据运算指令对两个16位数做加法,这两个数从地址10050H开始连续存放,结果放在这两个数之后。 分析题目: 16位数相加,用加法指 令,本题可以不考虑进位问题。 确定算法: 8086加法指令可以做字操 作,可以用不带进位的加法指 令;若用带进位加法指令,事 前先清除进位。 画流程图: 见右.,开始 初始化 被加数送AX 被加数+加数送AX AX送(10054H)和(10055H) 结束,4.6基本结构程序设计,内存空间分配: 内存地址 内容 10050H 被加数低8位 10051H 被加数高8位 10052H 加数低8位 10053H 加数高8位 10054H 和数低8位 10055H 和数低8位,编写程序: mov ax, 1000h;初始化 mov ds, ax mov si, 50h mov di, 52h mov bx, 54h clc ;清除进位 mov ax, si adc ax, di;带进位加法 mov bx, ax hlt,4.6基本结构程序设计,2、分支结构 分支程序的基本思想是根据逻辑判断的结果来形成程序的分支,如图,若A成立,则执行P1;否则执行P2。,例:符号函数 1 当X0 Y = 0 当X=0 -1 当X0,4.6基本结构程序设计,DATA SEGMENT XX DW 12 ;X存储单元 YY DW ? ;Y存储单元 DATA ENDS STACK SEGMENT STACK STACK DB 100H DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START: PUSH DS XOR AX, AX PUSH AX MOV AX,DATA MOV DS,AX MOV AX, XX ; AX XX,4.6基本结构程序设计,CMP AX,0 ;X与0比较 JGE BIGPR ;X0,转BIGPR MOV YY,0FFFF ;X0,(YY) -1 JMP EXIT ;退出 BIGPR: JE EQUPR ;X=0,转EQUPR MOV YY,1 ;X0,(YY) 1 JMP EXIT EQUPR: MOV YY,0 ;X=0,(YY) 0 EXIT: MOV AX,YY ;将结果送AX RET ; MOV AX,4C00H ; INT 21H CODE ENDS END START,例:比较两个无符号数的大小,把大数存入MAX单元 解:比较两个无符号数,可采用CF标志位来判断大小,程序如下: DATA SEGMENT SOURCE DB X1,X2 ;两个无符号数X1和X2 MAX DB ? ;保留存放大数的单元 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MOV AX,DATA MOV DS,AX MOV AL,SOURCE ;X1送AL CMP AL,SOURCE+1 ;X1-X2 JNC BRANCH ;若X1X2,转BRANCH MOV AL, SOURCE+1 ;否则,X2送AL BRANCH: MOV MAX,AL ;大数送MAX单元 MOV AX,4C00H INT 21H CODE ENDS END,例:将内存中的(源)数据块传送到另一区域去。 DATA SEGMENT STR DB 1000 DUP (?) STR1 EQU STR+7 STR1 EQU STR+25 STRCOUNT EQU 50 DATA ENDS STACK SEGMENT STACK STACK STAPN DB 100 DUP (?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA, ES:DATA, SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX,MOV CX, STRCOUNT MOV SI, STR1 MOV DI, STR2 CLD PUSH SI ADD SI, STRCOUNT-1 CMP SI,DI POP SI JB OK STD ADD SI, STRCOUNT-1 ADD DI, STRCOUNT-1 OK: REP MOVSB MOV AX, 4C00H INT 21H CODE ENDS END START,4.6基本结构程序设计,3、循环结构 循环程序是经常遇到的程序结构,一个循环结构通常由以下几个部分组成: 循环初始化部分。一般要进行地址指针、循环次数及某标志的设置,相关寄存器的清零等操作。只有正确地进行了初始化设置, 循环程序才能正确运行,及时停止。 循环体。是要求重复执行的程序段部分,对应于要求重复执行的操作。 循环控制部分。由该部分修改并判断控制循环的条件是否满足。以决定是否继续循环。 循环结束部分。如保存循环运行结果等。,4.6基本结构程序设计,DO - WHILE,DO - UNTIL,例:用循环结构编写程序完成: DATA SEGMENT BUFFER DW a1,a2,a10 ;原始10个数据 SUM DW ? ;存放和数 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,0 ;AX中为和数,初始为0 MOV DI,OFFSET SUM ;存放结果地址送DI MOV BX,OFFSET BUFFER ;数据缓冲区首地址送BX,4.6基本结构程序设计,4.6基本结构程序设计,MOV CX,10 ;循环次数送CX LOP: ADD AX,BX ;累加 INC BX ;修改数据缓冲区地址 INC BX DEC CX ;次数减1 JNZ LOP ;到10次了吗?不到,转LOP MOV DI,AX ;到10次,存放结果和 MOV AX,4C00H ;返回DOS INT 21H CODE ENDS END START,4.6基本结构程序设计,例:给定一串16位数,找出大于零、等于零和小于零的个数,并紧跟着原串存放。 分析:这是一个统计问题,须设定三个计数器分别统计三种情况下的结果。程序如下: DATA SEGMENT BUFF DW X1,X2,X3,Xn COUNT EQU $ - BUFF ;此时,COUNT的值为BUFF所占的字节数 PLUSE DB ? ZERO DB ? MINUS DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA, ES:DATA BEGIN:MOV AX,DATA MOV DS,AX MOV CX,COUNT SHR CX,1 ;相当于除2,正好为BUFF中的数据个数,MOV DX,0 ;设定计数器初值 MOV AH,0 ;设定计数器初值 LEA BX,BUFF AGAIN: CMP WORD PTR BX,0 JAE PLU ;大于等于0,则转PIU INC AH ;0,则统计 JMP NEXT ZER: INC DH ;0,则统计 NEXT: INC BX INC BX LOOP AGAIN MOV PLUS,DL MOV ZERO,DH MOV MINUS,AH MOV AX,4C00H INT 21H CODE ENDS END BEGIN,4.6基本结构程序设计,4、子程序 对于一个子程序,应该注意它的入口参数和出口参数。入口参数是由主程序传给子程序的参数,而出口参数是子程序运算完传给主程序的结果。另外,子程序所使用的寄存器和存储单元往往需要保护,以免影响返回后主程序的运行。 参数传递一般有三种方法实现。 (1) 利用寄存器。这是一种最常见方法,把所需传递的参数直 接放在主程序的寄存器中传递给子程序。 (2) 利用存储单元。这种参数传递方法,把所需传递的参数直 接放在一个数据区中。 (3) 利用堆栈。这种方法将参数压入堆栈,在子程序运行时从 堆栈中取参数。,4.6基本结构程序设计,例:两个6字节数相加。 分析:将一个字节相加的程序段设计为子程序。主程序分6次 调用该子程序,但每次调用的参数不同。 DATA SEGMENT ADD1 DB FEH,86H,7CH,35H,68H,77H ADD2 DB 45H,BCH,7DH,6AH,87H,90H SUM DB 6 DUP(0) COUNT DB 6 DATA ENDS STACK SEGMENT DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,4.6基本结构程序设计,MADD: MOV AX,DATA MOV DS,AX MOV SI,OFFSET ADD1 MOV DI,OFFSET ADD2 MOV BX,OFFSET SUM MOV CX,COUNT ;循环初值为6 CLC AGAIN: CALL SUBADD ;调用子程序 LOOP AGAIN ;循环调用6次 MOV AX,4C00H INT 21H,4.6基本结构程序设计,;子程序入口参数:SI,DI,BX。 出口参数:SI,DI,BX SUBADD PROC ;完成一个字节相加 MOV AL,SI ;SI是一个源操作数指针 ADC AL,DI ;DI是另一个操作数指针 MOV BX,AL ;BX是结果操作数指针 INC SI INC DI INC BX RET SUBADD ENDP CODE ENDS END MADD,例:将内存中的一串1位十六进制数转换为其对应的ASCII码。 DATA SEGMENT HEXBUF DB 02H, 08H, 0AH, 09H, 0FH COUNT EQU $- HEXBUF DATA ENDS STACK SEGMENT stack stack DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,;子程序HEXD ,将AL中的BCD码转换成ASCII码 HEXD PROC NEAR CMP AL,0AH JL ADDZ ;大写字母转换成ASCII码 ADD AL,A-0-0AH ADDZ: ADD AL,0 RET HEXD ENDP CODE ENDS END BEGIN,;主程序 BEGIN: MOV AX,DATA MOV DS,AX MOV BX,OFFSET HEXBUF MOV CX, COUNT REPEATO: MOV AL, BX CALL BEXD ;调用子程序,实现转换 MOV BX, AL INC BX LOOP REPEATO MOV AX,4C00H INT 21H CODE ENDS END BEGIN,例:把内存中两个字单元的值分别转换为4个ASCII码表示的十六进制数码串,串的起始地址分别为STRING1及STRING2 。 DATA SEGMENT ORG 100H NUMBER DW 25AFH , 33FBH STRING1 DB 4 DUP (?) STRING2 DB 4 DUP (?) DATA ENDS STACK SEGMENT stack stack DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA, SS:STACK BEGIN: MOV AX,DATA MOV DS,AX MOV ES,AX ;第一个子单元的转换 LEA BX,STRING1 PUSH BX ;将参数(结果地址指针)压入堆栈 PUSH NUMBER ;将源数据压入堆栈 CALL BINHEX ;调用子程序,;第二个子单元的转换 LEA BX,STRING2 PUSH BX ;将参数(结果地址指针)压入堆栈 PUSH NUMBER ;将源数据压入堆栈 CALL BINHEX ;调用子程序 MOV AX,4C00H INT 21H BINHEX PROC PUSH BP MOV BP,SP PUSH AX PUSH DI PUSH CX PUSH DX PUSHF ;以上为保护现场 MOV AX,BP+4 ;取出NUMBER MOV DI,BP+6 ;取出STRING的偏移地址 ADD DI,LENGTH STRING-1 ;使DI指向转换数据 MOV DX,AX ;保护原始数据 MOV CX,4,AGAIN:AND AX,0FH ;取低4位 CALL HEXD ;调子程序 STD STOSB ;保护转换数据 PUSH CX ;保护CX的值 MOV CL,4 SHR DX,CL MOV AX,DX POP CX LOOP AGAIN POPF POP DX POP CX POP DI POP AX POP BP RET 4 BINHEX ENDP,;将AL中的BCD码转换成ASCII码 HEXD PROC CMP AL,0AH JL ADDZ ;大写字母转换成ASCII码 ADD AL,A-0-0AH ADDZ: ADD AL,0 RET HEXD ENDP CODE ENDS END BEGIN,4.6基本结构程序设计,4.6基本结构程序设计,例:数的阶乘 1, n=0 按照阶乘的定义 n!= n*(n-1)!, n0 这是一个递归定义式,可采用子程序的的递归调用形式。,;计算N!结果在result中 Data segment N dw 5 Result dw ? Data ends,4.6基本结构程序设计,Stack_seg segment stack stack db 100 dup(?) Stack_seg ends Code segment assume cs:code, ds:data, ss:stack_seg Start: mov ax, data mov ds, ax ;主程序部分 mov bx, N push bx ;保存N call fact ;调用求N!子程序 pop result ;结果在result中 mov ax, 4c00H INT 21H,4.6基本结构程序设计,;子程序,求N! fact proc near push ax push bp mov bp, sp mov ax, bp+6;取N cmp ax, 0,4.6基本结构程序设计,jne fact1 ;ax不等于零,转fact1 inc ax ;ax=0, 0!=1 jmp exit fact1: dec ax ;ax=N-1 push ax call fact ;递归调用 pop ax ; ax = (N-1)! mul word ptr bp+6 ; (N-1)! * N exit: mov bp+6, ax pop bp pop ax ret fact endp code ends end start,4.7 DOS功能调用,DOS功能调用通常按照如下4个步骤进行: 功能号送AH 入口参数送指定寄存器名 INT 21H 根据出口参数分析功能调用执行情况,4.7 DOS功能调用,1. 单个字符输入(2号功能调用) 功能号:AH01H 出口参数:AL所输入字符的ASCII码 功能:等待从标准输入设备输入一个字符并送入寄存器AL ;等待用户键盘输入, AL键入字符的ASCII码,并显示 MOV AH,1 INT 21H,4.7 DOS功能调用,2. 从键盘输入一个字符串(10号功能调用) 功能号:AH0AH 入口参数:DS:DX缓冲区首地址 执行该功能调用时,用户按键,最后用回车确认 缓冲区的定义: 第1字节事先填入最多欲接收的字符个数(包括回车 字符,可以是1255) 第2字节将存放实际输入的字符个数(不包括回车符) 第3字节开始将存放输入的字符串,4.7 DOS功能调用,例: Buffer db 81 ;定义缓冲区 ;第1个字节填入可能输入的最大字符数 db 0 ;存放实际输入的字符数 db 81 dup(0) ;存放输入的字符串 . mov dx,seg buffer ;伪指令seg取得buffer的段地址 mov ds,dx ;设置数据段DS mov dx,offset buffer mov ah,0ah int 21h,4.7 DOS功能调用,3. 向显示器输出一个字符(2号功能调用) 功能号:AH02H 入口参数:DL字符的ASCII码 功能:在显示器当前光标位置显示给定的字符,光标右移一个字符位置。如按Ctrl-Break或Ctrl-C则退出 ;在当前显示器光标位置显示一个问号 mov ah,02h ;设置功能号:ah02h mov dl,? ;提供入口参数:dl? int 21h ;DOS功能调用:显示,4.7 DOS功能调用,4. 显示字符串(9号功能调用) 功能号:AH09H 入口参数: DS:DX欲显示字符串在主存中的首地址 字符串应以$(24H)结束 功能:在显示器输出指定的字符串 string db Hello,Everybody !,0dh,0ah,$ mov ah,09h mov dx, seg string mov ds, dx mov dx, offset string int 21h,4. 文件管理系统调用: AH(功能号)功能 入口参数 出口参数 3C 建立文件 DS:DX=ASCII串地址 成功 AX= 文件代号 CX=文件属性 失败 AX=错误码 3D 打开文件 DS:DX=ASCII串地址 成功 AX= 文件代号 AL=0读,=1写,=2读写 失败 AX=错误码 3E 关闭文件 BX=文件代号 失败 AX=错误码 3F 读文件或设备 DS:DX=数据缓冲区地址 成功AX=实际读入字数 BX=文件代号 AX=0已到文件尾 CX=读取字节数 读错误:AX=错误码 40 写文件或设备 DS:DX=数据缓冲区地址 成功AX=实际写入字数 BX=文件代号 CX=写入字节数 写错误:AX=错误码 41 删除文件 DS:DX=ASCII串地址 成功 AX=00 错误AX=错误码,4.7 DOS功能调用,例:写数据文件,步骤:输入文件名,建立文件,写文 件,关闭文件。 Data segment ;数据段 mesgn db 16 dup(?) ;文件名字符区 datareg db 2048dup(?) ;数据区 Data ends Code segment ;代码段 lea si, mesgn ;文件名字符区的偏移地址 Rep1: mov ah, 1 ;键入文件名 int 21h cmp al , 0dh ;判断是否是回车键 je next1 ;是,转next1;否继续输入,4.7 DOS功能调用,4.7 DOS功能调用,mov si, al ;文件名字符送入 inc si jmp rep1 Next1: lea dx, mesgn ;文件名区的偏移地址 mov cx, 0 ;文件属性为0 mov ah, 3ch ;建立文件 int 21h mov bx, ax ;文件代号送bx lea dx, datareg mov cx, 2048 ;写入的字节数 mov ah, 40h ;写文件 int 21h mov ah, 3eh ;关闭文件 int 21h Cseg ends end,例:读数据文件 Mseg segment ; 数据段 mesgn db 16dup(?) errmesg db “File not found $” datareg db 2048dup(?) Cseg segment ;代码段 lea si, mesgn beg: mov ah, 1 ;键入文件名 int 21h cmp al, 0dh je next1 mov si, al inc si jmp beg Next1:lea dx, mesgn mov al, 0 mov ah, 3dh ;打开文件,int 21h cmp al, 2;2为文件未找到 jne ready;不等于2,转 lea dx, errmesg mov ah, 9 ;显示字符串 int 21h crlf ;回车换行宏指令 jmp beg Ready: lea dx, datareg mov cx, 2048 mov bx, ax;ax中为文件代号 mov ah, 3fh ;读文件 int 21h mov ah, 3eh ;关闭文件 int 21h ,4.7 DOS功能调用,4. 程序结束,返回DOS INT 20H MOV AH,4CH INT 21H,4.8 宏汇编与条件汇编,宏指令: 要多次使用的程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,仍会产生源程序所需的代码。宏指令使用时要经过三个步骤: 宏定义、宏调用、宏展开 宏定义的一般格式为:宏指令名 MACRO 形式参量表 宏体 ENDM 宏调用的一般格式为:宏指令名 实际参量表 宏展开 :汇编时,汇编程序用已由实参数取代形式参数的宏体取代程序中的 宏指令 例如: SHIFT MACRO MOV CL,4 SAL AL,Cl ENDM 这样定义以后,凡是要使AL中内容左移4位的操作都可用一条宏指令SHIFT来代替。,4.8 宏汇编与条件汇编,例: SHIFT MACRO X,Y,Z MOV CL,X;宏体 S&Z Y, CL ENDM 在程序中引用:SHIFT 4,AL,HR MOV CL,4 SHR AL, CL SHIFT 6 , BX , AR MOV CL,6 SAR BX, CL 形式参数可出现在操作数部分, 也可以出现在操作码部分.,4.8 宏汇编与条件汇编,例: 用宏指令定义两个字操作数相乘,得到一个16位的 第三个操作数作为结果。 宏定义: MULTIPLY MACRO OPR1、OPR2、RESULT PUSH DX PUSH AX MOV AX,OPR1 IMUL OPR2 MOV RESULT,AX POP AX POP DX ENDM 宏调用: MULTIPLY CX,VAR,XYZ BX MULTIPLY 240,BX,SAVE,4.8 宏汇编与条件汇编,宏定义与子程序的区别 宏指令与子程序都可以简化源程序. 二者区别: 1、宏定义简化了源程序的书写,不减少目标码,宏汇编程序把它插入源程序中,不节省目标程序所占的内存单元。 子程序是由CPU执行时处理的,子程序多次调用,其目标代码并不多次出现,节省目标程序占的存储空间。 2、从执行时间上,子程序要保护、恢复现场、断点,所以时间要长一点,而宏指令不用。 当要代替的程序段不长时,速度是主要矛盾,通常用宏定义。而当要代替的程序段较长时,额外操作所附加的时间就不明显了,而节省空间是主要矛盾。通常用子程序。,4.8 宏汇编与条件汇编,注销宏定义语句PURGE伪指令 : PURGE可取消一个宏定义名。 格式:PURGE 宏指令名1,宏指令名2, 注:PURGE伪指令也可用于释放由EQU伪指令定义的变量,使这些变量可以被重新定义。 TIMES EQU 50 PURGE TIMES ; 释放TIMES变量 TIMES EQU 2 ; 重新定义,4.8 宏汇编与条件汇编,LOCAL伪操作: 格式:LOCAL 标号1,标号2, 汇编程序对LOCAL的参量建立一个符号(用?0000-?FFFFH),以代替在展开中存在的相同的符号。 例:宏定义: CHANGE MACRO LOCAL AD0 CMP AL,10 JL AD0 ADD AL,A-0-10 AD0: ADD AL,0 ENDM,在程序中引用: : CHANGE : CHANGE 展开为: : CMP AL,10 JL ?0000 ADD AL,A-0-10 ?0000:ADD AL,0 : CMP AL,10 JL ?0001 ADD AL,A-0-10 ?0001:ADD AL,0,4.8 宏汇编与条件汇编,重复定义伪指令 格式: REPT 表达式 指令序列 ENDM 这里表达式的值是指令序列的重复次数。 例: X=0 REPT 10 X=X+1 DB X ENDM 该例中定义了10个连续的字节单元,初始值分别为1到10,4.8 宏汇编与条件汇编,带立即数的重复定义伪指令 格式:IRP 形式参数, 指令序列 ENDM 例:IRP X , DB X ENDM 此例是把1到10分配给10个连续的字节单元。,4.8 宏汇编与条件汇编,带字符串的重复定义伪指令 格式:IRPC 形式参数,字符串/ 指令序列 ENDM,4.8 宏汇编与条件汇编,条件汇编 宏汇编提供了一组条件伪指令,其格式是: IF ; 表达式 ;语句序列1 ELSEIF ; 表达式 ; 语句序列2 ELSE ;语句序列3 ENDIF 当表达式条件为真时,汇编程序就汇编语句序列1;若 表达式条件为假时,汇编程序就汇编语句序列2。,4.8 宏汇编与条件汇编,具体的条件汇编伪指令如下: 1、IF 表达式 ;若表达式的值不为0,则条件为真。 2、IFE 表达式 ;若表达式的值为0,则条件为真。 3、IF1 ;若汇编程序处于对源程序的第一遍扫描过程中,则条件 为真。 4、IF2 ;若汇编程序处于对源程序的第二遍扫描过程中,则条件 为真。 5、IFDEF 符号 ;若指定的符号已被定义或已由EXTRN伪指令作外部说 明,则条件为真。 6、IFNDEF 符号 ;若指定的符号未被定义且没经EXTRN伪指令作外部说 明,则条件为真。 7、IFB 参数 ;若参数是空,则条件为真。 8、IFNB 参数 ;若参数不是空,则条件为真。 9、IFIDN 参数1,参数2 ;若两个参数是相同的串,则条件为真。 10、IFDIF 参数1,参数2 ;若两个参数是不同的串,则条件为真。,4.8 多模块程序设计,大型应用程序常分多个程序模块,分别进行程序设计。 程序模块的定义 NAME 语句 END 其中NAME语句可以省略,则该模块的源程序名(文件名)就是模块名;END后面的标号可省略,若是主模块,此标号是程序的启动地址。 PUBLIC和EXTRN,用这两条伪指令说明通信用的变量、标号、过程等。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!