《微机汇编》PPT课件.ppt

上传人:小飞机 文档编号:5508294 上传时间:2023-07-15 格式:PPT 页数:67 大小:327.99KB
返回 下载 相关 举报
《微机汇编》PPT课件.ppt_第1页
第1页 / 共67页
《微机汇编》PPT课件.ppt_第2页
第2页 / 共67页
《微机汇编》PPT课件.ppt_第3页
第3页 / 共67页
《微机汇编》PPT课件.ppt_第4页
第4页 / 共67页
《微机汇编》PPT课件.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《《微机汇编》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《微机汇编》PPT课件.ppt(67页珍藏版)》请在三一办公上搜索。

1、微机原理与接口技术,教案,第 3 章 汇编语言程序设计,第 3 章 汇编语言程序设计,3.1 8086/8088指令系统3.2 汇编语言程序3.3 汇编语言程序设计,3.1.1 8086/8088指令格式,8086/8088执行指令的语句格式:标号:操作符 操作数;注释操作符是操作码的助记符号表示,是指令的关键字,必不可少。标号是自定义的、非系统关键字的符号串。操作数是参与指令具体操作的操作对象,根据操作数的个数,有0(零)操作数指令、单操作数指令和双操作数(用逗号分割)指令。,操作数寻址方式,8086/8088操作数作为参与指令具体的操作对象,可以是操作数据,也可以是转移地址。寻址方式是指操

2、作对象存放的地方,可以是直接给出(立即数),也可以存放在寄存器,或内存储器,或输入/输出接口中。8086/8088寻址方式分为操作数据寻址方式和转移地址寻址方式两大类。操作数据寻址方式(7种):立即寻址、寄存器寻址、直接内存或I/O寻址、间接内存或I/O寻址方式等。转移地址寻址方式(4种):段内直接寻址、段内间接寻址、段间直接寻址、段间间接寻址方式。,立即方式:操作数据在指令中直接给出(立即数)。寄存器方式:操作数存放在指令给出的字节/字寄存器中。例如:MOV AX,0FC25H;AX0FC25HMOV AL,42H;AL42HMOV AH,11010011B;AH 11010011B(0D3

3、H)MOV CX,-25;AX-25MOV AL,1000;错误,超字节范围 MOV DS,2000H;错误,立即数不能直接给段RMOV AX,IP;错误,不得使用IPMOV AX,CS;正确,CS可读MOV CS,AX;错误,CS不可写,立即寻址和寄存器寻址,存储器寻址方式,内存逻辑地址的段基址值存放在段址寄存器:CS/SS/DS/ES内存逻辑地址的偏移地址(EA)寻址方式:直接方式:指令中直接给出EA 间接方式:EA=(寄存器)EA=(寄存器)+位移量 EA=(寄存器1)+(寄存器2)EA=(寄存器1)+(寄存器2)+位移量内存寻址使用的偏移址寄存器:BX,BP,SI,DI段址R和偏移址R

4、配对使用的隐含规定:代码(指令)指针CS:IP堆栈操作指针SS:SP,或 SS:BP源数据串指针DS:SI目的数据串指针ES:DI,存储器数据寻址方式例,MOV AX,1000H;(DS:1000H)的字数AXMOV 2000H,BX;BX(DS:2000H)MOV AX,BX;(DS:BX)的字数AXMOV AX,SS:SI;(SS:SI)的字数AXMOV AX,BX-100;(DS:(BX-100)的字数AXMOV BX+SI,AX;BX+SI 是内存间接寻址MOV AX,BX+DI+8;BX+DI+8 是内存间接寻址MOV AX,CX;错误,CX寄存器不能用于内存寻址MOV BX,SI;

5、错误,2个操作数不能都是内存寻址MOV AX,SI+DI;错误,SI和DI 不能配对做内存间接寻址,3.1.3 8086/8088指令系统,8086/8088 指令系统有133条指令,分为六大类:1.传送指令类:主要有MOV 传送,PUSH 压入,POP 弹出,XCHG 交换,LEA 取偏移 等。2.算术运算指令类:加、减、乘、除(整数)算术运算和BCD码调整五组指令。3.逻辑运算和移位指令类:逻辑运算指令组,移位指令组。4.控制转移指令类:有/无条件转移指令组(将在分支程序设计中介绍),LOOP指令组(将在循环程序设计中介绍),CALL/RET指令组(将在子程序设计中介绍)。5.串操作指令类

6、(略)6.处理机控制指令类,1.数据传送指令类,数据传送类指令一共有14条(表3.1)。这里主要介绍:MOV 传送 PUSH 压入堆栈POP 弹出堆栈 XCHG 交换LEA 取偏移 IN 输入端口“读”OUT 输出端口“写”数据传送类指令均不影响标志位。数据类型字节(byte)/字(word)。绝大多数是双操作数,两个操作数(字节/字)类型必须一致。寻址方式基本与MOV 指令的要求相同。,数据传送指令,传送指令 MOV格式:MOV dst,src操作:dst(src)双操作数寻址方式:dst(目的操作数)src(源操作数)reg(寄存器)reg|mem|data(立即数)|segregmem(

7、内存)reg|data|segregsegreg(段寄存器)reg|mem两个操作数类型(字节/字)要一致。目的操作数不能是立即数,两个操作数不能都是内存寻址方式。,堆栈操作指令,PUSH 和POP 是一对堆栈操作指令:堆栈是一个“先进后出”的内存数据存取区域。堆栈逻辑地址SS:SP。数据进入堆栈的操作为压入(PUSH),从堆栈取出数据的操作为弹出(POP)。堆栈操作是单操作数指令,只能是字类型数据。压入指令PUSH 格式:PUSH src操作:(SP)-2SP(src)(SP)操作数寻址:src=|mem|reg|segreg,弹出指令POP格式:POP dst操作:(SP)dst(SP)+

8、2SP操作数寻址:dst=mem|reg|segreg例如:PUSHAX;AX(SS:SP)PUSHBX;(DS:BX)(SS:SP)POPCX;(SS:SP)CXPUSHCL;错误,堆栈操作必须是字类型数据POP200;错误,立即数不能是堆栈操作数据,堆栈操作指令,交换指令XCHG格式:XCHG opr1,opr2操作:(opr1)(opr2)操作数寻址:opr1=regopr2=reg|mem注意:不可以直接把两个内存数据交换。例如:MOV AX,2000H;(DS:2000H)AXXCHG AX,BX;AX和(DS:BX)交换MOV 2000H,AX;AX(DS:2000H),数据交换指

9、令,查表换码指令XLAT格式:XLAT;无操作数操作:ALDS:(BX+AL);隐含操作数寻址注意:BX为表头的EA,AL是距离表头的位移量。表最大容量为256个字节。例如:MEMDB ABCDEFGHIJKLMNOPQRSTUVWXYZMOV BX,OFFSET MEM MOV AL,2XLAT;AL=43H(C的ASCII码值),查表换码指令,装偏移指令LEA格式:LEA dst,src操作:src的偏移址dst操作数寻址:dst=reg src=mem 例如:MEM DB ABCDEFGHIJKLMNOPQRSTUVWXYZLEA BX,MEM;BX取MEM数据表头的EA(等同于:MOV

10、 BX,OFFSET MEM)MOV AL,BX+2;AL=43H(C的ASCII码值),装偏移地址指令,输入/输出(I/O)指令,I/O接口指令的语句格式:IN AL,端口地址 OUT 端口地址,AL I/O接口指令的端口地址16位,地址范围为0000H FFFFH。若端口地址为 00H FFH(0255),可以直接给出;超出该范围的端口地址必须存放在DX寄存器,间接给出。例如:IN AL,80H;与 MOV AL,80H 的区别OUT 20H,AL;与 MOV 20H,AL 的区别MOV DX,100H;DX=100HOUT DX,AL;与 MOV DX,AX 的区别IN AL,80H;错

11、误,端口寻址不能用方括号,算术运算类指令一共有20条,分成加、减、乘、(整)除指令和BCD码调整指令五组。这里主要介绍加、减、乘、除14条指令(表3.2):ADD 加法ADC 进位加INC 加1 SUB 减法SBB借位减DEC 减1 CMP 比较NEG 求补MUL 无符号乘法 IMUL有符号乘法DIV 无符号除法IDIV 有符号除法CBW 字节符号扩展CWD字符号扩展算术运算类指令基本都均影响标志位(ZF、SF、CF、OF)。绝大多数是双操作数,操作数可为字节/字类型。寻址方式与MOV 指令基本相同。,2.算术运算指令类,加法指令ADD格式:ADD dst,src;(dst)+(src)dst

12、进位加指令ADC格式:ADC dst,src;(dst)+(src)+CF dst加1指令INC格式:INC dst;(dst)+1 dst操作数寻址方式:dstsrc regreg|mem|data memreg|data,加法运算指令,减法指令SUB格式:SUB dst,src;(dst)-(src)dst 借位减指令SBB格式:SBB dst,src;(dst)-(src)-CF dst减1指令DEC格式:DEC dst;(dst)-1dst操作数寻址方式:dstsrc regreg|mem|data memreg|data,减法运算指令,比较指令CMP格式:CMP dst,src操作:

13、(dst)-(src),仅根据计算结果设置相关标志位。求补指令 NEG格式:NEGdst操作:0-(dst)dst;求互补码例如,计算12345678H+80A7FD28H MOV DX,1234H MOV AX,5678H;DX|AX=12345678H ADD AX,0FD28H ADC DX,80A7H;DX|AX=92DC53A0H,减法运算指令,无符号乘法指令MUL有符号乘法指令IMUL格式:MUL srcIMUL src操作数寻址:src=reg|mem操作:有/无符号数的乘法字节乘法:(AL)(src)AX字乘法:(AX)(src)DX|AX(32位)标志位:ZF,SF无定义。乘

14、积的高阶部分如果非0,OF,CF均被置1。例如:无符号数字节乘法 0FFH1=00FFH 有符号数字节乘法 0FFH1=0FFFFH,乘法运算指令,无符号除法指令DIV有符号除法指令IDIV格式:DIVsrcIDIVsrc操作数寻址:src=reg|mem操作:有/无符号数的除法字节除法:(AX)/(src)AL(商),AH(余数)字除法:(DX|AX)/(src)AX(商),DX(余数)注意:1.除法可能有0作除数错误;商超出字节/字范围的溢出错误。2.有符号数除法的余数与被除数的符号相同。,除法运算指令,符号扩展指令CBW和CWD 格式:CBW;把有符号数AL扩展为AXCWD;把有符号数A

15、X扩展为DX|AX操作数:隐含寻址(AL/AX/DX)标志位:不改变。例如:MOVAL,07FHCBW;AX=007FHMOVAX,8003HCWD;AX=8003H,DX=0FFFFH,符号扩展指令,例如:MULAH;无符号数(AL)(AH)AX IMULAL;有符号数(AL)(AL)AXMULBX;无符号数(AX)(BX)DX|AX MUL word ptr BX;(AX)(BX)DX|AX例如:计算30200除以1500。MOVAX,30200;AX=30200 CWD;AX扩展为 DX|AXMOVBX,1500DIVBX;AX=20(商),DX=200(余数)例如,如果 AX=0010

16、H(+16),BL=0FDH(-3)IDIV BL;AX=01FBH,商=-5,余数=1,乘/除法指令应用例,3.逻辑运算和移位指令,逻辑运算和移位类指令是以2#数位为单位的“位操作”指令,逻辑运算指令5条,移位指令8条(表3.3)。NOT 逻辑非AND 逻辑与OR 逻辑或XOR 逻辑异或TEST 位测试SHL 逻辑左移ROL 循环左移 SHR 逻辑右移ROR 循环右移SAL 算术左移RCL 带进位循环左移SAR 算术右移RCR 带进位循环右移操作数可为字节/字类型,按位进行逻辑运算。多数情况不改变标志位。,逻辑运算指令,逻辑非指令NOT格式:NOTdst;求(dst)的互反码逻辑与指令 AN

17、D逻辑或指令 OR逻辑异或指令XOR格式:ANDdst,src 操作:(dst)(src)dst ORdst,src(dst)(src)dstXORdst,src(dst)(src)dst测试指令TEST格式:TEST dst,src操作:(dst)(src);不保存结果,仅设置标志位,移位指令,逻辑左移 SHL逻辑右移 SHR算术左移 SAL算术右移 SAR循环左移 ROL循环右移 ROR带进位循环左移 RCL带进位循环右移 RCR格式:dst,cnt操作数寻址:dst是移位的对象,dst=reg|memcnt是移位的位数,cnt=1|CL标志位:ZF 和SF,指明移位结果的设置。CF:左移

18、取自dst最高位,右移取自dst 的D0位。,逻辑运算和移位指令应用例,AND AL,50H;AL=(AL)50HOR AX,8080H;AX=(AX)(DS:8080H)XOR AX,AX;AX=0,CF=0AND AL,0FH;AL高4位清0,低4位保留OR AL,0FH;AL高4位保留,低4位置1XOR AL,0FH;AL高4位保留,低4位取反,;AX乘以10SAL AX,1MOVBX,AXSALAX,1SALAX,1ADDAX,BX,6.处理器控制指令,标志位设置指令:CLCCF=0STCCF=1CMCCF取反CLDDF=0 STDDF=1CLIIF=0 STI IF=1CPU控制指令

19、:NOP无操作(空操作)HLT停机(暂停,等待外部中断,中断后恢复运行)WAIT等待(等待测试信号TEST,恢复运行),汇编语言程序的语句,汇编语言源程序由三类指令语句组成:(符号)执行指令语句提供给汇编程序“翻译”成机器能直接执行的指令。汇编指示性语句(伪指令)提供给汇编程序指示汇编操作的指令。宏指令语句提供给汇编程序的扩展的“功能宏大”的指令。,3.2.1 8086/8088汇编语句,8086/8088汇编语句格式:名字:操作符 操作数;注释操作符是操作码的助记符号表示,是执行指令、伪指令和宏指令的操作功能符(关键字)。名字是自定义的、非系统关键字的符号串。根据操作数的个数,有0(零)操作

20、数指令、单操作数指令和双操作数(用逗号分割)指令。注释项是开始于“;”,提供阅读的文字信息。注意:各项之间用空格键符,或TAB键符分界。操作码项必有,其它项可选择有/无。汇编语言程序不区别大小写英文。,名字项,名字项是自定义的一个符号串,可以是标号名(必须结束于“:”)、符号常数名、变量名、段名、过程名。名字项的合法字符:英文字母AZ/az,数字09,特殊字符 _?等。注意:数字不能是第1个字符,句点只能做第1个字符。在执行指令语句的操作数项中:符号常数作为立即数使用。标号名、过程名作为转移地址使用。变量名作为存储单元的偏移址,可以直接寻址使用。段名作为段基址(立即数)使用。,汇编表达式,操作

21、数项是0个或1个或多个(用逗号分隔)的指令操作的对象,用规定的汇编表达式描述。汇编表达式是由(整数)常数、寄存器、标号、变量等,和一些运算符,或操作符组成的表达式。汇编表达式能被汇编程序解释,并计算出数值/地址结果,所以分为数值表达式和地址表达式两种。数值表达式:由常数、数值运算符组成的表达式,计算结果为字节/字数据。地址表达式:包含地址(标号、变量和过程名都是地址)、常数,以及地址运算/操作符的表达式,计算结果为内存地址值。,常数和数值运算符,数字常数(立即数):2/10/16进制数、ASCII字符(用引号括起来)符号常数给常数起的名字数值运算符(运算对象和结果是整数常数):算术运算符:+、

22、*、/、MOD逻辑运算符:NOT、AND、OR、XOR 关系运算符:EQ、NE、GT、GE、LT、LE(真值为全1,假值为全0),地址运算/操作符,地址的属性:段基址 偏移址 类型(BYTE、WORD、DWORD、NEAR,FAR)地址运算/操作符:地址运算符:+、;取偏移址的相对位移量分析操作符:取地址类型值 TYPE;类型值有1/2/4/-1/-2 取段基址值 SEG 取偏移址值 OFFSET 合成操作符:PTR;确定寻址的类型:;换段指示前缀SHORT;确定为“短”转移地址,地址表达式应用例,类型指示符 PTR应用格式:PTR 例如,INC WORD PTR BX;内存数据为字类型INC

23、 BYTE PTR BX;内存数据为字节类型CALL FAR PTR sub1;段间调用子程序 sub1CALL NEAR PTR sub2;段内调用子程序 sub2,换段指示符应用格式::例如,MOV AX,SS:SI+2 SUB AX,ES:BXMOV ES:BX,AX,MEM DB 10H,20H,30H,40HMOVAX,SEG MEM;AX取MEM段址MOV DS,AXMOV BX,OFFSET MEM;BX取 MEM偏移址MOV AL,BX+2;AL=30HMOVAX,WORD PTR MEM;AX=2010H MOV AL,TYPE MEM;AL=1,3.2.3 汇编指示语句(伪

24、指令),常用的汇编指示语句(伪指令)分成五组:符号定义、内存数据定义、段定义、过程定义、模块定义常用的伪指令语句:EQU 和=(符号定义/赋值)DB/DW/DD(存储单元类型和存储数据定义)SEGMENT 和 ENDS(段定义)ORG(段内偏移址指针$设置)PROC 和 ENDP(过程子程序定义)NAME 和 END(模块定义和源程序结束),符号定义伪指令,等值伪指令EQU格式:EQU 等号伪指令(=)格式:=与EQU不同:=只能是合法的汇编表达式;=的符号名可以重复定义。例如:count EQU 19;count=19b=20b=b+10;b重新定义,b=30d=(count+4)*2;d=

25、46fnum EQU 123456H;正确,“123456H”为符号对象gnum=123456H;错误,123456H超过16位2#的数值范围,数据定义伪指令,内存数据定义伪指令DB、DW 和 DD 格式:DB/DW/DD 功能:定义内存变量和类型,分配和初始化内存单元数据。,内存数据定义的数据表,为顺序存放在内存单元的数据,多个数据之间用“,”分隔。数值表达式:DBDWDD地址表达式:DWDD ASCII码字符串:DB?(分配空单元,不放数据)DUP(数据重复定义,可嵌套使用)DUP(),内存数据定义例,DA1DBDATA SEGMENTDA2EQU$-DA1;DA2=12DA3DB6DH,

26、62,15H,28DA4DB10 dup(0,5 dup(1,2),0)DA5DB12345DA6DW 7,9,298,1967DA7=DA6 DA4;DA7=125DA8=$DA4;DA8=133,段定义伪指令,段定义伪指令SEGMENT格式:SEGMENT 段结束伪指令ENDS格式:ENDS SEGMENT语句与对应的ENDS语句的段名必须一致。段基址说明伪指令 ASSUME 格式:ASSUME:,.段寄存器可以是CS/DS/ES/SS,段名是已定义的。偏移址指针设置伪指令 ORG格式:ORG 数值是065535偏移址,偏移址指针用“$”表示。,程序模块定义伪指令,程序模块开始伪指令NAM

27、E格式:NAME(源程序模块开始NAME伪指令可以省略不用。)程序模块结束伪指令END格式:END,程序的代码段结构:SEGMENT;段开始 ASSUME ENDS;此段结束 程序的数据段结构:SEGMENT;段开始 ENDS;此段结束,汇编程序的段结构,汇编语言程序结构例,data SEGMENT xdb?y dw?zdd?data ENDSstack SEGMENT dw 100 dup(?)topequ$stack ENDS,code SEGMENTASSUME CS:code,DS:data,SS:stackSTART:MOV AX,data MOV DS,AX;设置DS MOV AX

28、,4C00H;返回DOSINT 21Hcode ENDS END START,汇编语言程序设计,结构化汇编语言程序设计:结构化程序设计是为了使编制的程序结构清晰、易于理解、易于调试和修改,充分显示出程序模块化的优点。汇编程序的基本结构:顺序结构、选择结构(分支结构)和循环结构是汇编程序的三种基本结构。它们是单入口、单出口的程序结构。这三种结构的任意组合和嵌套就构成了结构化程序设计。子程序设计:子程序设计是程序设计的重要技术之一。,3.3.1 顺序结构程序设计,【例3.1】计算S=(8000-(X*Y+Z)/X,其中X,Y,Z,S均是有符号数字变量。;定义内存字变量x,y,z,s:DATASEG

29、MENT X DW600 Y DW25 Z DW-2000 S DW?,?;存放商和余数DATAENDS,;计算S表达式程序段:MOV AX,XIMUL Y;DX|AX=X*YMOV BX,AXMOV CX,DX;CX|BX=X*YMOV AX,ZCWD;Z扩展成双字DX|AXADD BX,AXADC CX,DX;CX|BX=X*Y+ZMOV AX,8000CWD;8000扩展成双字DX|AXSUB AX,BXSBB DX,CX;DX|AX=8000-(X*Y+Z)IDIV X;(8000-(X*Y+Z)/X MOV S,AX;商(AX)存放到S单元MOV S+2,DX;余数(DX)存放到S+

30、2单元,3.3.2 分支结构程序设计,用条件转移(Jxxx)指令实现程序的双分支(二分支)。双分支结构相当于:if then 分支程序结构:先行有产生条件的语句;利用条件转移指令,测试并判断条件;根据条件成立与否,决定程序走向(转/不转)。多分支结构相当于:if then else 或 case do,多分支程序是把多分支结构,分解成多个双分支结构。,无条件转移指令,无条件转移指令JMP 操作:计算转移目标的地址,转移到目标处去执行。段内直接转移(直接给出段内目标地址的标号)格式:JMP 例如:JMP sub1;直接转移到sub1 JMP SHORT sub2;段内直接短转移到sub2 JMP

31、 NEAR PTR sub3;段内直接近转移到sub3段内间接转移(从寄存器/内存单元取目标地址的偏移址)格式:JMP src操作数寻址:src=reg|mem;字类型例如:JMP BX;IP 从BX 中取偏移址EA JMP WORD PTR BX;IP 从内存2字节中取EA,条件转移指令Jxxx格式:Jxxx 操作数:为段内短转移,即标号偏移地址的位移量在-128+127 区间。操作:IP=IP+(补码)注意:条件转移指令通常用在能设置了标志位的指令之后,根据状态标志条件的成立与否判断是否转移。,条件转移指令,(单标志)条件转移指令表,(复合标志)条件转移指令表,二分支程序设计例,【例3.3

32、】把有符号字节数X和Y 的较大者送入变量Z。;字节变量X和Y比较程序段:MOVAL,X;AL=XCMPAL,Y;AL(即X)和Y比较JGEYG;X=Y,转YGMOV AL,Y;XY,AL=YYG:MOVZ,AL;较大者存放到Z单元,多分支程序设计例,【例3.4】求X字节变量数据的符号函数(3分支)。;求字节变量符号函数程序段:MOVAL,XCMPAL,0;X与0比较JZZERO;为0,转ZEROJSNEGA;为负,转NEGAMOVAL,1;为正,AL=1 JMPOK;转公共出口OKZERO:MOVAL,0;AL=0JMPOK;转公共出口OKNEGA:MOVAL,0FFH;AL=-1OK:MOV

33、Y,AL;符号函数值存放到Y单元,循环结构程序设计,循环结构程序是一段重复执行的程序段(循环体),必须在有限次的重复执行后结束。循环程序的基本结构:循环初始化 循环体修改循环控制变量 no 判断循环结束?yes,循环控制指令,循环指令LOOP格式:LOOP 操作数:为段内短转移,标号偏移址的位移量在-128+127 区间,即 IP=IP+。操作:1.(cx)1cx;2.测试CX是否为0?如果CX不为0,转到标号处;如果CX为0,执行下一条指令。标志位:不改变。,循环程序设计例1,【例3.6】把存储器中N个字节数据“搬家”。;“搬家”程序段:MOVAX,DATAMOVDS,AX;设置DS数据段基

34、址LEASI,BLKSLEADI,BLKD MOVCX,N;CX=NLOP1:MOVAL,SI;取一个数MOVDI,AL;“搬”一个数INCSIINCDI;SI和DI分别做+1修改LOOPLOP1;CX10,循环“搬”数,循环程序设计例2,【例3.8】计算 SUM=a1b1+a2b2+a10b10。;内存数据定义adb 89,5,56,80;10个数据bdb 18,29,12,38;10个数据sumdw?,;计算SUM程序段movdx,0movsi,0 movcx,10lop1:moval,asimulbsiadddx,axincsilooplop1movsum,dx,循环程序设计例3,【例3

35、.11】ARR数据区有N个有符号字节数(ARR数组)。求ARR数组的最大值、最小值、数组元素之和,以及数据平均值。arrdb 89,-90,56,88 nequ$-arr;n=数据个数 maxdb-128;预先放最小值-128 mindb 127;预先放最大值127 sumdw 0;预先放求和初值0 pingdb?;平均值,;程序段leabx,arrmovcx,npp1:moval,bxcbwaddsum,axcmpmax,aljgep1movmax,al,p1:cmpmin,aljlep2movmin,alp2:incbx looppp1movax,summovcl,nidivcl;al=平

36、均值movping,al,3.3.4 子结序设计,子程序是具有一定功能的一组指令集合,可以被多次调用。8086/8088子程序结构定义的伪指令:子程序定义伪指令 PROC子程序结束伪指令 ENDP子程序调用指令:CALL 子程序返回指令:RET,子程序(过程)定义伪指令,过程定义伪指令 PROC格式:PROC NEAR/FAR 子程序的类型分为NEAR 段内过程,FAR 段间过程。过程结束伪指令ENDP格式:ENDP PROC语句与对应的ENDP语句的过程名必须一致。,子程序调用和返回指令,过程调用指令CALL格式:CALL 操作:先把返回地址(IP或IP和CS)压入堆栈,再转向被调过程(子程

37、序)。过程返回指令RET 格式:RET操作:从堆栈中弹出返回地址(IP或IP和CS),转回调用过程(主程序)。标志位:不改变任何标志位。,子程序(过程)结构必须在代码段结构内。SEGMENT;段开始ASSUME CALL;调用过程指令 PROC;过程开始 RET;过程返回指令 ENDP;过程结束 ENDS;段结束,子程序的结构,I/O中断指令,中断指令INT 格式:INT n;n为中断类型号0255(00FFH)系统提供的常用的 I/O中断指令:显示BIOS 中断服务(INT 10H 指令)键盘BIOS中断服务(INT 16H 指令)DOS中断服务(INT 21H 指令)INT 21H(AH=

38、1)键盘读一个字符到AL中,并回显 INT 21H(AH=2)显示DL中的一个字符 INT 21H(AH=9)显示由DS:DX指向的终止于$的字符串 INT 21H(AH=0AH)键盘读一个字符串到DS:DX指向的字符缓冲区,常用I/O中断功能调用例,读字符给AL,且回显:MOV AH,1INT 21H 读字符给AL,不回显:MOV AH,8INT 21H显示DL的字符:MOV DL,AMOV AH,2INT 21H,显示字符串:SUM DB ABch6y$MOV DX,OFFSET SUMMOV AH,9INT 21H读字符串:SUM DB 20,?,20 DUP(?)MOV DX,OFFS

39、ET SUM MOV AH,0AHINT 21H,主、子程序之间的参数传递,寄存器传递参数用寄存器传递子程序入/出口参数的方法最通用,但参数个数有限。特别是函数式子程序,常用寄存器传递自变量和函数值。堆栈传递参数表把传递的入口参数依次压入堆栈,然后调用子程序;子程序取堆栈中的参数表使用;返回时使用RET n指令,弹出堆栈中的入口参数表(n为参数表的字节数)。数据缓冲区传递参数用数据缓冲区传递子程序入/出口参数的方法,在参数个数较多,并且数据是连续时使用。,子程序设计例,【例3.14】求一个无符号字变量的10#/2#/16#数位之和。num dw?sum dw?;主程序:mov ax,num;ax 取数n mov cx,10;cx 取数制(10/2/16)(或 mov cx,2)(或 mov cx,16)call subr;ax,cx 入口参数,bx 出口参数 mov sum,bx,;子程序subrsubrprocpushdx;保护现场movbx,0;数位和初值0bx lop:cmpax,0 jzok;ax=0,结束求数位和 movdx,0 divcx;除以10/2/16 addbx,dx jmplop ok:popdx;恢复现场retsubr endp,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号