第三章 指令系统及其寻址方式 3.1 寻址方式 3.2 指令格式 3.3 指令系统
3.1 寻址方式 3.1.1 指令的书写格式 指令有两种书写格式: * 机器指令:由一串二进制数描述; * 符号指令:用英文字母缩写词描述。 3.1 寻址方式 3.1.1 指令的书写格式 指令有两种书写格式: * 机器指令:由一串二进制数描述; * 符号指令:用英文字母缩写词描述。 符号指令的书写格式如下: 标号: 操作助记符 [目的操作数][,源操作数];注释
几点说明: 标号—表示某一条指令所在存储单元的首址。 标号应由字母打头,后跟字母、数字及特殊字符均可,但不能用关键字。 标号的用法: 1、 标号一般放在子程序(子过程)的第一条指令的开头; 2、标号一般放在转移指令要转去的目的地的 第一条指令的开头。 3、标号一般放在其他符号定义的前面。
操作数 —— 有源操作数和目的操作数,他们之 间用“,” 分隔。 操作数也可有可无。 MOV; ADD; SUB; END。 指令助记符 (操作助记符): 操作数 —— 有源操作数和目的操作数,他们之 间用“,” 分隔。 操作数也可有可无。
一般在指令中包含有操作码和操作数,怎样找到指令中的操作数和操作数所在的地址,这就是寻址方式。 3.1.2 数据寻址方式 一般在指令中包含有操作码和操作数,怎样找到指令中的操作数和操作数所在的地址,这就是寻址方式。 在微机中的操作数有三种存放方式: (1)立即数——包含在本条指令中,即: 存放在代码段中; (2) 操作数存放在CPU的某个寄存器中; (3) 操作数存放在存储器的数据段或堆栈段或附加数据段中。
所以,总的来说,数据寻址方式分为三种: 立即寻址 寄存器寻址 存储器寻址
一、立即寻址 如: MOV EAX,80000000H MOV BX,6688H MOV AX,1234H 立即数只能作为源操作数 操作数直接包含在代码段的指令中。 如: MOV EAX,80000000H MOV BX,6688H MOV AX,1234H 立即数只能作为源操作数 立即寻址主要用来给通用寄存器或存储器 赋值 不允许给段寄存器直接赋值
例3.1 立即寻址
立即寻址过程示意
立即寻址动态示意
16位寄存器:AX、BX、CX、DX、SP、BP、SI、 DI、CS、DS、SS、ES、FS、GS 8 位寄存器:AH、AL、BH、BL、 二、寄存器寻址 操作数在寄存器中。 32位寄存器:EAX、EBX、ECX、EDX、 ESP、EBP、 ESI、EDI 16位寄存器:AX、BX、CX、DX、SP、BP、SI、 DI、CS、DS、SS、ES、FS、GS 8 位寄存器:AH、AL、BH、BL、 CH、CL、DH、DL 如: MOV AX,BX MOV EDI,ESI MOV AL,CL
例3.2 寄存器寻址
EA的计算方法根据采用的寻址方式不同而不 同。 三、存储器寻址 操作数在存储器中,其地址由指令以某种 方式指出。 (一)16位指令模式下: 物理地址=段基址× 10H+ 有效地址EA (二)32位指令模式下: 物理地址=段基址+ 有效地址EA EA的计算方法根据采用的寻址方式不同而不 同。
段基址×10H+基址+变址+偏移量 偏移量:8位或16位 则以DS寄存器内容为段基址; 如果有效地址在BX,SI或DI中, (一)16位指令模式下的存储器寻址 16位指令模式寻址结构由4部分组成: 段基址×10H+基址+变址+偏移量 基址:BX、BP , 变址:SI、DI , 偏移量:8位或16位 如果有效地址在BX,SI或DI中, 则以DS寄存器内容为段基址; 如果有效地址在BP中,则以SS段寄存器 的内容为段基址。
如果使用段超越(CS:ES:DS:SS:), 前缀操作数可以放在冒号前指定的段。 例如:MOV ES:[DI],AL MOV ES:2000H, AL 其中ES为前缀字节,产生目标码时,它将放在MOV指令的前面, 即: 26 ES: 8805 MOV[DI],AL 亦即:268805 MOV ES:[DI],AL
操作数所在的有效地址EA直接由指令指出。 例2 MOV BL,BLOCK 例3 MOV BX,DATA1 16位指令模式寻址方式: 直接寻址 寄存器间接寻址 寄存器相对寻址 基址变址寻址 相对基址变址寻址 1、直接寻址 操作数在存储器单元中。 操作数所在的有效地址EA直接由指令指出。 例1 MOV AX,[3000H] 例2 MOV BL,BLOCK 例3 MOV BX,DATA1
例3.3 直接寻址
直接寻址过程示意
直接寻址动态示意
操作数的有效地址在BX、BP或SI、DI中,EA可表示为 例1 MOV AX,[BX] 例2 MOV DL,[SI] 2、寄存器间接寻址 操作数的有效地址在BX、BP或SI、DI中,EA可表示为 例1 MOV AX,[BX] 例2 MOV DL,[SI]
例3.4 寄存器间接寻址
寄存器间接寻址过程示意
寄存器间接寻址动态示意
操作数在存储单元中,其有效地址EA可表示为 3、寄存器相对寻址 操作数在存储单元中,其有效地址EA可表示为 例1 : MOV AL,[BX+4000H] 亦可写成: MOV AL,4000H[BX] 例2 : MOV AX,[BP+2000H]
例3.6 寄存器相对寻址
寄存器相对寻址过程示意
寄存器相对寻址动态示意
操作数在存储单元中,其有效地址EA可表示为 4、基址变址寻址 操作数在存储单元中,其有效地址EA可表示为 例1 MOV AX,[BX+SI] 或写成: MOV AX,[BX][SI] 例2 MOV AX,[BX+DI] 例3 MOV AX,[BP+SI] 例4 MOV AX,[BP+DI]
例3.7 基址变址寻址
基址变址寻址过程示意
基址变址寻址动态示意
操作数在存储单元中,其有效地址EA可表示为 5、相对基址变址寻址 操作数在存储单元中,其有效地址EA可表示为 例1: MOV AX,[BX+SI+1500H] 或写成 : MOV AX,1500[BX][SI] 例2 : MOV AX,[BP+DI+1000H]
例3.8 相对基址变址寻址
相对基址变址寻址过程示意
相对基址变址寻址动态示意
EBP时,默认段寄存器SS存放段选择符,否则, 默认DS存放段选择符。也可使用段超越前缀来 指定。 比例因子为1,2,4,8。偏移量为8位 (二) 32位指令模式下的存储器寻址 32位指令模式寻址结构由5部分组成: 段址+基址+变址﹡比例因子+偏移量 其中基址寄存器或变址寄存器可以是除ESP 以外的任何32位通用寄存器。当基址寄存器为 EBP时,默认段寄存器SS存放段选择符,否则, 默认DS存放段选择符。也可使用段超越前缀来 指定。 比例因子为1,2,4,8。偏移量为8位 或32位。
当偏移量为32位时,段内可寻址范围为: -231~+231-1字节空间。 32位寻址方式如下图: × + 比例因子 1,2,4,8 描述符 选择符 基 址 寄 存 器 × 偏 移 量 CS SS DS ES FS GS 物理基址 段限 访问权限 变址寄存器 + 线性 地址 +
1、直接寻址有两种书写格式 (1)、指令中直接写出操作数所在存储单元的32位有效地址(EA),注意:段超越前缀不能省略,否则,会出现寻址错误。 如:MOV EAX,DS:[11224488H] (2)、用变量名代表存储单元的有效地址 如:把数据段中以BUF命名的双字单元的内容送到EAX。 MOV EAX,DS:BUF MOV EAX,BUF
2、寄存器间接寻址,操作数的有效地址由EA(EAX、EBX、ECX、EDX、ESI、EDI、EBP)指定。 如:MOV EBX,UBF MOV EAX,[EBX] 3、相对基址寻址,操作数的有效地址由EA(EAX、EBX、ECX、EDX、ESI、EDI、EBP)+ 偏移量(8、32)指定。 如:MOV EAX,NUM ;NBM有效地址 MOV EDX,[EAX+80H]
4、变址寻址,有两种格式 1、有比例因子的变址寻址 如:MOV EBX,[ESI×4+80H] 2、无比例因子的变址寻址 MOV EBX,[ESI+80H] 5、基址加变址寻址,有两种格式 (1)、有比例因子的基址加变址寻址 如:MOV EAX,[EBP+ESI×4+80H]
(2)、无比例因子的基址加变址寻址 如:MOV EAX,[EBP+ESI+80H]
3.1.2 程序地址寻址方式 带符号的相对偏移量,程序目标地址为当 前IP值加上相对偏移量作为偏移地址。 相对寻址为段内寻址,指令中给出 3.1.2 程序地址寻址方式 一、相对寻址 相对寻址为段内寻址,指令中给出 带符号的相对偏移量,程序目标地址为当 前IP值加上相对偏移量作为偏移地址。 类 型 指 令 相对偏移量 转移范围 SHORT JMP 1 -128~127 NEAR(16位) JMP/CALL 2 -32768~32767 NEAR(32位) 4 -2147483648~ ﹢2147483647
地址 机器码 助记符 例如: 1D24:0100 8BF7 MOV DI,SI 1D24:0102 EB02 JMP SHORT NEXT 地址 机器码 助记符 1D24:0100 8BF7 MOV DI,SI 1D24:0102 EB02 JMP SHORT NEXT 1D24:0104 8ACA MOV CL,DL 1D24:0106 8AC3 NEXT: MOV AL,BL
二、 直接寻址 直接寻址是指指令中直接给出转移指令的目标地址。在段间转移中,指令中给出目标段地址或代码段的段描述符。 例如: ·COD CODE1 ;代码段定义 地址 机器码 助记符 1D24:0010 8BF7 MOV DI,SI 1D24:0012 EA0A00251D JMP FAR PTR NEXT ·CODE CODE2 ;代码段定义 1D25:000A 8ACA NEXT:MOV CL,DL
BUF——双字类型。在BUF所指的存储单元中存放着CODE2段中标号NEXT的段基址和偏移地址(1D25:0008)。 三、间接寻址 间接寻址 分段内和段间间接寻址,指令中以间接方式给出转移指令的目标地址,通常存放在数据段。采用(E)BP寻址,指令目标地址放在堆栈段。使用段超越前缀,也可以存放在其他段。 下面的例子为段间间接转移 指令。 BX中存放的是符号地址BUF的偏移地址 BUF——双字类型。在BUF所指的存储单元中存放着CODE2段中标号NEXT的段基址和偏移地址(1D25:0008)。
·CODE CODE1 ·CODE CODE2 1D26:0000 0800251D BUF DD NEXT 地址 操作数 ·DATA 1D26:0000 0800251D BUF DD NEXT ·CODE CODE1 地址 机器码 1D24:0010 BB0000 MOV BX,OFFSET DATA1 1D24:0013 FF2F JNP FAR PTR [BX] ; ·CODE CODE2 1D25:0008 8ACA NEXT:MOV CL,DL EXIT
CS:1D24 1D24:0010 BB 00 FF 2F 8A CA 08 25 1D MOV BX,OFFSET DATA1 IP:0010 DX:0000 JMP FAR PTR [BX] DS:1D26 1D25:0008 MOV CL,DL 1D26:0000 NEXT偏移地址 IP:0008 数据段 CS:1D25 NEXT段地址
3.1.3 堆栈地址寻址方式 用途:暂存数据,自动保护中断断点、调用过程 断点等,堆栈的存取方式是: 采用先进后出规则。 使用PUSH 指令将数据压入堆栈, 使用POP指令数据弹出堆栈。 字数据进栈步骤: 1、(E)SP-1→(E)SP 2、 高8位→堆栈 3、(E)SP-1→(E)SP 4、低8位→堆栈
字数据出栈步骤: 1、栈顶内容→目标寄存器或目标单元的低8位 2、(E)SP+1→(E)SP 3、栈顶内容→目标寄存器或目标单元的高8位 4、(E)SP+1→(E)SP
堆栈操作示意
思考题 (1)MOV AL,[1234H] (2)MOV EDX,[BX] (3)MOV CL,[BX+100H] 1、 设DS=2000H,SS=3000H,BP=0200H,SI=4000H,BUF=1000H,EAX=00001000H,EBX=00002000H,假设按16位实模式操作,确定下列每条指令访问内存的物理地址,并且指出源操作数及目的操作数的寻址方式。 (1)MOV AL,[1234H] (2)MOV EDX,[BX] (3)MOV CL,[BX+100H] (4)MOV [SI],EBX (5)MOV AH,BUF[BX+SI] (6)MOV EAX,[BP+1234H]
3.2 80X86指令格式 指令基本格式: 标号可有可无; 助记符必有,如:ADD ,MOV,IN,OUT。 操作数: 源操作数 可有可无。 [标号:] 助记符 目的操作数,源操作数;注释 标号可有可无; 助记符必有,如:ADD ,MOV,IN,OUT。 操作数: 源操作数 可有可无。 目的操作数
2、存储器操作数:需要通过寄存器间接寻址, 来到操作数所在存储单元的 地址。 立即数 8位:AH,AL,BH,BL,CH,CL,DH,DL 1、 通 用 寄存器: 16位:AX,BX,CX,DX,SI,DI,SP,BP 32位:EAX,EBX,ECX,EDX,ESI,EDI, ESP,EBP 2、存储器操作数:需要通过寄存器间接寻址, 来到操作数所在存储单元的 地址。
16位间接寻址的寄存器有:BX,BP,SI,DI; 32位间接寻址的寄存器有:EAX,EBX,ECX, EDX,ESI,EDI, EBP。 3、存储器操作数缺省数据类型: 8位指令操作为:字节类型; 16位指令操作为:字类型; 32位指令操作为:双字型,
在使用中如要改变地址表达式的类型,可使用PTR伪指令来定义。 如: 字节型 BYTE PTR [Reg] 字 型 WORD PTR [ Reg] 双字型 DWORD PTR [Reg] 如: INC WORD PTR [BX] 4、 段寄存器操作数(Seg),为16位的段寄存器: CS,DS,ES,SS,FS,GS。
5、立即数(imm):只能作为源操作数,其数据类型由目的操作数来决定。如果采用十六进制表示立即数,当大于9时,A~F的数必须在前面加“0”,后面加“H”。 对指令的分析应注意以下4点: (1)、指令的功能; (2)、适用于指令的寻址方式; (3)、指令对标志位的影响; (4)、指令长度和执行时间。
3.3 80X86指令系统 按功能分类: 数据传送指令 算术运算指令 逻辑运算指令 控制转移类指令 串操作指令 输入/输出指令 处理器控制指令 中断指令与DOS功能调用
3.3.1 数据传送指令 数据传送指令包括通用数据传送、地址传送指令、标志寄存器传送指令、符号扩展指令和扩展传送指令等。 通用数据传送指令 堆栈操作指令 地址传送指令 标志寄存器传送指令 查表指令 符号扩展指令
一、通用数据传送指令 1、传送指令格式: MOV Dest, Source 数据传送的路径方向于图示: ③ ② 立即数 ① 存储器 ⑤ ④ 通用 寄存器 ⑧ ⑥ CS 、DS、 ES、SS ⑨ ⑦
①、MOV REG ,REG;寄存器到寄存器 ②、 MOV REG ,IMM;立即数到寄存器 ③、 MOV MEM,IMM;立即数到存储器 ④、 MOV MEM,REG;寄存器到存储器 ⑤、 MOV REG ,MEM;存储器到寄存器 ⑥、 MOV SEGREG,REG;( CS除外) ⑦、 MOV REG, SEGREG;( 含CS) ⑧、 MOV SEGREG,MEM; (CS除外) ⑨、 MOV MEM, SEGREG;( 含CS)
如:MOV AL,CL MOV BX,[SI] MOV EAX,EBX MOV AX,0D56BH MOV EAX,[EBX+ESI]
2、交换指令 交换操作数的数据类型:字节型、字型、双字型。允许通用寄存器之间,通用寄存器与存储器之间交换数据。 格式: XCHG DEST,SRC 如:XCHG EAX,EBX;32位交换 XCHG AX,[SI];存储器与寄存器交换 XCHG AL,DL;8位交换 两操作数中不允许出现立即数 两操作数不允许同时为存储器操作数 两操作数数据类型必须一致
功能:取出 DS:[BX+ AL] 中的1个字节送给 AL ,或者取出DS:[EBX+AL]中的1个 字节送给AL。 3、字节交换指令 格式: BSWAP 32位寄存器 功能:将 位31 ~ 位24 与 位7 ~ 位0 交换, 位23 ~ 位 16 与位15 ~ 位8交换 4、 查表指令 格式: XLAT 表头变量名 功能:取出 DS:[BX+ AL] 中的1个字节送给 AL ,或者取出DS:[EBX+AL]中的1个 字节送给AL。
例如:字形编码:0——F,对应的表头为: MOV DS, 数据段基址 MOV BX, OFFSET TAB MOV AL, NUM TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH, DB 07H,7FH,6FH,77H,7CH,39H,5EH, DB 79H,71H NUM DB X X ;0 ~ 15 中的任一数所在表中的地址 MOV DS, 数据段基址 MOV BX, OFFSET TAB MOV AL, NUM XLAT TAB
3、扩展传送指令 MOVSX DEST,SRC MOVZX DEST,SRC 如 : MOV BL,80H MOVSX AX,BL ; AX=FF80H MOVZX AX,BL ;AX=0080H * 目的操作数为通用寄存器(16位或32位) * 源操作数长度必须小于目的操作数长度,为通用寄存器或存储器操作数(8位或16位)
使用MOV指令应注意: 立即数不允许直接送段寄存器,且立即数不能做目的操作数 源操作数和目的操作数不允许同时为存储器操作数 源操作数和目的操作数不允许同时为段寄存器 两操作数的数据类型要一致 传送操作不影响标志位 不允许对CS、(E)IP传送数据
二、堆栈操作指令 堆栈是人为定义的一块内存空间,用来暂存 数据的。堆栈能自动保护中断断点和现场以及调 用子过程的断点和现场等。对数据的存取按照 “先进后出”的规则进行。 堆栈的栈底在高端地址单元,栈顶为低端地 址。 当数据进栈后,栈顶向低端地址下浮; 当数据出栈后,栈顶向高端地址上浮。
一个16位或32位数据进栈的规律是: 高位字节压入高地址单元,低位字节压入低地址单元。 一个16位或32位数据出栈的规律是: 低位字节弹到目标操作数低位,高位字节弹到目标操作数高位。 栈顶位置由SP/ESP指出。
1、压栈指令 : PUSH SRC 如: PUSH AL PUSH AX PUSH EAX PUSH DS PUSH [SI] PUSH DWORD PTR [SI] PUSH 1234H PUSH 80H
2、出栈指令: POP DEST 如: POP 80H POP 1234H POP DWORD PTR [DI] POP [DI] POP DS POP [EAX] POP AX POP AL
(3)、16位标志寄存器进栈/出栈指令 (4)、32位标志寄存器进栈/出栈 (5)、8个16位通用寄存器进栈/出栈指令 PUSHF ;先PS-1→SP,16位标志压入SS:[SP] POPF ;先弹出16位标志到FLAGS,SP+2 →SP (4)、32位标志寄存器进栈/出栈 PUSHFD;先ESP -4→ESP,32位标志压入SS:[ESP] POPFD; 先弹出4字节标志到EFALGS,ESP+4 →ESP (5)、8个16位通用寄存器进栈/出栈指令 FUSHA ;先SP - 16 →SP, 然后把AX,BX,CX, DX,SP,BP,SI,DI的内容依次压栈, 进栈的SP值是调整前的值。
(6)、8个32位通用寄存器进栈出栈指令 PUSHAD ; 先ESP—32→ESP,把EAX,EBX, ECX,EDX,ESP,EBP,ESI,EDI 依次压入堆栈, 进栈的ESP值是调整 前的值。 POPAD ;先从堆栈弹出32字节( EDI ,ESI , EBP ,ESP ,EDX, ECX, EBX, EAX)。 然后 ,ESP+ 32→ESP。
三、地址传送指令 格式: LEA DEST,SRC *DEST为16位或32位通用寄存器 *SRC为16位或32位存储器操作数 例1:LEA BX,[SI+1005H] 若SI=1000H 则BX=? 例2:LEA DI,BLOCK MOV DI,BLOCK 有何区别?
四、标志寄存器传送指令 格式1:LAHF SAHF 格式2:PUSHF POPF 格式3: PUSHFD POPFD *SAHF、POPF、POPFD影响标志位
五、查表指令 格式: XLAT 指令规定:表格存于数据段中 表首偏移地址→BX 表内偏移量→AL 查找结果→AL 所找单元的物理地址: (DS)×10H+(BX)+(AL)
例:试编程将内存中以BLOCK为起始地址的编码表中顺序号为3的编码送AL寄存器。 查表指令应用举例 例:试编程将内存中以BLOCK为起始地址的编码表中顺序号为3的编码送AL寄存器。 LEA BX,BLOCK MOV AL, 3 XLAT 结果:AL内容为4FH
六、符号扩展指令 针对带符号数,按带符号数扩展。 1、CBW 功能:AL(8位)→AX(16位) 2、CWD 功能:AX(16位)→DX:AX(32位) 3、CWDE 功能:AX(16位)→EAX(32位) 4、CDQ 功能:EAX(32位)→EDX:EAX(64位)
3.3.2 算术运算指令 加法指令 减法指令 加1减1指令 比较指令 乘法指令 除法指令 BCD算术运算指令
算术运算类指令特点 影响标志位 操作数不允许为段寄存器 不允许两个操作数同为存储器操作数 若无特别规定,操作数类型必须一致 目的操作数不允许为立即数 当操作数类型不明确时必须使用PTR伪指令
一、加法指令 格式(1) ADD DEST,SRC 功能:源操作数+目的操作数→目的操作数 格式(2) ADC DEST,SRC 功能:源操作数+目的操作数+CF→目的操作数 例:32F2H+A020H=? MOV AX,32F2H 或 MOV AX,32F2H MOV BX,0A020H MOV BX,0A020H ADD AX,BX ADD AL,BL ADC AH,BH
二、减法指令 格式(1) SUB DEST,SRC 功能:目的操作数-源操作数→目的操作数 格式(2) SBB DEST,SRC 功能:目的操作数-源操作数-CF→目的操作数 *SUB、SBB指令与ADD、ADC一样,影响标志位OF、SF、ZF、AF,PF,CF
三、加1减1指令 加1指令 INC DEST 功能:目的操作数+1→目的操作数 减1指令 DEC DEST 功能:目的操作数-1→目的操作数 *不影响CF,影响OF、SF、ZF、AF、PF 例:INC BX INC BYTE PTR [BX] DEC EAX DEC WORD PTR[SI]
四、比较指令 格式 CMP DEST,SRC 功能:目的操作数-源操作数 (1)若目、源为无符号数 CF=0 则目≧源 (若ZF=1,则目=源) CF=1 则目﹤源 (2)若目、源为带符号数 ①若目、源为同号数(OF=0) 若均为正,SF=0 则目≧源(若ZF=1,则目=源) SF=1 则目﹤源 若均为负 ,SF=0 则目≧源(若ZF=1,则目=源)
②若目、源为异号数(OF=0或1) 若目为正,源为负 则目﹥源 若此时 SF=0 则OF=0 若此时 SF=1 则OF=1 若目为负,源为正 则目﹤源 若此时 SF=1 则OF=0 若此时 SF=0 则OF=1 综合起来,若目、源为带符号数 OF⊕SF=0 则目≧源 OF⊕SF=1 则目﹤源
五、交换相加指令 六、求补指令 格式 XADD DEST,SRC 功能:目的操作数+源操作数→目的操作数 且原目的操作数→源操作数 影响标志位OF、SF、ZF、AF、PF、CF 六、求补指令 格式 NEG DEST 功能:求目的操作数的相反数的补码
七、乘法指令 格式 MUL SRC (针对无符号数) IMUL SRC (针对带符号数) 隐含规定: 另一乘数因子在累加器中(AL/ AX / EAX) 结果为乘积,乘积隐含在(AX/DX:AX/EDX:EAX) ↑ ↑ ↑ 字节乘 字乘 双字乘 *若乘积高位为0,则CF=0,OF=0 若乘积高位含有效数据,则CF=1,OF=1 对其它标志位无定义
例:计算存于下列内存中的两个无符号数的乘积 1234H×2345H=?结果放RESULT单元 LEA BX,BLOCK MOV AX,[BX] MUL WORD PTR [BX+4] MOV RESULT,AX MOV RESULT+2,DX 结果为02820404H CF=1,OF=1
八、除法指令 格式 DIV SRC (针对无符号数) IDIV SRC (针对带符号数) 隐含规定: 被除数隐含在 ( AX/DX:AX/ EDX:EAX) 商隐含在 ( AL/ AX / EAX) 余数隐含在 ( AH/ DX / EDX) ↑ ↑ ↑ 字节除 字除 双字除 *当除数为0或商溢出时会产生中断 *被除数必须是除数的双倍长度,否则,需要进行高位扩展 无符号数高位扩展为全0,带符号数按符号扩展指令扩展
九、组合型BCD算术运算指令 组合BCD码也称压缩格式的BCD码,用一个字节存储2位BCD码。 该类指令使用场合: 当参与运算的十进制数以其组合BCD码形式存放,加减时,计算机会当作二进制数来运算,其结果一定不是理想要得的组合型BCD码结果,这时,必须用组合型BCD算术运算指令加以调整,即将二进制结果调整为BCD码表示形式。 加法调整指令一般紧跟在ADD或ADC之后,减法调整指令一般紧跟在SUB或SBB之后。
1、组合型BCD加法调整指令 格式 DAA 功能:AL(二进制和)→组合BCD码 例:26+68=? 分析:用组合BCD码存放时,两个数应分别为26H和68H,理想结果应该为94H。编程如下: MOV AL,26H MOV BL,68H ADD AL,BL ;AL=8EH DAA ;AL=94H
2、组合型BCD减法调整指令 格式 DAS 功能:AL(二进制差)→组合BCD码 例:65-56=? MOV AL,65H MOV BL,56H SUB AL,BL ;AL=0FH DAS ;AL=09H
十、非组合型BCD算术运算指令 非 组合BCD码也称非压缩格式的BCD码,用一个字节存储1位BCD码,高4位无意义。 3635H即0011011000110101B表示的数是65 由于0~9的ASCII码为30H~39H,机器采用一个字节存放一位ASCII码,所以,ASCII码是一种非组合型BCD码。 非组合型BCD调整指令有加、减、乘、除四种调整指令。
1、非组合型BCD加法调整指令 格式 AAA 功能:AL(二进制和)→非组合BCD码 例:5+9=? 分析:用非组合BCD码存放时,两个数应分别为05H和09H,理想结果应该为0104H。编程如下: MOV AL,05H MOV BL,09H ADD AL,BL ;AL=0EH AAA ;AX=0104H
功能:AL(二进制乘积)→非组合BCD码 4、非组合型BCD除法调整指令 格式 AAD 功能:AX(两位非组合BCD码)→二进制数 格式 AAS 功能:AL(二进制差)→非组合BCD码 3、非组合型BCD乘法调整指令 格式 AAM 功能:AL(二进制乘积)→非组合BCD码 4、非组合型BCD除法调整指令 格式 AAD 功能:AX(两位非组合BCD码)→二进制数 *AAD指令必须放在除法指令之前进行。 其他调整指令都是先运算后调整。
思考题 判断下列指令是否正确,若有错误,请指出原因,并改正。 (1)MOV BL,OFFSET BLOCK (2)LEA DI,[BX+SI] (3)PUSH AL (4)POP CS (5)MOV ES,DS (6)MOV AX,[SI+DI] (7)MOV [BX+BP],AX (8)ADD AX,F000H (9)MOV [BX],[SI] (10)MOV AH,DX (11)INC [BX] (12)XCHG AX,2000H (13)MOV AX,[BX+DX] (14)ADD [BX],BX (15)MOV AX,DI+SI (16)MOV EAX,[ECX*4+80H]
3.3.3 逻辑运算指令 包括:逻辑指令、移位指令、位操作指令 该类指令特点: 影响标志位 操作数不允许为段寄存器 3.3.3 逻辑运算指令 包括:逻辑指令、移位指令、位操作指令 该类指令特点: 影响标志位 操作数不允许为段寄存器 不允许两个操作数同为存储器操作数 若无特别规定,操作数类型必须一致 目的操作数不允许为立即数 当操作数类型不明确时必须使用PTR伪指令
一、逻辑指令 AND AL,00001111B 1、逻辑与指令 格式 AND DEST,SRC 功能:目的操作数∧源操作数→目的操作数 *常用来使目的操作数的某些位被屏蔽(即清0) 例:MOV AL,00111001B 若要使AL中高4位清0,低4位不变,怎么办? AND AL,00001111B
2、逻辑或指令 OR AL,11000000B 格式 OR DEST,SRC 功能:目的操作数∨源操作数→目的操作数 *常用来使目的操作数的某些位置1 例:MOV AL,00001001B 若要使AL中最高2位置1,低6位不变,怎么办? OR AL,11000000B
3、逻辑异或指令 XOR AL,10000001B 格式 XOR DEST,SRC 功能:目的操作数⊕源操作数→目的操作数 *①常用来使目的操作数的某些位变反 例:MOV AL,00001001B 若要使AL中D7、D0位变反,其它位不变 *②对寄存器操作数清0 例 XOR DS,DS *③测试一操作数与另一操作数是否相等 例 XOR AL,BL 若ZF=1,则AL=BL XOR AL,10000001B
TEST AL,10000000B 若ZF=0,则D7=1 4、逻辑非指令 格式 NOT DEST 功能:目的操作数按位取反→目的操作数 5、测试指令 格式 TEST DEST,SRC 功能:目的操作数∧源操作数 *常用来测试目的操作数的某位的状态(是0还是1) 或者用来测试目的操作数的某些位是否同时为0 例:若要测试AL中D7位为0还是为1,怎么办? TEST AL,10000000B 若ZF=1,则D7=0 若ZF=0,则D7=1
逻辑指令对标志位的影响 NOT 指令不影响标志位 AND、OR、XOR、TEST 指令影响标志位SF、ZF、PF,并且使CF=0,OF=0,对AF未定义
二、移位指令 1、移位分类 算术移位(A) 左移(L) 移位指令有:SAL、SAR、SHL、SHR ROL、ROR、RCL、RCR 非循环(S) 左移(L) 逻辑移位(H) 右移(R) 小循环移位(O)左移(L) 循环 (R) 右移(R) 大循环移位(C)左移(L) 移位指令有:SAL、SAR、SHL、SHR ROL、ROR、RCL、RCR
2、移位指令格式 DEST:表示目的操作数,(寄存器或存储器)OPRD:表示移位的次数,可以是立即数,也可 以由CL间接指定移位次数。 SAL DEST,OPRD SAR DEST,OPRD SHL DEST,OPRD SHR DEST,OPRD ROL DEST,OPRD ROR DEST,OPRD RCL DEST,OPRD RCR DEST,OPRD
3、移位示意图1(非循环移位) (a)SAL/SHL; (b)SAR; (c)SHR
4、移位示意图2(循环移位) (a)ROL; (b) ROR; (c)RCL; (d)RCR
5、对标志位的影响 SAL SHL 影响OF、SF、ZF、PF、CF SHR SAR ROL ROR 影响CF、OF RCL RCR
XOR AH,AH SAL AX,1 MOV BX,AX MOV CL,2 ;AH=0 ;AX=2X SAL AX,CL ;BX=2X 设一个字节数据X存放在AL 寄存器中,试分析下列程序段的功能。 XOR AH,AH SAL AX,1 MOV BX,AX MOV CL,2 SAL AX,CL ADD AX,BX ;AH=0 ;AX=2X ;BX=2X ; ;AX=4×(2X)=8X ;AX=8X+2X=10X 功能:10X→AX
三、位操作指令 1、位测试和设置指令 BT DEST,SRC (指定位送CF) BTC DEST,SRC (指定位送CF,该位取反) BTR DEST,SRC (指定位送CF,该位清0) BTS DEST,SRC (指定位送CF,该位置1) 如 MOV AX,1234H ;AX=0001001000110100B MOV CX,5 BT AX,CX ;CF=1,AX=1234H BTC AX,CX ;CF=1,AX=1214H BTS AX,CX ;CF=0,AX=1234H BTR AX,CX ;CF=1,AX=1214H
2、位扫描指令 BSF DEST,SRC BSR DEST,SRC 如 MOV AX,1234H ;AX=0001001000110100B 功能:从低位开始扫描SRC,若所有位为0,则ZF=0,否 则ZF=1,且将第一个出现1的位号存入DEST中。 BSR DEST,SRC 功能:从高位开始扫描SRC,若所有位为0,则ZF=0,否 则ZF=1,且将第一个出现1的位号存入DEST中。 如 MOV AX,1234H ;AX=0001001000110100B BSF BX,AX ;ZF=1,BX=0002H BSR DX,CX ;CF=1,AX=000CH
3、位标志指令 CLC (CF=0) STC (CF=1) CLD (DF=0) STD (DF=1) CLI (IF=0) STI (IF=1) 4、条件设置字节指令 格式:SETCOND DEST 功能:测试条件(COND)若为真,则将DEST置01H,否则置00H。见P87的表3.3
3.3.4 控制转移类指令 该类指令不影响标志位。 无条件转移指令 条件转移指令 循环控制指令
一、无条件转移指令 TARGET:目标标号 REG:通用寄存器 1、段内直接转移 JMP TARGET 2、段内间接转移 JMP REG JMP NEAR PTR [REG] 3、段间直接转移 JMP FAR PTR TARGET 4、段间间接转移 JMP FAR PTR [REG]
二、条件转移指令 JO TARGET ;OF=1,即溢出转 1、单标志位条件转移指令 JNO TARGET ;OF=0,不溢出转移 JS TARGET ;SF=1,结果为负转移 JNS TARGET ;SF=0,结果为正转移 JC TARGET ;CF=1,有进位转移 JNC TARGET ;CF=0,无进位则转移 JP TARGET ;PF=1,为偶转移 JNP TARGET ; PF=0,为奇转移 JE/JZ TARGET ;ZF=1,等于或为零转移 JNE/JNZ TARGET ;ZF=0,等于或非零转移
例:在不改变AL值的同时,检测AL 中1的个数,且存放在BL中。 .MODEL TINY .CODE .STARTUP MOV BL,0 MOV DL,8 AGAIN: ROL AL,1 JNC NEXT INC BL NEXT: DEC DL JNZ AGAIN .EXIT END
2、无符号数比较条件转移指令 助记符: J→转移 A→高于 B→低于 E→等于 N→不 指令: JA/JNBE TARGET ;高于/不低于等于转移 JAE/JNB TARGET ;高于等于/不低于转移 JB/JNAE TARGET ;低于/不高于等于转移 JBE/JNA TARGET ;低于等于/不高于转移
3、带符号数比较条件转移指令 J→转移 G→大于 L→小于 E→等于 N→不 JG/JNLE TARGET ;大于/不小于等于转移 JGE/JNL TARGET ;大于等于/不小于转移 JL/JNGE TARGET ;小于/不大于等于转移 JLE/JNG TARGET ;小于等于/不大于转移 4、测试CX条件转移指令 JCXZ TARGET ;CX=0 转移 JECXZ TARGET ;ECX=0 转移
使用条件转移指令应注意: *条件转移指令一般跟在CMP指令或TEST指令之后,根据其影响的标志位来决定是否产生转移。 *当条件满足时,转移到目标标号去执行,否则,顺着程序往下执行。
例3.65 假设AL中带符号数X为某值,试编程将求出的符号函数值f(x)存放在AH中。 .MODEL TINY .CODE .STARTUP CMP AL,0 JGE BIG MOV AL,0FFH JMP DONE BIG: JE DONE MOV AL,1 DONE: MOV AH,AL .EXIT END
三、循环控制指令 格式:LOOPCC TARGET 功能:(E)CX—1→ (E)CX,不影响标志位,且测试条件‘CC’成立,则转移到TARGET处执行. LOOP ; CX—1→ CX,若CX≠0则循环 LOOPW ;同上 LOOPD ; ECX—1→ ECX,若ECX≠0则循环 LOOPE/LOOPZ ; CX—1→ CX,若CX≠0且ZF=1则循环 LOOPEW/LOOPZW ;同上 LOOPED/LOOPZD ; ECX—1→ ECX,若ECX≠0且ZF=1则循环 LOOPNE/LOOPNZ ; CX—1→ CX,若CX≠0且ZF=0则循环 LOOPNEW/LOOPNZW ;同上 LOOPNED/LOOPNZD ; ECX—1→ ECX,若ECX≠0且ZF=0则循环
例3.68 找出以ARRAY为首地址的100个字数组中的第一个非0项,送AX寄存器中. .MODEL SMALL .DATA ARRAY DW 0, 0, 0, 0, 1010H, … ;(100个字) .CODE .STARTUP MOV CX, 64H LEA BX, ARRAY MOV SI, 0FFFEH ZERO: INC SI INC SI CMP WORD PTR [BX+SI], 0 LOOPZ ZERO JCXZ A1 MOV AX, [BX+SI] A1: NOP .EXIT END
3.3.5 串操作指令 几个概念: 串 串元素 串操作 有关隐含约定: ①寻址: 以DS:(E)SI寻址源串, 以ES:(E)DI寻址目的串 3.3.5 串操作指令 几个概念: 串 串元素 串操作 有关隐含约定: ①寻址: 以DS:(E)SI寻址源串, 以ES:(E)DI寻址目的串 每次串操作后, (E)SI和(E)DI自动指向下一串元素 ②地址移动方向: 当DF=0时, (E)SI和(E)DI的修改为增量 当DF=1时, (E)SI和(E)DI的修改为减量 ③ (E)SI和(E)DI初始赋值 若DF=0, 赋首偏移地址 若DF=1, 赋末偏移地址
一、重复前缀指令 REP REPE/Z REPNE/REPNZ 二、方向标志指令 CLD ; (DF=0) STD ; (DF=1) 说明:在串操作指令之前若加上REP,则执行一次串操作后不仅自动修改(E)SI和(E)DI ,而且执行(E)CX—1→( E)CX ,若(E)CX≠0,再次重复串操作,直到(E)CX=0为止。 REPE/Z 说明: (E)CX—1→( E)CX,若(E)CX≠0且ZF=1,则重复 REPNE/REPNZ 说明: (E)CX—1→( E)CX,若(E)CX≠0且ZF=0,则重复 二、方向标志指令 CLD ; (DF=0) STD ; (DF=1)
[REP] MOVSB/MOVSW/MOVSD 三、串传送指令 [REP] MOVSB/MOVSW/MOVSD 功能:将DS:(E)SI的内容复制到ES:(E)DI中 例3.69 将以SRC开头的100个字节传送到以DEST开头的单元中. .MODEL SMALL .DATA MOV CX,100 SRC DB 1,2,3, …;(100个字节) LEA SI, SRC DEST DB 100 DUP(?) LEA DI, DEST .CODE CLD .STARTUP REP MOVSB MOV AX,@DATA .EXIT MOV ES,AX END
[REPE/Z] [REPNE/NZ]CMPSB/CMPSW/CMPSD 四、串比较指令 [REPE/Z] [REPNE/NZ]CMPSB/CMPSW/CMPSD 功能:将DS:(E)SI的内容-ES:(E)DI的内容 例3.70 .MODEL SMALL .DATA LEA DI, DEST SRC DB ‘A B C D E F G H’ CLD DEST DB ‘A B C E F F F E’ REPE CMPSB SUT DB ? JZ EQUL .CODE MOV BH,0 .STARTUP JMP DONE MOV AX,@DATA EQUL:MOV BH, 0FFH MOV ES,AX DONE:MOV SUT,BH MOV CX, 8 .EXIT LEA SI, SRC END
[REPE/Z] [REPNE/NZ]SCASB/SCASW/SCASD 五、串扫描指令 [REPE/Z] [REPNE/NZ]SCASB/SCASW/SCASD 功能:将AL或AX或EAX的内容-ES:(E)DI的内容 例3.70 .MODEL SMALL MOV AL,’C’ .DATA CLD DEST DB ‘A B C D E F ’ REPNE SCASB ADDR DW ? JZ EQUL .CODE MOV DI,0 .STARTUP JMP DONE MOV AX,@DATA EQUL:DEC DI MOV ES,AX DONE:MOV ADDR,DI MOV CX, 6 .EXIT LEA DI, DEST END
LODSB/LODSW/LODSD 六、串装入指令指令 功能:将DS:(E)SI所指的串元素装入AL或AX或EAX中 七、串存储指令指令 [REP]STOSB/STOSW/STOSD 功能:将AL或AX或EAX中的内容存入ES:(E)DI所指的目的串单元中
3.3.6 输入/输出指令 一、输入/输出指令 几个概念: I/O端口 输入 输出 有关约定: ①操作数 3.3.6 输入/输出指令 一、输入/输出指令 几个概念: I/O端口 输入 输出 有关约定: ①操作数 两操作数分别是端口地址内容和累加器(AL或AX或EAX)内容。 ②寻址: 直接寻址(8位端口地址,0~255) 间接寻址(16位端口地址,由DX指定,寻址64K) ③ 端口地址数据长度 每个端口数据长度均为8位
1、输入指令 IN DEST,SRC 其中,DEST可以是AL或AX或EAX SRC可以是8位端口地址或DX 如:IN AL,80H IN AX,80H IN EAX,80H MOV DX,6000H IN AL,DX IN AX,DX IN EAX,DX
2、输出指令 OUT DEST,SRC 其中,DEST可以是8位端口地址或DX SRC可以是AL或AX或EAX 如:OUT 80H, AL OUT 80H,AX OUT 80H, EAX MOV DX,6000H OUT DX,AL OUT DX,AX OUT DX,EAX
二、串输入/输出指令 外设端口与存储器单元之间传送数据 1、串输入指令 [REP] INSB/INSW/INSD 功能:将DX指定的端口地址的内容→ES:(E)DI。每输入一次,(E)DI自动修改。加前缀可重复传送。 如: … MOV AX,@DATA MOV ES,AX MOV CX,100 CLD LEA DI,BLOCK MOV DX,6000H REP INSB …
2、串输出指令 [REP] OUTSB/OUTSW/OUTSD 功能:将DS:(E)SI → DX指定的端口地址。每输入一次,(E)SI自动修改。加前缀可重复传送。 如: … MOV CX,100 CLD LEA SI,BLOCK MOV DX,6000H REP OUTSB …
3.3.7 处理器控制指令 1、空操作 NOP 2、处理器等待指令 WAIT 3、处理器暂停指令 HLT
3.3.8 中断指令与DOS功能调用 一、中断指令 1、软中断指令 INT n 其中,n为中断类型码,是一个8位的立即数 2、中断返回指令 IRET IRETD
二、DOS功能调用 总入口:INT 21H DOS功能调用步骤: (1)入口参数→指定的寄存器 (2)功能号→AH (3)INT 21H 常用功能子程序 功能号 键盘输入单字符 01H 键盘输入字符串 0AH 输出单字符 02H 输出字符串 09H 返回操作系统 4CH DOS功能调用步骤: (1)入口参数→指定的寄存器 (2)功能号→AH (3)INT 21H (4)取出口参数
1、键盘输入单字符 例: MOV AH,01H INT 21H 键入的字符以ASCII码形式存于AL中。 2、输出单字符 例: MOV DL,’A’ MOV AH,02H INT 21H 入口参数事先要存入DL中。 3、返回操作系统 MOV AH,4CH
3、键盘输入字符串 例 .MODEL SMALL .DATA BUF DB 20, ?, 20 DUP (?) .CODE .STARTUP MOV DX,OFFSET BUF MOV AH, 0AH INT 21H .EXIT END 键入的字符串以ASCII码形式存于BUF第3个字节开始的内存单元中。第一个字节存字符串最大字节数,第二字节由系统送入实际键入的字节数。
4、输出字符串 例 .MODEL SMALL .DATA BUF DB ‘Hi,good luck!’,’$’ .CODE .STARTUP LEA DX, BUF MOV AH, 09H INT 21H .EXIT END 要输出的字符串必须以’$’作为结束标志。
例3.66 编程实现把BX中的二进制数用十六进制形式显示出来。 .MODEL TINY .CODE .STARTUP MOV CH,4 AGAIN: MOV CL,4 ROL BX,CL NEXT:MOV DL,AL MOV AL,BL MOV AH,2 AND AL,0FH INT 21H OR AL,30H DEC CH CMP AL,3AH JNZ AGAIN JB NEXT .EXIT ADD AL,07H END