欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    微机原理与接口技术第3章汇编语言程序设计.ppt

    • 资源ID:6284440       资源大小:210KB        全文页数:80页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    微机原理与接口技术第3章汇编语言程序设计.ppt

    微机原理与接口技术,第 3 章 汇编语言程序设计,教案,第 3 章 汇编语言程序设计,3.1 8086/8088指令系统3.2 汇编语言程序3.3 汇编语言程序设计习题例,8086/8088指令语句格式,:;标号是自定义的、非系统关键字的符号串。操作符是操作码的助记符号表示,是指令的关键字,必不可少。操作数是参与指令具体操作的操作对象,根据操作数的个数,有0(零)操作数指令、单操作数指令和双操作数(用逗号分割)指令。注释仅仅是提供阅读的文字信息。,操作数寻址方式,操作数作为参与指令具体操作的对象,可以是操作数据,也可以是转移地址。操作数可以是立即数,也可以存放在寄存器或内存储器或输入/输出接口中。操作数的寻址方式有立即方式、寄存器方式、直接内存方式、间接内存方式、I/O方式。8086/8088寻址方式分为数据寻址方式(7种)和转移地址寻址方式(4种)两大类。,数据传送MOV指令,传送指令 MOV格式:MOV dst,src操作:dst src源操作数(src)传送到目的操作数(dst)双操作数:源操作数,目的操作数数据类型:字节类型/字类型,立即方式:操作数据在指令中直接给出(立即数)。寄存器方式:操作数存放在指令给出的字节/字寄存器中。例如:MOV AX,0FC25H;AX0FC25H MOV AL,42H;AL42HMOV AH,11010011B;AH 11010011B(0D3H)MOV CX,-25;AX-25MOV AL,1000;错误,立即数1000超字节范围 MOV DS,2000H;错误,不能直接取立即数给段RMOV AX,2000H;取2000H(立即数)给AXMOV DS,AX;将AX中的段基址数传送给DSMOV AX,IP;错误,程序中不得出现IPMOV AX,CS;正确,CS可读MOV CS,AX;错误,CS不可写,立即寻址和寄存器寻址,8086/8088存储器组织,微机存储器是以字节为存储单位。8086/8088存储器(内存)地址线是20根,内存容量1MB,地址范围 00FFFFFH。8086/8088存储器是分段结构,每段最大为64KB。操作数如果存放在内存,需要指明内存的逻辑地址,微处理器的地址加法器会自动形成内存的物理地址.逻辑地址描述格式 段基址:偏移址 物理地址=段基址16+偏移址,存储器寻址方式,段址寄存器:内存逻辑地址的段基址存放的寄存器(CS,SS,DS,ES)。偏移址寄存器:基址寄存器(BX,BP),变址寄存器(SI,DI)。内存逻辑地址的偏移地址(EA)寻址方式:直接寻址方式:指令中直接给出EA 寄存器间接寻址方式:EA=(基/变址R)寄存器相对寻址方式:EA=(基/变址R)+位移量 基址变址寻址方式:EA=(基址R)+(变址R)基址变址相对寻址方式:EA=(基址R)+(变址R)+位移量段址寄存器和偏移址寄存器配对使用的隐含规定:代码(指令)指针CS:IP堆栈操作指针SS:SP,或 SS:BP源数据串指针DS:SI目的数据串指针ES:DI,存储器寻址方式例,MOV AL,1000H;(DS:1000H)的字节数ALMOV 2000H,BX;BX(DS:2000H)MOV AX,BX;(DS:BX)的字数AXMOV AX,SS:BX;(SS:BX)的字数AXMOV AX,BX-100;(DS:(BX-100)的字数AXMOV BX+SI,AX;BX+SI 是内存间接寻址MOV AX,CX;错误,CX寄存器不能用于内存寻址MOV BX,SI;错误,2个操作数不能都是内存寻址MOV AX,SI+DI;错误,SI和DI 不能配对做内存间接寻址,8086/8088指令系统,8086/8088微机的指令系统有133条指令(附录A),分为六大类:1.数据传送类指令:主要有MOV,PUSH,POP,XCHG,LEA,IN,OUT等指令。2.算术运算类指令:加、减、乘、除(整数)等算术运算指令。3.逻辑运算和移位类指令:逻辑运算和移位指令。4.控制转移类指令:有/无条件转移指令(在分支程序设计中介绍),LOOP循环控制指令(在循环程序设计中介绍),CALL/RET指令(在子程序设计中介绍)。5.串操作类指令(在循环程序设计中介绍)6.处理机控制类指令,1.数据传送指令类,数据传送类指令一共有14条。这里主要介绍:MOV 传送PUSH 压入堆栈POP弹出堆栈XCHG 交换LEA取偏移IN 输入端口“读”OUT输出端口“写”数据传送类指令均不影响标志位。数据类型字节(byte)/字(word)。绝大多数是双操作数,两个操作数(字节/字)类型必须一致。寻址方式基本与MOV 指令的要求相同。,数据传送指令,传送指令 MOV格式:MOV dst,src操作:dst(src)双操作数寻址方式:dst(目的操作数)src(源操作数)reg(寄存器)reg|mem|imm(立即数)|segregmem(内存)reg|imm|segregsegreg(段寄存器)reg|mem注意:1.两个操作数类型(字节/字)要一致。2.目的操作数不能是立即数,两个操作数不能都是内存寻址方式。,堆栈操作指令,PUSH 和POP 是一对堆栈操作指令:堆栈是一个“先进后出”的内存数据存取区域。逻辑地址SS:SP。数据进入堆栈的操作为压入(PUSH),从堆栈取出数据的操作为弹出(POP)。堆栈操作是单操作数指令,只能是字类型数据。压入指令PUSH 格式:PUSH src操作:(SP)-2SP(src)(SP)操作数寻址:src=|mem|reg|segreg例如:MOVAX,100 PUSHAX,堆栈操作指令,弹出指令POP格式:POP dst操作:(SP)dst(SP)+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=reg|mem opr2=reg|mem例如:XCHG 2000H,BX;错误,两个内存数据不可直接交换。可改为:MOV AX,2000H;(DS:2000H)AX XCHG AX,BX;AX和(DS:BX)交换 MOV 2000H,AX;AX(DS:2000H),数据交换指令,查表换码指令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 BX,OFFSET MEM)MOV AL,BX+2;AL=43H,装偏移址指令,输入/输出(I/O)指令,I/O接口指令的语句格式:IN AL,端口地址 OUT 端口地址,AL I/O接口的端口地址16位,地址范围为00FFFFH。若端口地址为 00FFH(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;错误,端口寻址不能用方括号,算术运算类指令可以分成加、减、乘、(整)除和十进制(BCD码)调整五组。这里介绍加、减、乘、除14条指令。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进位加指令ADC格式:ADC dst,src;(dst)+(src)+CF dst加1指令INC格式:INC dst;(dst)+1 dst操作数寻址方式:dstsrc regreg|mem|imm memreg|imm,加法运算指令,减法指令SUB格式:SUB dst,src;(dst)-(src)dst 借位减指令SBB格式:SBB dst,src;(dst)-(src)-CF dst减1指令DEC格式:DEC dst;(dst)-1dst操作数寻址方式:dstsrc regreg|mem|imm memreg|imm,减法运算指令,减法运算指令,比较指令CMP格式:CMP dst,src操作:(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 src IMUL src操作数寻址:src=reg|mem操作:有/无符号数的乘法字节乘法:(AL)(src)AX字乘法:(AX)(src)DX|AX(32位)注意:被乘数和乘积是固定寻址,只需给出乘数。例如:无符号数字节乘法(2551)0FFH1=00FFH 有符号数字节乘法(-11)0FFH1=0FFFFH,乘法运算指令,无符号除法指令DIV有符号除法指令IDIV格式:DIVsrc IDIV src操作数寻址:src=reg|mem操作:有/无符号数的除法字节除法:(AX)/(src)AL(商),AH(余数)字除法:(DX|AX)/(src)AX(商),DX(余数)注意:1.被除数,商和余数是固定寻址,只需给出除数。2.除法可能有0作除数错误;商超出字节/字范围的溢出错误。3.有符号数除法的余数与被除数的符号相同。,除法运算指令,符号扩展指令CBW,CWD 格式:CBW;把AL字节数的符号扩展到AH,成AX字数CWD;把AX字数的符号扩展到DX,成DX|AX双字数操作数:隐含寻址(AL/AX/DX)标志位:不改变。例如:MOVAL,56HCBW;AX=0056HMOVAX,8600HCWD;AX=8600H,DX=0FFFFH,符号扩展指令,例如:MULAH;无符号数(AL)(AH)AX DIVBX;无符号数(DX|AX)/(BX)AXIMULAL;有符号数(AL)(AL)AX IMUL CX;有符号数(AX)(CX)DX|AX例如:计算(-104)除以25。MOVAL,-104;AL=-104(98H)CBW;AL扩展为 AX(0FF98H)MOVBL,25;BL=25 IDIVBL;AL=-4(商),AH=-4(余数)例如,如果 AX=0010H(+16),BL=0FDH(-3)IDIV BL;AX=01FBH,商=-5,余数=1,乘/除法指令应用例,3.逻辑运算和移位指令,逻辑运算和移位类指令是以2#数位为单位的“位操作”指令,逻辑运算指令5条,移位指令8条。NOT 逻辑非AND 逻辑与OR 逻辑或XOR 逻辑异或TEST 位测试SHL 逻辑左移ROL 循环左移 SHR 逻辑右移ROR 循环右移SAL 算术左移RCL 带进位循环左移SAR 算术右移RCR 带进位循环右移操作数可为字节/字类型,按位进行逻辑运算。多数情况不改变标志位。,逻辑运算指令,逻辑非指令NOT格式:NOTdst;求(dst)的互反码逻辑与指令 AND逻辑或指令 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操作:(图3.1 移位指令操作图解)标志CF:左移取自dst的最高位,右移取自dst 的最低位D0位。,逻辑运算和移位指令应用例,;AX乘以10SAL AX,1MOVBX,AXSALAX,1SALAX,1ADDAX,BX,AND AL,50H;AL=(AL)50HOR AX,8080H;AX=(AX)(DS:8080H)AND AL,0FH;AL高4位清0,低4位保留OR AL,0FH;AL高4位保留,低4位置1XOR AL,0FH;AL高4位保留,低4位取反,6.处理器控制指令,标志位设置指令:CLCCF=0STCCF=1CMCCF取反CLDDF=0 STDDF=1CLIIF=0 STI IF=1CPU控制指令:NOP无操作(空操作)HLT停机(暂停,等待外部中断,中断后恢复运行)WAIT等待(等待测试信号TEST,恢复运行),汇编语言程序的语句,汇编语言源程序由三类指令语句组成:(符号)执行指令语句提供给汇编程序“翻译”成机器能直接执行的指令。汇编指示性语句(伪指令)提供给汇编程序指示汇编操作的指令。宏指令语句提供给汇编程序的扩展的“功能宏大”的指令。,8086/8088汇编语句格式,汇编语言源程序语句的格式:;名字项是自定义的一个符号串。操作码项是执行指令、伪指令和宏指令的操作功能符。操作数项是0个或1个或多个(用逗号分隔)的操作对象。注释项是开始于“;”,提供阅读的文字信息。注意:各项之间用空格键符,或TAB键符分界。操作码项必有,其它项可选择有/无。汇编语言程序不区别大小写英文。,名字项,名字项是自定义的一个符号串,可以是标号名(必须结束于“:”)、符号常数名、变量名、段名、过程名。名字项的合法字符:英文字母AZ/az,数字09,特殊字符 _?等。注意:数字09不能是第1个字符,句点“”只能做第1个字符。在执行指令语句的操作数项中:符号常数名作为立即数使用。标号名、过程名作为转移地址使用。变量名作为存储单元的偏移址,可以直接寻址使用。段名作为段基址(立即数)使用。,汇编表达式,操作数项是0个或1个或多个(用逗号分隔)的指令操作的对象,用规定的汇编表达式描述。汇编表达式是由(整数)常数、寄存器、标号、变量等,和一些运算符,或操作符组成的表达式。汇编表达式能被汇编程序解释,并计算出数值/地址结果,所以分为数值表达式和地址表达式两种。数值表达式:由常数、数值运算符组成的表达式,计算结果为字节/字数据。地址表达式:包含地址(标号、变量和过程名都是地址)、常数,以及地址运算/操作符的表达式,计算结果为内存地址值。,常数和数值运算符,数字常数(立即数):2/10/16进制数、ASCII字符(用引号括起来)符号常数给常数起的名字数值运算符(运算对象和结果是整数常数):算术运算符:+、*、/、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 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,汇编指示语句(伪指令),常用的汇编指示语句(伪指令)分成五组:符号定义、内存数据定义、段定义、过程定义、模块定义。常用的伪指令语句: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=46f EQU 123456H;正确,“123456H”为符号对象g=123456H;错误,123456H超过16位2#的数值范围,数据定义伪指令,内存数据定义伪指令DB、DW 和 DD 格式:DB/DW/DD 功能:定义内存变量和类型,分配和初始化内存单元数据。,内存数据定义的数据表,数据表为顺序存放在内存单元的数据,多个数据之间用“,”分隔。数值表达式:DB(8位数值的数据表)DW(16位数值的数据表)DD(32位数值的数据表)地址表达式:DW(偏移址的数据表)DD(偏移址和段基址的数据表)ASCII码字符串:用单/双引号界定的字符串的数据表。?分配空单元,不放数据 DUP数据重复定义(可嵌套使用)格式:DUP(),内存数据定义例,DA1 DBDATA SEGMENTDA2 EQU$-DA1;$为当前偏移址指针,DA2=12DA3 DB6DH,62,15H,28DA4 DB10 dup(0,5 dup(1,2),0)DA5 DB12345DA6 DW 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偏移址指针用“$”表示。,程序的代码段结构:SEGMENT;段开始 ASSUME ENDS;此段结束程序的数据段结构:SEGMENT;段开始 ENDS;此段结束,程序的段结构,程序模块定义伪指令,程序模块开始伪指令NAME格式:NAME(源程序模块开始NAME伪指令可以省略不用。)程序模块结束伪指令END格式:END,汇编语言源程序结构例,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,4C00H;返回DOSINT 21Hcode ENDS END START,汇编语言程序设计技术,结构化汇编语言程序设计结构化程序设计使程序结构清晰、易于理解、易于调试和修改,充分显示了程序模块化的优点。汇编语言程序的基本结构汇编语言程序设计有三种基本结构,即顺序结构、分支结构和循环结构。它们是单入口/出口的程序结构。这三种结构的任意组合和嵌套构成了结构化程序设计。子程序设计技术,顺序程序设计例1,【例3.1】计算S=(8000-(X*Y+Z)/X,其中X,Y,Z,S均是有符号数字变量。;定义内存字变量x,y,z,s:DATASEGMENT 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+2单元,顺序程序设计例2,【例3.2】把一个字节的压缩BCD,转换成两个字节的ASCII码。;定义数据段:DATASEGMENT BCD DB48H ASC DB?,?;存放转换结果DATAENDS,;转换程序段:MOV AL,BCDMOV BL,AL;AL,BL取BCD单元的值AND AL,0FH;AL=08HOR AL,30H;AL=38HMOV ASC,AL;38H存放到 ASC单元MOV CL,4SHR BL,CL;BL=04HOR BL,30H;BL=34H MOV ASC+1,BL;34H存放到ASC+1单元,无条件转移指令,无条件转移指令JMP 操作:计算转移目标的地址,转移到目标处去执行。段内直接转移(直接给出段内目标地址的标号)格式:JMP lab例如:JMP sub1;直接转移到标号sub1 JMP SHORT sub2;段内直接短转移到标号sub2 JMP NEAR PTR sub3;段内直接近转移到标号sub3段内间接转移(寄存器/内存单元给出目标地址)格式:JMP src操作数寻址:src=reg|mem;字类型例如:JMP BX;IP 从BX 中取偏移址EA JMP WORD PTR BX;IP 从(BX)指示的内存2字节中取EA,条件转移指令Jxxx格式:Jxxx 操作数:为段内短转移,即标号偏移址的位移量在(-128,+127)区间。操作:IP=IP+(补码)注意:1.条件转移指令通常用在能设置了标志位的指令之后,根据状态标志条件的成立与否判断是否转移。2.条件转移指令只能使用段内短转移寻址方式。,条件转移指令,(单标志)条件转移指令表,(复合标志)条件转移指令表,分支结构程序设计,用条件转移(Jxxx)指令实现程序的双分支(二分支)。双分支结构相当于:if then 双分支程序设计 一般为:先行有产生条件的语句;利用条件转移指令,测试并判断条件;根据条件成立与否,决定程序走向(转/不转)。多(2)分支程序是把多分支结构,分解成多个双分支结构。分解方法有:逻辑分解法和地址跳转表法。注意:条件转移指令中的转向标号超出了字节值(-128127)范围,为转移跨距超值错误。,二分支程序设计例,【例3.3】把有符号字节数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为X和Y的较大者,逻辑分解法分支程序例,【例3.4】求X字节变量数据的符号函数(3分支)。;求字节变量符号函数程序段:MOVAL,XCMPAL,0;AL与0比较JZZERO;为0,转ZEROJSNEGA;为负,转NEGAMOVAL,1;为正,AL=1 JMPOK;转公共出口OKZERO:MOVAL,0;AL=0JMPOK;转公共出口OKNEGA:MOVAL,0FFH;AL=-1OK:MOVY,AL;符号函数值存放到Y单元,地址跳转表法分支程序例,【例3.5】读入一个成绩等级字符AD,显示对应的分数段。(4分支)chardb?;存放输入的字符tabldw ent-a,ent-b,ent-c,ent-d;存放跳转的标号地址;程序段:P1:.;键盘输入一个字符给char单元mov al,charsub al,41h;转换成数字03(分支号)cmp al,3ja P1;3,转重新输入一个字符js P1;0,转重新输入一个字符mov ah,0 shl ax,1;(ax)*2mov bx,axjmp tabl bx;转到对应的标号地址,;4个分支程序段:ent-a:(输出A:10085!字符串)jmpquitent-b:(输出B:8470!字符串)jmpquitent-c:(输出C:6960!字符串)jmpquitent-d:(输出D:590!字符串)quit:MOV AX,4C00H INT 21H;返回DOS,循环结构程序设计,循环结构程序是一段重复执行的程序段(循环体),必须在有限次的重复执行后结束。循环程序的基本结构:循环初始化 循环体修改循环控制变量 no 判断循环结束?yes判断循环结束的控制指令:Jxxx 条件转移指令LOOP循环指令,循环控制指令,循环指令LOOP格式:LOOP 操作数:为段内短转移,即标号偏移址的位移量在(-128,+127)区间。操作:(1)(cx)1cx。(2)测试CX是否为0,如CX不为0,转到标号处,即 IP=IP+;如CX为0,执行下一条指令。标志位:不改变。,循环程序设计例1,【例3.6】把存储器中N个字节数据“搬家”。;“搬家”程序段:MOVAX,DATAMOVDS,AX;设置DS数据段基址MOVCX,N;CX取数据个数NLEASI,BLKSLEADI,BLKDLOP1:MOVAL,SI;取一个数MOVDI,AL;“搬”一个数INCSIINCDI;SI和DI分别做+1修改LOOPLOP1;CX-1,重复“搬”数,直至CX=0结束,循环程序设计例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,asiimulbsiadddx,axincsilooplop1movsum,dx,循环程序设计例3,【例3.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=平均值movping,al,子程序程序设计,子程序是具有一定功能的一组指令集合,可以被多次调用。8086/8088子程序结构定义的伪指令:定义子程序伪指令 PROC 结束子程序伪指令 ENDP子程序调用指令:CALL 子程序返回指令:RET,子程序(过程)定义伪指令,过程定义伪指令 PROC格式:PROC NEAR/FAR子程序类型:NEAR 段内过程,FAR 段间过程。过程结束伪指令ENDP格式:ENDP PROC语句与对应的ENDP语句的过程名必须一致。,子程序(过程)调用和返回指令,过程调用指令CALL格式:CALL 操作:先把返回地址(IP或IP和CS)压入堆栈,再转向被调过程(子程序)。过程返回指令RET 格式:RET操作:从堆栈中弹出返回地址(IP或IP和CS)。,子程序(过程)结构必须在代码段结构内。SEGMENT;段开始 ASSUME CALL;调用过程指令 PROC;过程开始 RET;过程返回指令 ENDP;过程结束 ENDS;段结束,子程序的结构,PROC;过程开始 保护现场(“现场”用PUSH指令入栈保护).子程序功能程序.恢复现场(“现场”用POP指令出栈恢复)RET;过程返回指令 ENDP;过程结束,子程序的处理环节,主、子程序之间的参数传递,寄存器传递参数用寄存器传递子程序入/出口参数的方法最通用,但参数个数有限。特别是函数式子程序,常用寄存器传递自变量和函数值。堆栈传递参数表把传递的入口参数依次压入堆栈,然后调用子程序;子程序取堆栈中的参数表使用;返回时使用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,系统功能调用,软件中断指令格式:INT n;n为中断类型号0255(00FFH)系统功能调用微机的BIOS和DOS提供了一批系统功能中断子程序(附录B和附录C),让用户用INT n 指令调用。常用的 I/O中断指令:INT 10H CRD输出 中断指令INT 16H 键盘输入中断指令INT 21H DOS功能调用中断指令,常用的DOS功能调用,返回DOS 的功能调用:MOV AX,4C00H;AH=4CH,AL=0INT21H字符I/O 的DOS功能调用:AH=01H读一个字符到AL中,并回显 AH=08H读一个字符到AL中,不回显 AH=02H显示DL中的字符 AH=09H显示DS:DX指向的终止于$的字符串AH=0AH读字符串到DS:DX指向的数据缓冲区,读(键盘)一个字符给AL,并回显:MOV AH,1INT 21H读(键盘)一个字符给AL,不回显:MOV AH,8INT 21H(CRT)显示DL的字符:例如,MOV DL,AMOV AH,2INT 21H,字符I/O的DOS功能调用,(CRT)显示一个字符串:例如,SUM DB S=(23000-(x*y+z)/x,0AH,0DH,$MOV AX,SEG SUMMOV DS,AX MOV DX,OFFSET SUMMOV AH,9INT 21H,习题3.1,习题3.2,3.1 根据题意填空。可以做存储器操作数寻址的寄存器是 BX,BP,SI,DI。8086/8088状态标志位有 ZF,SF,CF,OF,PF,AF,控制标志位有 IF,DF,TF。一个逻辑地址为2000H:12A7H存储单元的物理地址是 212A7H。堆栈数据操作的特性是 先进后出;队列数据操作的特性是 先进先出。在同一程序中,可以连续重复执行的程序段是 循环 结构。,3.2.请指出下列语句中寻址方式的错误。MOVCX,AX;AX不能做存储器操作数寻址的寄存器 ADDBL,500;500超过了一个字节(8位)数值范围 POPAL;堆栈操作必须是字(16位)类型数据 MULAL,BL;只要给出一个乘数 AND100,AX;目的操作数不能是立即数寻址 SUBBX,DI;2个操作数不能都是存储器寻址 MOVDS,2000H;立即数不能直接送给段寄存器 RCLBX,4;移位数超过1,要用CL寄存器存放 XCHGBX,4078H;交换的操作数不能是立即数 INCSI;SI寻址的数据类型(字节/字)不明确,习题3.3,习题3.4,3.3 按题意给出合适的12条指令。将AX和250做有符号数乘法。MOVBX,250IMULBX 将AX和SI寄存器间接寻址的存储器操作数相加,和在AX中。ADDAX,SI 将AL的高4位数据保留,低4位数据置1。ORAL,0FH 将AX的高8位和低8位数据互换。MOVCL,8RORAX,CL,3.4 设AX=8B6AH,BX=00FFH,分别给出以下指令执行后AX的值。ADD AX,BX;AX=8C69 H SUB AX,BX;AX=8A6B H AND AX,BX;AX=006A H OR AX,BX;AX=8BFF H XOR AX,BX;AX=8B95 H,习题3.5,3.5 给出执行以下计算的指令序列,其中X,Y,Z,W1W3均为16位无符号数内存变量。W1 2*X-3*Y+ZMOVAX,XSHLAX,1;AX=2*XMOVBX,YSHLBX,1;BX=2*YADDBX,Y;BX=2*Y+Y=3*YSUBAX,BX;AX=2*X-3*YADDAX,Z;AX=2*X-3*Y+ZMOVW1,AXHLT,W2(X*Y-215)/Z+4*XMOVAX,XMULY;DX|AX=X*YSUBAX,215SBBDX,0;DX|AX=X*Y-215DIVZ;AX=(X*Y-215)/ZMOVBX,XSHLBX,1SHLBX,1;BX=4*XADDAX,BX;AX=(X*Y-215)/Z+4*XMOVW2,AXHLT,W3(XY)ZMOVAX,XANDAX,YXORAX,ZMOVW3,AXHLT,习题3.6,3.6 说明下列程序段的功能。程序段执行后,HEX单元的值是什么?;数据变量定义:ASC DB41H;16进制数A的ASCII码值41HHEX DB?;程序段:MOV AL,ASC CMP AL,39H JBE NEXT;小于/等于39H(9),转NEXT SUB AL,7;AL减7 NEXT:SUB AL,30H;AL减30 H MOV HEX,AL HLT该程序段是把ASC单元的一个16进制数(09,AF)的ASCII码值(30H39H,41H46H),转换成对应的10进制数,存放到HEX单元。本例是把16进制数A转换成10。,习题3.7,3.7 编写能完成以下功能的程序段。利用加法和移位指令将无符号字节数A乘以6,将积送到B单元。MOVAL,ASHLAL,1;AL=2*AMOVAH,AL;AH=2*ASHLAL,1;AL=4*AADDAL,AH;AL=4*A+2*A=6*AMOVB,ALHLT,求有符号字数A,B的绝对值,将较小的绝对值送到C单元。MOVAX,ACMPAX,0JGEPA;AX0(正数),转PANEGAX;AX“负数取补”(正数)PA:MOVBX,BCMPBX,0JGEPB;BX0(正数),转PBNEGBX;BX“负数取补”(正数)PB:CMPAX,BX;AX和BX比较JBEEXIT;AXBX,转EXITXCHGAX,BX;AX,BX交换EXIT:MOVC,AX;AX是绝对值较小的HLT,设A数组有50个字节数,将数组元素之和送到B单元。MOVDX,0;DX为求和初值0MOVCX,50;CX为计数初值50LEABX,A;BX取A数

    注意事项

    本文(微机原理与接口技术第3章汇编语言程序设计.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开