欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

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

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

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

    微机原理与接口技术第3章汇编语言程序设计ppt课件.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 ;AL42H MOV AH, 11010011B ;AH 11010011B(0D3H) MOV CX, -25 ;AX -25 MOV AL, 1000 ;错误,立即数1000超字节范围 MOV DS, 2000H ;错误,不能直接取立即数给段R MOV AX, 2000H ;取2000H (立即数)给AX MOV DS, AX ;将AX中的段基址数传送给DS MOV AX, IP ;错误,程序中不得出现IP MOV 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)的字节数AL MOV 2000H, BX ;BX (DS : 2000H) MOV AX, BX ;(DS : BX)的字数AX MOV AX, SS:BX ;(SS : BX)的字数AX MOV AX, BX-100 ;(DS :(BX-100)的字数AX MOV 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(立即数)| segreg mem(内存) reg| imm| segreg segreg(段寄存器) reg| mem 注意: 1. 两个操作数类型(字节/字)要一致。 2. 目的操作数不能是立即数,两个操作数不能都是内存寻址方式。,堆栈操作指令,PUSH 和POP 是一对堆栈操作指令: 堆栈是一个“先进后出”的内存数据存取区域。逻辑地址SS: SP 。 数据进入堆栈的操作为压入(PUSH),从堆栈取出数据的操作为弹出(POP)。堆栈操作是单操作数指令, 只能是字类型数据。 压入指令PUSH 格式: PUSH src 操作: (SP)-2SP (src)(SP) 操作数寻址:src = |mem |reg |segreg 例如: MOV AX,100 PUSH AX,堆栈操作指令,弹出指令POP 格式: POP dst 操作: (SP)dst (SP)+2SP 操作数寻址:dst = mem|reg|segreg 例如 : PUSH AX ;AX(SS : SP) PUSH BX ;(DS : BX)(SS : SP) POP CX ;(SS : SP)CX PUSH CL ;错误,堆栈操作必须是字类型数据 POP 200 ;错误,立即数不能是堆栈操作数据,交换指令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个字节。 例如: MEM DB ABCDEFGHIJKLMNOPQRSTUVWXYZ MOV BX, OFFSET MEM MOV AL, 2 XLAT ; AL= 43H( C的ASCII码值),查表换码指令,装偏移指令LEA 格式: LEA dst,src 操作: src的偏移址dst 操作数寻址: dst= reg src = mem 例如: MEM DB ABCDEFGHIJKLMNOPQRSTUVWXYZ LEA 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=100H OUT 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 操作数寻址方式: dst src reg reg|mem|imm mem reg|imm,加法运算指令,减法指令SUB 格式: SUB dst,src ;(dst)-(src) dst 借位减指令SBB 格式: SBB dst,src ;(dst)-(src)- CF dst 减1指令DEC 格式: DEC dst ;(dst)- 1dst 操作数寻址方式: dst src reg reg|mem|imm mem reg|imm,减法运算指令,减法运算指令,比较指令CMP 格式:CMP dst,src 操作:(dst)-(src), 仅根据计算结果设置相关标志位。 求补指令 NEG 格式: NEG dst 操作: 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位) 注意:被乘数和乘积是固定寻址,只需给出乘数。 例如: 无符号数字节乘法(255×1 ) 0FFH×1= 00FFH 有符号数字节乘法(-1×1 ) 0FFH×1= 0FFFFH,乘法运算指令,无符号除法指令DIV 有符号除法指令IDIV 格式: DIV src 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 ) 标志位:不改变。 例如: MOV AL,56H CBW ;AX=0056H MOV AX,8600H CWD ;AX= 8600H, DX= 0FFFFH,符号扩展指令,例如: MUL AH ;无符号数 (AL)×(AH)AX DIV BX ;无符号数 (DX|AX) / (BX) AX IMUL AL ;有符号数 (AL)×(AL)AX IMUL CX ;有符号数 (AX)×(CX)DX|AX 例如:计算(-104)除以25。 MOV AL,-104 ;AL=-104(98H) CBW ;AL扩展为 AX (0FF98H) MOV BL,25 ;BL=25 IDIV BL ;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 格式: NOT dst ; 求(dst)的互反码 逻辑与指令 AND 逻辑或指令 OR 逻辑异或指令XOR 格式: AND dst,src 操作: (dst)(src)dst OR dst,src (dst)(src)dst XOR dst,src (dst)(src)dst 测试指令TEST 格式: TEST dst,src 操作:(dst)(src) ; 不保存与运算结果,只设置标志位,移位指令,逻辑左移 SHL 逻辑右移 SHR 算术左移 SAL 算术右移 SAR 循环左移 ROL 循环右移 ROR 带进位循环左移 RCL 带进位循环右移 RCR 格式: dst,cnt 操作数寻址:dst是移位的对象,dst=reg|mem cnt是移位的位数,cnt=1|CL 操作:(图3.1 移位指令操作图解) 标志CF :左移取自dst的最高位,右移取自dst 的最低位D0位。,逻辑运算和移位指令应用例,; AX乘以10 SAL AX,1 MOV BX,AX SAL AX,1 SAL AX,1 ADD AX,BX,AND AL, 50H ;AL=(AL)50H OR AX, 8080H ;AX=(AX)(DS : 8080H) AND AL, 0FH ;AL高4位清0,低4位保留 OR AL, 0FH ;AL高4位保留,低4位置1 XOR AL, 0FH ;AL高4位保留,低4位取反,6. 处理器控制指令,标志位设置指令: CLC CF=0 STC CF=1 CMC CF取反 CLD DF=0 STD DF=1 CLI IF=0 STI IF=1 CPU控制指令: 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 ;段间调用子程序 sub1 CALL NEAR PTR sub2 ;段内调用子程序 sub2,地址表达式应用例,换段指示符应用格式: : 例如, MOV AX, SS:SI+2 SUB AX, ES:BX MOV ES:BX, AX,MEM DB 10H, 20H, 30H, 40H MOV AX, SEG MEM ;AX取MEM段址 MOV DS, AX MOV BX, OFFSET MEM ;BX取 MEM偏移址 MOV AL, BX+2 ;AL=30H MOV AX, 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 =19 b=20 b=b+10 ;b重新定义,b = 30 d=(count+4)*2 ;d = 46 f 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 DB DATA SEGMENT DA2 EQU $-DA1 ;$ 为当前偏移址指针,DA2=12 DA3 DB 6DH, 62, 15H, 28 DA4 DB 10 dup (0, 5 dup (1, 2), 0) DA5 DB 12345 DA6 DW 7, 9, 298, 1967 DA7=DA6 DA4 ;DA7=125 DA8= $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 x db ? y dw ? z dd ? data ENDS stack SEGMENT dw 100 dup (?) top equ $ stack ENDS,code SEGMENT ASSUME CS:code, DS:data, SS:stack START: MOV AX, data MOV DS, AX ;设置DS MOV AX, 4C00H ;返回DOS INT 21H code ENDS END START,汇编语言程序设计技术,结构化汇编语言程序设计 结构化程序设计使程序结构清晰、易于理解、易于调试和修改,充分显示了程序模块化的优点。 汇编语言程序的基本结构 汇编语言程序设计有三种基本结构,即顺序结构、分支结构和循环结构。它们是单入口/出口的程序结构。这三种结构的任意组合和嵌套构成了结构化程序设计。 子程序设计技术,顺序程序设计例1,【例3.1】 计算S =(8000 -(X*Y+ Z)/X,其中X,Y,Z,S均是有符号数字变量。 ; 定义内存字变量x, y, z, s: DATA SEGMENT X DW 600 Y DW 25 Z DW -2000 S DW ?, ? ;存放商和余数 DATA ENDS,; 计算S算术表达式程序段: MOV AX, X IMUL Y ;DX | AX =X*Y MOV BX, AX MOV CX, DX ;CX | BX= X*Y MOV AX, Z CWD ;Z扩展成双字DX | AX ADD BX, AX ADC CX, DX ;CX | BX= X*Y+Z MOV AX, 8000 CWD ;8000扩展成双字DX | AX SUB AX, BX SBB 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码。 ; 定义数据段: DATA SEGMENT BCD DB 48H ASC DB ?, ? ;存放转换结果 DATA ENDS,; 转换程序段: MOV AL, BCD MOV BL, AL ;AL, BL取BCD单元的值 AND AL, 0FH ;AL= 08H OR AL, 30H ;AL= 38H MOV ASC, AL ;38H存放到 ASC单元 MOV CL, 4 SHR BL, CL ;BL= 04H OR 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比较程序段: MOV AL, X ;AL=X CMP AL, Y ;AL(即X)和Y比较 JGE YG ;X=Y,转YG MOV AL, Y ;XY,AL=Y YG: MOV Z, AL ;Z为X和Y的较大者 ,逻辑分解法分支程序例,【例3.4】 求X字节变量数据的符号函数(3分支)。 ;求字节变量符号函数程序段: MOV AL, X CMP AL, 0 ;AL与0比较 JZ ZERO ;为0,转ZERO JS NEGA ;为负,转NEGA MOV AL, 1 ;为正,AL= 1 JMP OK ;转公共出口OK ZERO: MOV AL, 0 ;AL= 0 JMP OK ;转公共出口OK NEGA: MOV AL, 0FFH ;AL= -1 OK: MOV Y, AL ;符号函数值存放到Y单元,地址跳转表法分支程序例,【例3.5】读入一个成绩等级字符AD,显示对应的分数段。(4分支) char db ? ; 存放输入的字符 tabl dw ent-a, ent-b, ent-c, ent-d ; 存放跳转的标号地址 ;程序段: P1: . ;键盘输入一个字符给char单元 mov al, char sub al, 41h ;转换成数字03(分支号) cmp al, 3 ja P1 ;3, 转重新输入一个字符 js P1 ; 0, 转重新输入一个字符 mov ah, 0 shl ax, 1 ;(ax)* 2 mov bx, ax jmp tabl bx ;转到对应的标号地址,;4个分支程序段: ent-a: (输出A : 10085 !字符串) jmp quit ent-b: (输出B : 8470 !字符串) jmp quit ent-c: (输出C : 6960 !字符串) jmp quit ent-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个字节数据“搬家”。 ;“搬家”程序段: MOV AX, DATA MOV DS, AX ;设置DS数据段基址 MOV CX, N ;CX取数据个数N LEA SI, BLKS LEA DI, BLKD LOP1: MOV AL, SI ;取一个数 MOV DI, AL ;“搬”一个数 INC SI INC DI ;SI和DI分别做+1修改 LOOP LOP1 ;CX-1,重复 “搬”数,直至CX=0结束,循环程序设计例2,【例3.8】 计算 SUM=a1b1+ a2b2 + a10b10 。 ;内存数据定义 a db 89, -5, 56, 80 ; 10个数据 b db 18, 29, -12, 38 ; 10个数据 sum dw ?,;计算SUM程序段: mov dx, 0 mov si, 0 mov cx,10 lop1: mov al, asi imul bsi add dx, ax inc si loop lop1 mov sum, dx,循环程序设计例3,【例3.11】 ARR数据区有N个有符号字节数(ARR数组)。求ARR数组的最大值、最小值、数组元素之和,以及数据平均值。 arr db 89,-90,56,88 n equ $-arr ; n=数据个数 max db -128 ; 预先放最小值-128 min db 127 ; 预先放最大值127 sum dw 0 ; 预先放求和初值0 ping db ? ; 平均值,;程序段 lea bx, arr mov cx, n pp1: mov al, bx cbw add sum, ax cmp max, al jge p1 mov max, al,p1: cmp min,al jle p2 mov min,al p2: inc bx loop pp1 mov ax, sum mov cl, n idiv cl ;al=平均值 mov ping, 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 ,; 子程序subr subr proc push dx ;保护现场 mov bx, 0 ;数位和初值0bx lop: cmp ax, 0 jz ok ;ax=0,结束求数位和 mov dx, 0 div cx ;除以10/2/16 add bx, dx jmp lop ok: pop dx ;恢复现场 ret subr endp,系统功能调用, 软件中断指令 格式:INT n ; n为中断类型号0255(00FFH) 系统功能调用 微机的BIOS和DOS提供了一批系统功能中断子程序(附录B和附录C),让用户用INT n 指令调用。 常用的 I/O中断指令: INT

    注意事项

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

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




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开