1、单击此处编辑母版标题样式单击此处编辑母版副标题样式* 1微机原理与接口技术教案第第 3 章章 汇编语言程序设计汇编语言程序设计第 3 章 汇编语言程序设计3.1 8086/8088指令系统3.2 汇编语言程序3.3 汇编语言程序设计3.1.1 8086/8088指令格式 8086/8088执行指令的语句格式:标号: 操作符 操作数 ;注释 操作符 是操作码的助记符号表示,是指令的 关键字,必不可少 。 标号 是自定义的、非系统关键字的 符号串 。 操作数 是参与指令具体操作的 操作对象 , 根据操作数的个数,有 0(零)操作数 指令、 单操作数 指令和 双操作数 (用逗号分割)指令。3.1.2
2、 操作数 寻址方式 8086/8088操作数作为参与指令具体的 操作对象 ,可以是 操作数据 ,也可以是 转移地址 。 寻址方式 是指 操作对象存放的地方 ,可以是直接给出(立即数),也可以 存放在寄存器,或内存储器,或输入 /输出接口中。 8086/8088寻址方式 分为 操作数据寻址方式 和 转移地址寻址方式 两大类。 操作数据寻址方式 ( 7种):立即寻址 、寄存器 寻址 、直接内存 或 I/O寻址 、间接内存 或 I/O寻址 方式等。 转移地址寻址方式 ( 4种) :段内 直接 寻址 、 段内 间接 寻址、 段 间直接 寻址 、 段 间间接 寻址 方式。立即方式 :操作数据在指令中 直
3、接给出(立即数) 。寄存器方式 :操作数存放在指令给出的 字节 /字寄存器 中。例如: MOV AX, 0FC25H ; AX0FC25HMOV AL, 42H ; AL42HMOV AH, 11010011B ; AH 11010011B(0D3H)MOV CX, -25 ; AX -25MOV AL, 1000 ; 错误 ,超字节范围 MOV DS, 2000H ; 错误 ,立即数不能直接给段 RMOV AX, IP ; 错误 ,不得使用 IPMOV AX, CS ; 正确, CS可读MOV CS, AX ; 错误 , CS不可写立即寻址和寄存器寻址存储器寻址方式 内存内存 逻辑地址的逻辑
4、地址的 段基址值段基址值 存放在存放在 段址寄存器段址寄存器 : CS/SS/DS/ES 内存内存 逻辑地址的逻辑地址的 偏移地址(偏移地址( EA) 寻址方式寻址方式 :直接方式直接方式 :指令中直接给出:指令中直接给出 EA间接方式间接方式 : EA =( 寄存器)寄存器)EA =( 寄存器)寄存器) +位移量位移量EA =( 寄存器寄存器 1) + (寄存器(寄存器 2) EA =( 寄存器寄存器 1) + (寄存器(寄存器 2) + 位移量位移量 内存寻址使用的内存寻址使用的 偏移址寄存器偏移址寄存器 : BX, BP, SI, DI 段址段址 R和和 偏移址偏移址 R配对使用的隐含规
5、定:配对使用的隐含规定:代码(指令)指针代码(指令)指针 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
6、是内存间接寻址MOV AX, BX+DI+8 ; BX+DI+8 是内存间接寻址MOV AX, CX ; 错误 , CX寄存器不能用于内存寻址MOV BX, SI ; 错误 , 2个操作数不能都是内存寻址MOV AX, SI+DI ; 错误 , SI和 DI 不能配对做内存间接寻址3.1.3 8086/8088指令系统 8086/8088 指令系统有 133条指令,分为六大类:1. 传送指令类 : 主要有 MOV 传送 , PUSH 压入, POP 弹出, XCHG 交换, LEA 取偏移 等。2. 算术运算指令类 : 加、减、乘、除(整数)算术运算和BCD码调整五组指令。3. 逻辑运算和移位
7、指令类 : 逻辑运算指令组,移位指令组。4. 控制转移指令类 : 有 /无条件转移指令组(将在分支程序设计中介绍), LOOP指令组(将在循环程序设计中介绍),CALL/RET指令组(将在子程序设计中介绍)。5. 串操作指令类 (略)6. 处理机控制指令类 1. 数据传送指令类 数据传送类指令一共有 14条(表 3.1) 。 这里 主要介绍:MOV 传送PUSH 压入堆栈 POP 弹出堆栈XCHG 交换 LEA 取偏移 IN 输入端口 “读 ” OUT 输出端口 “写 ” 数据传送类指令均 不影响标志位 。 数据类型字节( byte) /字( word)。 绝大多数是 双操作数 ,两个操作数(
8、字节 /字) 类型必须一致 。 寻址方式基本与 MOV 指令 的要求相同。数据传送指令传送指令 MOV格式: MOV dst, src操作: dst ( src)双操作数寻址方式:dst (目的操作数 ) src (源操作数 )reg( 寄存器) reg| mem| data( 立即数) | segregmem( 内存) reg| data| segregsegreg( 段寄存器) reg| mem 两个操作数类型(字节 /字)要一致。 目的操作数不能是立即数,两个操作数不能都是内存寻址方式。堆栈操作指令PUSH 和 POP 是一对堆栈操作指令: 堆栈是一个 “先进后出 ”的内存数据存取区域。
9、堆栈逻辑地址 SS: SP 。 数据进入堆栈的操作为 压入 ( PUSH), 从堆栈取出数据的操作为 弹出 ( POP)。 堆栈操作是 单操作数 指令 , 只能是 字类型数据 。压入指令 PUSH 格式: PUSH src操作 : ( SP) -2SP ( src) ( SP)操作数寻址: src = |mem |reg |segregSS:0000SS: SP 栈顶栈底弹出指令 POP格式: POP dst操作: ( SP) dst ( SP) +2SP操作数寻址: dst = mem|reg|segreg例如 :PUSH AX ; AX ( SS : SP)PUSH BX ;( DS :
10、BX) ( SS : SP)POP CX ;( SS : SP) CXPUSH CL ; 错误 ,堆栈操作必须是字类型数据POP 200 ; 错误 ,立即数不能是堆栈操作数据堆栈操作指令交换指令 XCHG格式: XCHG opr1, opr2操作: ( opr1) ( opr2)操作数寻址: opr1=reg opr2= reg |mem注意 :不可以直接把两个内存数据交换。例如: MOV AX, 2000H ;( DS : 2000H) AXXCHG AX, BX ; AX和( DS : BX) 交换MOV 2000H, AX ; AX ( DS : 2000H)数据交换指令查表换码指令 X
11、LAT格式: XLAT ; 无操作数操作: ALDS: ( BX+AL) ; 隐含操作数寻址注意 : BX为表头的 EA, AL是距离表头的位移量 。表最大容量为 256个字节。例如:MEM DB 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
12、 ; BX取 MEM数据表头的 EA( 等同于: MOV 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,
13、AL 的区别MOV DX, 100H ; DX=100HOUT DX, AL ;与 MOV DX, AX 的区别IN AL, 80H ; 错误 , 端口寻址不能用方括号 算术运算类指令一共有 20条,分成加、减、乘、(整)除指令和 BCD码调整指令五组 。 这里主要介绍加、减、乘、除 14条指令(表 3.2) :ADD 加法 ADC 进位加 INC 加 1 SUB 减法 SBB 借位减 DEC 减 1 CMP 比较 NEG 求补MUL 无符号乘法 IMUL 有符号乘法DIV 无符号除法 IDIV 有符号除法CBW 字节符号扩展 CWD 字符号扩展 算术运算类指令基本都均 影响标志位 ( ZF、
14、 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 srcreg reg|mem|datamem reg|data加法运算指令减法指令 SUB格式: SUB dst, src ;( dst) -( src) dst 借位减指令 S
15、BB格式: SBB dst, src ;( dst) -( src) - CF dst减 1指令 DEC格式: DEC dst ;( dst) - 1dst操作数寻址方式:dst srcreg reg|mem|datamem reg|data减法运算指令比较指令比较指令 CMP格式:格式: CMP dst, src操作:(操作:( dst) -( src) , 仅根据计算结果设置相关标志位仅根据计算结果设置相关标志位。求补指令求补指令 NEG格式:格式: NEG dst操作:操作: 0 -( dst) dst ; 求互补码求互补码例如,计算例如,计算 12345678H + 80A7FD28H
16、MOV DX, 1234HMOV AX, 5678H ; DX|AX= 12345678HADD AX, 0FD28HADC DX, 80A7H ; DX|AX= 92DC53A0H减法运算指令无符号乘法指令 MUL 有符号乘法指令 IMUL格式: MUL src IMUL src操作数寻址: src = reg|mem操作: 有 /无符号数 的乘法字节乘法:( AL) ( src) AX字乘法: ( AX) ( src) DX|AX( 32位)标志位: ZF, SF无定义。乘积的高阶部分如果非 0, OF,CF均被置 1。例如 : 无符号数 字节乘法 0FFH1= 00FFH有符号数 字节乘
17、法 0FFH1= 0FFFFH乘法运算指令无符号除法指令 DIV 有符号除法指令 IDIV格式: DIV src IDIV src操作数寻址: src = reg|mem操作: 有 /无符号数 的除法字节除法:( AX) /( src) AL( 商), AH( 余数)字除法: ( DX|AX) /( src) AX( 商), DX( 余数)注意:1.除法可能有 0作除数错误 ; 商超出字节 /字范围的 溢出错误 。2.有符号数除法的余数与被除数的符号相同。除法运算指令符号扩展指令 CBW 和 CWD 格式: CBW ; 把有符号数 AL扩展为 AXCWD ; 把有符号数 AX扩展为 DX |
18、AX操作数 : 隐含寻址 (AL/ AX/ DX )标志位:不改变。例如:MOV AL, 07FHCBW ; AX=007FHMOV AX, 8003HCWD ; AX= 8003H, DX= 0FFFFH符号扩展指令例如:MUL AH ; 无符号数 (AL)(AH)AXIMUL AL ; 有符号数 (AL)(AL)AXMUL BX ; 无符号数 (AX)(BX)DX|AXMUL word ptr BX ; (AX)(BX)DX|AX例如:计算 30200除以 1500。MOV AX, 30200 ; AX =30200 CWD ; AX扩展为 DX| AXMOV BX, 1500DIV BX
19、 ; AX=20( 商), DX=200( 余数)例如,如果 AX=0010H( +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 带进位循环右移 操作数可为字节 /字类型,按位进
20、行逻辑运算。 多数情况不改变标志位。逻辑运算指令逻辑非指令 NOT格式: NOT dst ; 求( dst) 的互反码逻辑与指令 AND逻辑或指令 OR逻辑异或指令 XOR格式: AND dst, src 操作:( dst) ( src) dstOR dst, src ( dst) ( src) dstXOR dst, src ( dst) ( src) dst测试指令 TEST格式: TEST dst, src操作:( dst) ( src) ; 不保存结果,仅设置 标志位移位指令逻辑左移 SHL 逻辑右移 SHR算术左移 SAL 算术右移 SAR循环左移 ROL 循环右移 ROR带进位循环
21、左移 RCL 带进位循环右移 RCR格式: dst, cnt操作数寻址: dst是移位的对象, dst=reg|memcnt是移位的位数, cnt=1|CL标志位: ZF 和 SF, 指明移位结果的设置。CF : 左移取自 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,
22、 0FH ; AL高 4位保留,低 4位取反; AX乘以 10SAL AX, 1MOV BX, AXSAL AX, 1SAL AX, 1ADD AX, BX;双字算术右移SAR DX, 1RCR AX, 1DX CF AX CFSAR DX,1 RCR AX,16. 处理器控制指令 标志位设置指令 :CLC CF=0 STC CF=1 CMC CF取反CLD DF=0 STD DF=1CLI IF=0 STI IF=1 CPU控制指令 :NOP 无操作(空操作) HLT 停机(暂停 ,等待外部中断 ,中断后恢复运行)WAIT 等待(等待测试信号 TEST, 恢复运行)汇编语言程序的语句 汇编语言源程序由三类指令语句组成:(符号)执行指令语句提供给汇编程序 “ 翻译 ” 成机器能 直接执行的指令 。汇编 指示性 语句 (伪指令)提供给汇编程序 指示汇编操作的指令 。宏指令语句提供给汇编程序的 扩展的 “ 功能宏大 ” 的指令 。