1.11k likes | 1.34k Views
第二章 80x86 汇编语言程序设计. 操作码 操作数 ··· 操作数. 第一节 80x86 的寻址方式. 指令格式: 操作码 -- 应包含操作类型和操作数类型; 操作数 -- 可以是数据或用地址表示。 说明 — 操作数类型 (8/16/32 位、有 / 无符号等 ) 可在操作码或操作数字段中表示 (Intel 为后者 ). 存放操作数字段数据的部件: 寄存器、存储器、 I/O 接口,指令和堆栈。
E N D
操作码 操作数 ···操作数 第一节 80x86的寻址方式 指令格式: 操作码--应包含操作类型和操作数类型; 操作数--可以是数据或用地址表示。 说明—操作数类型(8/16/32位、有/无符号等)可在操作码或操作数字段中表示(Intel为后者) 存放操作数字段数据的部件: 寄存器、存储器、I/O接口,指令和堆栈。 说明--①寄存器、存储器、I/O接口均独立编址,分别构成从0编址的寄存器空间、存储器空间、I/O空间; ②指令中,堆栈不用地址表示,通过操作码表示。 寻址方式:产生操作数或其有效地址的方法。
80x86的寻址方式: 说明:与比例有关的寻址方式在80386及以后CPU中才出现; I/O空间和存储器的对应寻址方式表示形式不同。
存储器的有效地址(EA)与物理地址(PA): 有效地址—基于段的地址(段内偏移地址); EA=基址 +(变址*比例因子)+位移量 物理地址—基于存储器空间的地址。 实地址模式的PA=段地址×10H+EA 保护模式的PA=段地址的映像及变换+EA 回9页
存储器有效地址生成的相关约定: 存储器物理地址生成中的相关约定: a.访存操作选择默认段寄存器规则— 取指操作和相对IP寻址的访存操作—代码段CS, 堆栈操作和用ESP/EBP为基址的访存操作—堆栈段SS, 串处理指令的目的串的访存操作—附加数据段ES, 除堆栈和串处理的除目的串外的访存操作—数据段DS。 回下页 回9页 回13页
b.指令中访问非默认段数据方法—段超越 可使用段超越前缀方式指明所访问数据所在的段。 段超越前缀种类:CS:、DS:、SS:、ES:、FS:、GS:。 段超越示例: MOV AX,[10H] ;DS段10H处的一个字的数据 ;赋给AX寄存器 MOV AX,ES:[10H] ;ES段10H处的一个字的数据 ;赋给AX寄存器 不允许使用段超越前缀的情况: (1)串处理指令的目的串必须用ES段; (2)压栈/出栈指令的目的/源段必须用SS段; (3)与程序中指令有关的操作必须用CS段。 转上页
代码段 代码段 AH AX 低 高 … 操作码 D8H … … 操作码 60H 50H … D8H 60H 50H 低位在前 示例⑴示意图 示例⑵示意图 注:操作码中含目的操作数(有时独立占一定信息位) 1、立即寻址 操作数存放在指令中(以常量形式)。 示例:⑴MOV AH, -40;0C0H(-40)→AH ⑵MOV AX, 5060H;50H→AH, 60H→AL ⑶MOV EAX, 12345678H;12345678H→EAX 说明:80x86的操作数类型在地址码中表示 应用:适合于对常数的操作。
2、寄存器寻址 操作数存放在指令所指定寄存器号的寄存器中。 示例: MOV AH, BL ;(BL)→AH MOV DS, AX ;(AX)→DS MOV SI, AX ;(AX)→SI MOV ECX, EDX ;(EDX)→ECX 错误示例: MOV CS, AX ;CS不能为MOV目的寄存器 MOV IP, BX ;IP不能做MOV目的寄存器 MOV AX, CL ;目的与源REG类型(位数)不同 MOV BH, DX ;目的与源REG类型(位数)不同 应用:适合于对频繁使用的数据的操作。
代码段 … 3100H 22H … 数据段 30100H 11H … 3、直接寻址 存储器操作数的有效地址直接存放在指令中, 即:EA=指令地址码字段内容。 示例1:MOV AL, [100H] 若(DS)=3000H, 则PA=3000H*10H+100H=30100H (AL)=11H 示例2:MOV BL, ES:[100H] 若(DS)=3000H,(ES)=2000H, 则PA=2000H*10H+100H=20100H。 示例3:MOV AL,BUF或MOV AL,[BUF]表示将从BUF开始的内容送AL,BUF以预先定义地址。 说明:汇编语言允许用符号(变量或标号)地址代替数值地址。 转4页 转5页
4、寄存器间接寻址 存储器操作数的有效地址存放在指令所指定寄存器中,即:EA=(寄存器)。 寄存器的使用限制—
示例1:MOV AL, [BX] ;PA=(DS)*10H+(BX) MOV AX,CS:[SI];PA=(CS)*10H+(SI) MOV ECX, [EDX];PA=(EDS)*10H+(EDX) MOV AH, [BP] ;PA=(SS)*10H+(BP) 示例2:MOV AH, [BP] MOV BX, [SI] 设(SS)=100H,(DS)=200H,(BP)=0B0H,(SI)=2AH 则第一条指令PA=(SS)*10H+(BP) =1000H+0B0H=10B0H; 第二条指令PA=(DS)*10H+(SI) =2000H+2AH=202AH。 应用:适合于对复杂数据结构的数据元素寻址。
5、寄存器相对寻址(基址寻址或变址寻址) 操作数的有效地址为相对于指令所指定寄存器中地址的偏移地址,即:EA=(寄存器)+位移量。 寄存器的使用限制—与寄存器间接寻址方式相同。 示例1:MOV AX,300H[SI] (或MOV AX,[SI+300H]) 若(DS)=3000H,(SI)=2000H 则PA=(DS)*10H+(SI)+300H=32300H 示例2:MOV AX,BUF[SI] (或MOV AX,[SI+BUF]) 若BUF=300H,则与上例一致。 说明:汇编语言允许定义数据变量,所在存储器位置称为符号地址,与指令的地址标号不同(所用段寄存器不同)。 应用:适合于动态再定位和对数组元素的访问。
6、基址变址寻址 操作数的有效地址由指令所指定的基址REG与变址REG的内容相加而成,即:EA=(基址REG)+(变址REG)。 寄存器的使用限制— 示例:MOV AX, [BX][DI] (亦可表示为 MOV AX,[BX+DI]) 若(DS)=2000H,(BX)=1000H,(DI)=100H 则物理地址=(DS)*10H+(BX)+(DI)=21100H 应用:适合于对多维数组等复杂结构元素的访问。 转5页
7、基址变址相对寻址 操作数的有效地址为相对于指令所指定的基址REG与变址REG的内容相加的地址的偏移地址, 即:EA=(基址REG)+(变址REG)+位移量。 寄存器的使用限制— 与基址变址寻址方式相同。 示例:MOV AX, 34H[BX][DI] (亦可表示为 MOV AX,34H[BX+DI]) 若(DS)=2000H,(BX)=1000H,(DI)=100H 则PA=(DS)*10H+(BX)+(DI)+34H=21134H 应用:适合于对多维数组等复杂结构元素的访问。
8、比例变址寻址 操作数的有效地址为相对于指令所指定的变址REG内容和比例因子相乘的地址的偏移地址, 即:EA=(变址REG)*比例因子+位移量。 寄存器的使用限制— 与基址变址寻址方式中变址REG限制相同。 示例:MOV AX, 200H[ESI*8] 若(DS)=2000H,(ESI)=4 则PA=(DS)*10H+(ESI)*4+200H=20220H 应用:适合于对结构数组等复杂结构元素的访问。
9、基址比例变址寻址 操作数的有效地址为指令所指定的变址REG内容和比例因子相乘后与基址REG内容相加的地址, 即:EA=(基址REG)+(变址REG)*比例因子。 寄存器的使用限制— 与基址变址寻址方式相同。 示例:MOV AX, [EBX+ESI*8] 应用:适合于对结构数组等复杂结构元素的访问。
10、相对基址比例变址寻址 操作数的有效地址为相对于指令所指定的变址REG内容和比例因子相乘后与基址REG内容相加的偏移地址, 即:EA=(基址REG)+(变址REG)*比例因子+位移量。 寄存器的使用限制— 与基址变址寻址方式相同。 示例:MOV AX, 200H[EBX+ESI*8] 应用:适合于对矩阵、结构数组等复杂结构元素的访问。
各种寻址方式比较 注:①(X)—X的内容;SR—段REG;A—位移量;B—基址REG I—变址REG;S—比例因子;LA—线性地址 ②采用32位寄存器时,B、I基本可为任意通用寄存器
第二节 80x86的指令系统 指令系统概况: 指令系统—{指令i},1≤i≤N; 指令格式— 格式定义:[前缀]操作码{[操作数][,操作数]} 操作数类型:整数(长度/符号)、浮点数、指针、位域数、串数据、SIMD数据、BCD/压缩BCD数据 特性:定长/变长、寻址方式种类及其表示 指令表示形式: 二进制格式—通过二进制编码串描述具体指令; ☆汇编语言格式—通过助记符形式描述具体指令。
80x86指令的汇编语言一般格式: [标号:]指令助记符[目的操作数][,源操作数][;注释] 说明--①标号又称地址标号,表示指令的地址(符号地址) ②80x86目的操作数在前,源操作数在后 ③操作数可用立即数、地址码形式表示 80x86指令系统指令类型: ⑴数据传送类指令 ⑷控制转移类指令 ⑵算术运算类指令 ⑸串操作类指令 ⑶逻辑运算与移位类指令 ⑹处理器控制类指令
一、数据传送类指令 包含通用数据传送、地址传送、标志传送、输入输出、类型转换5种子类型的指令。 1、通用数据传送指令 MOV(move) 传送 MOVSX(move with sigh-extend) 带符号扩展传送 MOVZX(move with zero-extend) 带零扩展传送 PUSH(push onto the stack) 进栈 POP(pop from the stack) 出栈 PUSHA/PUSHAD(push all registers) 所有寄存器进栈 POPA/POPAD(pop all registers) 所有寄存器出栈 XCHG(exchange) 交换 XLAT(translate) 换码(查表) MOVSX、MOVSZ、PUSHA/PUSHAD、POPA/POPAD非8086指令
(1)MOV 传送指令 格式:MOV DST,SRC 操作:DST←(SRC) 即把源操作数的内容送入目的操作数 说明:1)SRC、DST操作数允许类型见下图 2)SRC、DST数据类型应相同 3)可进行8/16/32位数据传送,由操作数类型确定 4)该指令不影响任何状态标志位 段寄存器 DS ES SS CS 通用寄存器 AX BX CX DX BP SP SI DI 指令指针 寄存器IP 标志寄存器FLAG 立即数 存储器 回24页 回25页 回段REG指定
… 6000H 23H 0BH … 33000H 0BH 34H … MOV指令例1: MOV AL,BL ;寄存器间传送(数据长度一致) MOV BP,SI MOV EAX,[EBX+ECX*4] ;存储器→寄存器(数据长度 MOV AX,ARRAY[SI] ; 由REG决定) MOV AX,0B00H ;立即数→寄存器(数据长度 MOV CL,10000000B ; 由REG决定) MOV VALUE, 100H ;立即数→存储器(数据长度 MOV ES:[BX], 4BH ; 由VALUE决定) MOV [BX], CX ;寄存器→存储器 MOV BUFF[BP][DI], AX MOV指令例2:MOV AX, 1000H[SI] 设(DS)=3000H,(SI)=2000H 则PA=33000H,(AX)=340BH
注意事项:(☆理解前二页示意图) ①两个操作数长度必须一致 MOV AL, BX ;不合法,数据类型不一致 MOV AX, 0B4H;合法,执行后 (AX)=0FFB4H ;源为立即数,长度小于目的寄存器 ;位数时,高位按符号位方式扩展 MOV AX,[100H];合法,存储器操作数长度由寄存器 MOV [SI],AL;操作数长度决定 MOV [DI],1234H;[DI]所指存储单元未定义为字类 ;型时不合法,可通过寄存器中转 MOV BYTE PTR[SI],40;合法,将类型通知汇编程序 转22页
②不允许两个操作数均是存储器操作数 MOV X, Y ;不合法 可通过寄存器中转传送:MOV AX, Y MOV X, AX ③不允许两个操作数均为段寄存器 不允许用立即数为段寄存器赋值 ④不允许CS、立即数做目的操作数 MOV CS, AX ;不合法 MOV 100H, AX ;不合法 ⑤不允许IP做操作数 ⑥表示目的存储器操作数数据类型的方法: MOV BYTE PTR[SI], 40 ;指定数据类型 MOV VALUE, 40 ;通过伪指令定义变量类型 转22页
(2)MOVSX/MOVZX 带符号/零扩展传送指令 格式:MOVSX DST,SRC MOVZX DST,SRC 操作:DST←符号扩展(SRC) DST←零扩展(SRC) 即把源操作数的内容扩展后送入目的操作数 说明:1)SRC可为寄存器、存储器操作数,不可为立即数 2)DST只可为寄存器操作数 3)可进行8/16位数据传送,SRC位数应小于DST位数 4)该指令不影响任何状态标志位
MOVSX指令示例: MOVSX EAX,CL 设(CL)=0ABH, 执行结果(EAX)=0FFFFFFABH;负号扩展 若(CL)=57H, 执行结果(EAX)=000000057H;正号扩展 MOVZX指令示例: MOVZX EAX,DATA 设(DATA)=87ADH, 执行结果(EAX)=000087ADH;零扩展
(3)PUSH 压栈指令 格式:PUSH SRC 16位操作: SP←(SP)-2 ((SP)+1,(SP))←(SRC) 32位操作: ESP←(ESP)-4 ((ESP)+3,(ESP)+2,(ESP)+1,(ESP))←(SRC) 说明:1)SRC可为寄存器、存储器操作数 8086后SRC可为立即数 2)SRC必须为16/32位,立即数SRC可自动扩展 3)该指令不影响任何状态标志位
执行后 低地址 执行前 低地址 SP 35H 24FEH 24FFH 21H 2500H SP 2500H 进栈方向 示例1:PUSH AX PUSH DAT[BX][SI] ;注意寻址方式中REG PUSH 1234H PUSH 87654321H 示例2:PUSH AX 设(AX)=2135H
(4)POP 出栈指令 格式:POP DST 16位操作: DST←((SP)+1,(SP)) SP←(SP)+2 32位操作: DST←((ESP)+3,(ESP)+2,(ESP)+1,(ESP)) ESP←(ESP)+4 说明:1)DST可为寄存器、存储器操作数 2)DST必须为16/32位 3)该指令不影响任何状态标志位
执行前 执行后 低地址 低地址 AX SP 43H 2500H 43H 2500H 6F 43 2501H 2501H 6FH 6FH AX 33H 33H 2502H SP 2502H 28H 28H 2503H 2503H 21 3D 出栈方向 示例1:POP AX POP DAT[BX][SI] POP DX 示例2:POP AX
(5)PUSHA/PUSHAD 所有寄存器压栈指令 格式:PUSHA PUSHAD 16位操作:①16位通用寄存器AX、CX、DX、BX、SP、BP、SI、DI的内容按顺序压栈 ②SP←(SP)-16 32位操作:①32位通用寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI的内容按顺序压栈 ②ESP←(ESP)-32 说明:1)压栈时的SP和ESP的内容为指令执行前的内容 2)该指令不影响任何状态标志位
(6)POPA/POPAD 所有寄存器出栈指令 格式:POPA POPAD 16位操作:①16位通用寄存器DI、SI、BP、SP、BX、DX、CX、AX的内容按顺序出栈 ②SP←(SP)+16 32位操作:①32位通用寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX的内容按顺序出栈 ②ESP←(ESP)+32 说明:1)指令执行后SP或ESP的内容与栈中弹出的SP或ESP的内容无关 2)该指令不影响任何状态标志位
(7)XCHG 交换指令 格式:XCHG OPER1,OPER2 操作:(OPER1)←→(OPER2) 说明:1)OPER1和OPER2可为寄存器、存储器操作数,但绝不允许为段寄存器,且不允许同时为存储器操作数 2)OPER1和OPER2数据长度必须相同 3)该指令不影响任何状态标志位 示例: XCHG EAX, EBX ;寄存器间交换 XCHG BX, [BP+DI] ;寄存器与存储器间交换 XCHG DS, EX ;不合法 XCHG [SI], [DI] ;不合法
40H TABLE +1 +2 +3 +4 +5 41H 42H AL 43H 44H 44H 45H (8)XLAT 查表指令 格式:XLAT TABLE 或XLAT 操作:AL←((BX)+(AL))或AL←((EBX)+(AL)) 说明: 1)操作前必须先将表首址(TABLE)送给BX,再将目标项与距表头的偏移量送给AL 2)该指令不影响任何状态标志位 示例: LEA BX,TABLE ;表首址给BX MOV AL,4 ;偏移量给AL XLAT
2、地址传送指令 LEA (load effective address) 有效地址送寄存器 LDS (load DS with pointer) 地址指针送寄存器和DS LES (load ES with pointer) 地址指针送寄存器和ES LFS (load FS with pointer) 地址指针送寄存器和FS LGS (load GS with pointer) 地址指针送寄存器和GS LSS (load SS with pointer) 地址指针送寄存器和SS LFS、LGS、LSS非8086指令。
1234H SI 40H 21234H 21235H 41H BX 1234H (1)LEA 取有效地址指令 格式:LEA DST, SRC 操作:DST←SRC的有效地址EA 说明:1)SRC必须是存储器操作数 2)DST必须是16位或32位通用寄存器 3)该指令不影响任何状态标志位 示例1: LEA SI,[BX] 设(DS)=2000H,(BX)=1234H 执行后 示例2: LEA DI,BUFF ;将BUFF的有效 ;地址送DI,而 ;非将BUFF的值 ;送DI
(2)LDS 装载数据段地址指针指令 格式:LDS DST,SRC 操作:DST←(SRC) 或 DST←(SRC+2,SRC) DS←(SRC+2) DS←(SRC+4) 说明:1)SRC必须是存储器操作数 2)DST必须是16位或32位通用寄存器 3)该指令不影响任何状态标志位 LES、LFS、LGS、LSS指令: 格式--同LDS,仅操作助记符不同 操作—同LDS,仅目标段寄存器不同
40H 21000H 21001H 21002H 21003H 执行前 执行后 41H 40H 21000H 21001H 21002H 21003H 42H 1234H 4140H DI DI 41H 43H 42H DS DS 2000H 4342H 43H LDS指令示例1:LDS DI,[BX] 设(DS)=2000H,(BX)=1000H LDS指令示例2:LEA SI,BUFF (与LEA比较) LDS DI,BUFF 设(DS)=2000H,EABUFF=1000H 执行后 (SI)=1000H (DI)=4140H,(DS)=4342H
3、标记传送指令 LAHF(load AH with flags) 取标志到AH SAHF(store AH into flags) 从AH存标志 PUSHF/PUSHFD(push the flags or eflags) 标志进栈 POPF/POPFD(pop the flags or eflags) 标志出栈 PUSHFD、POPFD非8086指令。
(1)LAHF 取FLAG标志寄存器指令 格式:LAHF 操作:AH←(FLAG)7~0 将FLAG标志寄存器的低8位送到AH中。 说明:该指令不影响标志状态位。 (2)SAHF 存FLAG标志寄存器指令 格式:SAHF 操作:FLAG7~0←(AH) 将AH的内容存到FLAG标志寄存器的低8位中。 说明:该指令改变SF、ZF、AF、PF、CF标志。
(3)PUSHF/PUSHFD FLAG标志寄存器进栈指令 格式:PUSHF和PUSHFD 操作:SP←(SP)-2 ((SP)+1,(SP))←(FLAG) 和ESP←(ESP)-4 ((ESP)+3,(ESP)+2,(ESP)+1,(ESP)) ←(EFLAG) AND 0FCFFFFH (4)POPF/POPFD FLAG标志寄存器出栈指令 格式:POPF和POPFD 操作:FLAG←((SP)+1,(SP)) SP←(SP)+2 和EFLAG←((ESP)+3,(ESP)+2,(ESP)+1,(ESP)) ESP←(ESP)+4
4、输入输出指令 IN(input) 从I/O接口空间读数据 OUT(output) 向I/O接口空间写数据 I/O接口空间大小: 16根地址线、每个地址对应1个8位空间; 即64K个8位空间=32K个16位空间=16K个32位空间。 I/O接口空间内数据的传输方式: 支持8位、16位、32位数据传输; 16位和32位传输时,地址需按整数边界对齐。 8086不支持32位数据传输。
I/O空间的寻址方式: 只支持直接寻址、(寄存器)间接寻址两种。 说明— ①直接寻址只支持8位的地址(高8位为0); ②(寄存器)间接寻址只能使用DX寄存器(16位); ③寻址方式格式与存储器操作数的格式不同。 回下页 回46页 回I/O接口技术
(1)IN 从I/O接口输入数据指令 格式:IN AL, n IN AX, n 直接寻址,n是地址常量 IN EAX, n IN AL, DX IN AX, DX (寄存器)间接寻址 IN EAX, DX 操作:AL←(n)或(DX) AX←(n+1,n)或((DX)+1,(DX)) EAX←(n+3,…,n)或((DX)+3,…,(DX)) 说明:①目的操作数只能是AL/AX/EAX寄存器; ②源操作数要求参见寻址方式说明(上页); ③读入数据长度取决于目的寄存器的位数。 转上页
(2)OUT 向I/O接口输出数据指令 格式:OUT n, AL OUT n, AX 直接寻址,n是地址常量 OUT n, EAX OUT DX, AL OUT DX, AX (寄存器)间接寻址 OUT DX, EAX 操作:n或(DX)←(AL) (n+1,n)或((DX)+1,(DX))←(AX) (n+3,…,n)或((DX)+3,…,(DX))←(EAX) 说明:①源操作数只能是AL/AX/EAX寄存器; ②目的操作数要求参见寻址方式说明; ③写出数据长度取决于源寄存器的位数。 转44页
IN指令示例: IN AL, 20H ;从20H端口读入字节数据→AL IN AX, 48H ;从48H端口读入字数据→AX MOV DX, 3FCH IN EAX, DX ;从03FCH端口读入双字数据→EAX OUT指令示例: OUT 32H, AX ;传送字数据到32H端口 MOV DX, 400H MOV AL, 86H OUT DX, AL ;传送字节数据到DX指定的端口 OUT DX,86H ;不合法,立即数可扩展(8/16?)
5、类型转换指令 CBW(convert byte to word) 字节转换为字 CWD/CWDE(convert word to double word) 字转换为双字 CDQ(convert double to quad) 双字转换为4字 BSWAP(byte swap) 字节交换 CWDE、CDQ、BSWAP非8086指令。 (1)CBW 字节转换为字指令 格式:CBW 操作:扩展AL中符号位至AH中, 将8位数扩展成等效的16位数。
(2)CWD/CWDE 字转换为双字指令 格式:CWD 操作:扩展AX中符号位至DX中,形成等效的32位数。 格式:CWDE 操作:扩展AX中符号位至EAX中,形成等效的32位数。 说明:用于有符号数相除前,形成双倍长度被除数。 (3)CDQ 双字转换为4字指令 格式:CDQ 操作:扩展EAX中符号位至EDX中,形成EDX:EAX形式的4字数据。
数据传送指令小结 1、数据传送指令不影响标志位(除SAHF、POPF) 2、除XCHG指令外,都是从源到目的的单向传送 3、注意MOV指令与LEA指令的区别 MOV传送的是地址对应的内容,LEA传送的是EA 4、80286后才允许PUSH指令使用立即数寻址方式 5、与存储器操作数有关的寄存器问题 MEM操作数的寻址方式中只能用基址、变址寄存器 6、段寄存器问题 只能在MOV、PUSH、POP等指令中作为操作数出现, CS寄存器比其他段寄存器有更多限制。 7、最常用指令:MOV、IN/OUT、LEA、PUSH/POP、XCHG、CBW