1.5k likes | 1.6k Views
第3章 80 x86 的指令系统和寻址方式. § 3.1 80 x86 的寻址方式 § 3.3 80 x86 的指令系统 § 3.4 80 x86 的机器语言指令概况. 基本概念—指令系统. 每一种计算机都有一组指令集供用户使用,这组指令集称为该计算机的指令系统。指令集中的每条指令在汇编语言中都是用助记符来表示的。. 操作码. 操作数. 基本概念—指令的构成. 指令由操作码和操作数两部分组成 操作码 说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 操作数 是指令执行的参与者,即各种操作的对象
E N D
第3章 80x86的指令系统和寻址方式 § 3.1 80x86的寻址方式 § 3.3 80x86的指令系统 § 3.4 80x86的机器语言指令概况
基本概念—指令系统 每一种计算机都有一组指令集供用户使用,这组指令集称为该计算机的指令系统。指令集中的每条指令在汇编语言中都是用助记符来表示的。
操作码 操作数 基本概念—指令的构成 • 指令由操作码和操作数两部分组成 • 操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 • 操作数是指令执行的参与者,即各种操作的对象 • 有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数
基本概念—80x86指令的基本格式 • 操作码 [目的操作数][,源操作数]] [;注释] SRC DST • [ ]内的内容可缺省 • 书写注意事项: • 操作码与操作数至少有一个空格或制表符分隔 • 操作数之间必须用“,”相分隔, DST在前, SRC在后 • 每种指令的操作码: • 用一个唯一的助记符表示(指令功能的英文缩写) • 对应着机器指令的一个二进制编码 • 指令中的操作数: • 可以是一个具体的数值 • 可以是存放数据的寄存器 • 或指明数据在主存位置的存储器地址
基本概念—寻址方式 • 在指令中为了取得操作数地址所使用的方式 • 寻找操作数的过程就是操作数的寻址 • 不同的指令系统都规定一些寻址方式供编程时选用 • 指令的寻址方式主要由操作数的形式表示出来 • 操作数采取哪一种寻址方式,会影响机器运行的速度和效率
§ 3.180x86的寻址方式 一、与数据有关的寻址方式 • 立即(数)寻址 • 寄存器寻址 • 直接寻址 • 寄存器间接寻址 • 寄存器相对寻址 • 基址变址寻址 • 相对基址变址寻址 • 比例因子寻址 • 串操作寻址 • 端口寻址 二、与转移地址有关的寻址方式
1.立即(数)寻址 • 指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中) • 这种操作数被称为立即数imm • 它可以是8位数值imm8(00H~FFH) • 也可以是16位数值imm16(0000H~FFFFH) • 也可以是32位数值imm32(00000000H~FFFFFFFFH) • 立即数寻址方式常用来给R/M赋值 • 立即数只能用于源操作数 • MOV AL,05H ;AL←05H • MOV AX,0102H ;AX←0102H • MOV EAX,12345678H ;EAX←12345678H
2. 寄存器寻址 • 操作数存放在CPU的内部寄存器reg中,可以是: • 16位寄存器: AX、BX、CX、DX、SI、DI、BP、SP • 8位寄存器: AH、AL、BH、BL、CH、CL、DH、DL • 32位寄存器: EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP • 段寄存器: CS、DS、SS、ES,FS,GS MOV AX,1234H ;AX←1234H MOV BX,AX ;BX←AX
位移量:指令中给出8/16/32位数(常数、符号)位移量:指令中给出8/16/32位数(常数、符号) • EA 基地址:有基址寄存器BX或基址指针BP给出 • 变址: 由变址寄存器(SI或DI)给出 由段寄存器经计算给出 主要确定该部分的内容(EA) 存储器操作数的寻址 • 当操作数存放在内存中时,寻找操作数归结为如何确定存储单元的地址 • 逻辑地址 段基值:偏移量 EA=位移量+基址+变址 EA=位移量+基址+(变址*比例因子) 比例因子(1/2/4/8)
16/32位寻址时有效地址的组成 默认段选择规则
3. 直接寻址 • 有效地址只包含位移量 操作数的16位偏移量直接包含在指令中,与操作码一起放在代码段 • 用符号表示的位移量 MOV BX,VAR ;表示将用符号VAR表示的字单元的内容→ AX ; 不声明段则默认为数据段,指明段寄存器则可实现段跨越 • 用常数表示的位移量 MOV AX,DS:[2000H] ;表示将数据段偏移2000H字节的字单元的内容→ AX
直接寻址的执行 MOV AX,DS:[2000H]
4. 寄存器间接寻址 • 有效地址仅包含基址/变址一种成分 • 16位寻址可用寄存器:BX、BP、SI、DI • 32位寻址可用寄存器:EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP • 所使用的寄存器相当于地址指针,当修改其内容后可指向不同的存储单元 • 书写时用[]括住寄存器名,以区别于寄存器寻址 • 若以BP、EBP、ESP间址,操作数默认在堆栈段,其他在数据段;使用段超越前缀改变访问段 MOV AX,[SI] MOV CL,[BX] MOV CX,[BP] MOV EBX,[EAX]
寄存器间接寻址的执行 (BX=2000H,DS=3000H)
基址寻址 变址寻址 5.寄存器相对寻址方式 • 直接基址寻址/直接变址寻址 • 有效地址是寄存器内容与有符号的位移量之和 EA = BX/BP 或SI/DI +位移量 • 段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变 • 该方式不仅可以修改指针,还可以修改位移量,对数组操作十分方便 • MOV AX,10H[SI] • MOV TABLE[DI],AL • MOV TABZ[BP],BX • MOV EAX,ARRAY[ESI]
操作码 24H 00H 12H 34H 56H 78H 9AH 可看作数据起始单元的偏移量 MOV AL,0024H[SI] 代码段 EA=24H+(SI) (SI)=0 (AL)=12H (SI)=1 (AL)=34H DS (SI)=2 (AL)=56H (SI)=3 (AL)=78H 0024H (SI)=4 (AL)=9AH 数据段 (SI) 数组内某元素距数组 起始单元的偏移量 通过修改SI可遍历整个数组
6.基址变址寻址方式 • 有效地址由基址寄存器的内容加上变址寄存器的内容构成 • 使用BP、EBP、ESP基址寄存器默认是SS,其他为数据段;可用段超越前缀改变 • MOV AX,[BX][SI] • MOV AX,[BP][DI] • MOV AX,DS:[BP][DI] • MOV EDX,[EBX][ESI]
基址变址寻址的执行 请 注 意 图 中 的 错 误 !
7.相对基址变址寻址方式 • 有效地址是基址寄存器、变址寄存器与位移量之和 • 16位寻址时,BX/BP选一,SI/DI选一 • 段为缺省选择,可用段超越前缀改变 MOV AX, 06H[BX+SI] ← → MOV AX, DS:[BX+SI+06H] MOV AL,TAB[BX][DI] ← → MOV AL,DS:TABLE[BX][DI] MOV DWORD[BP][SI],DX ← → MOV SS:DWORD[BP][SI],DX MOV AX,ARRAY[BX][BP] × MOV AX,DA[SI][DI] × MOV EAX,ARRARY[EBX][ECX]
31A00 3000:1A00
数据段 DS ARRAY 二维数组起始单元 ⊕ BX EA SI MOV AL,ARRAY[BX][SI] BX、SI分别存放数组的脚标 • [ ]之间表示相加的关系 [BX][SI] ← → [BX+SI]
8.比例变址寻址、基址比例比例变址寻址、相对基址比例变址寻址方式8.比例变址寻址、基址比例比例变址寻址、相对基址比例变址寻址方式 • 比例变址寻址有效地址是:位移量加变址寄存器与比例因子乘积之和 MOV EAX,COUNT[ESI*4] • 基址比例比例变址寻址有效地址是:基址加变址寄存器与比例因子乘积之和 MOV CX,[EAX][EDX*2] • 相对基址比例变址寻址方式有效地址是:位移量加基址加变址寄存器与比例因子乘积之和 MOV EAX, TABLE[EBP][EDI*4] • 作用:方便字、双字等数组的操作
二、与转移地址有关的寻址方式 • 程序代码亦存放在存储器中,如何控制程序的走向(转移位置的地址CS:IP)是本部分所涉及的内容,由于它们与具体的指令相关,他们的介绍放在指令中讲解。
§ 3.3 80x86的指令系统 • 指令分类 • 功能 • 格式 • 数据传送指令 • 算术运算指令 • 逻辑指令 • 串操作指令 • 程序转移指令 • 处理器控制指令 • 双操作数指令(DEST,SRC) • 单操作数指令(DEST) • 无操作数指令(隐含,按约定寻找操作数)
一、数据传送指令 • 数据传送是计算机中最基本、最重要的一种操作 • 传送指令也是最常使用的一类指令 • 传送指令把数据从一个位置传送到另一个位置 • 除标志寄存器传送指令外,均不影响标志位 1.通用数据传送指令 • 提供方便灵活的通用传送操作 • MOV XCHG PUSH POP • MOVSX MOVZX PUSHA/PUSHAD POPA/POPAD
1) 传送指令MOV(move) • 格式:MOV DST,SRC • 功能:将源操作数的内容传送至目的操作数中即(DST) ← (SRC) • 说明: • DST可以是8/16位的R(CS、IP除外)/M • SRC可以是8/16位的R/M/立即数 • DST可以是8/16/32位的R(CS、EIP除外)/M • SRC可以是8/16/32位的R/M/立即数 只能出现在源操作数的位置
1)传送指令MOV—立即数传送 MOV reg/mem,imm ;立即数送寄存器或主存 MOV AL,4 ;AL←4,字节传送 MOV AH,‘E’ ; AH←‘E’的ASCII码45H MOV CX,0FFH ;CX←00FFH,字传送 MOV SI,200H ;SI←0200H,字传送 MOV BYTE PTR [SI],0AH ; BYTE PTR说明是字节操作 MOV WORD PTR [SI+2],0BH ; WORD PTR 说明是字操作 • 注意立即数是字节量还是字量 • 明确指令是字节操作还是字操作
1)传送指令MOV —寄存器之间数据传送 MOV reg,reg MOV AX,BX ;AX ← BX ,字传送 MOV AH,AL ;AH ← AL ,字节传送 MOV DS,AX ;DS ← AX ,字传送 • CS只能出现在SRC的位置
1)传送指令MOV —寄存器与存储器之间数据传送 MOV AL,D_BYTE MOV DL,[SI] ;DL←DS:[SI] MOV DX,Y[BP][SI] ;DX←SS:Y[BP][SI] MOV EAX,[EBX][ECX*4]
1)传送指令MOV —使用该指令应注意的问题 • SRC与DST的长度必须一致 • DST不能为CS、IP及立即数 • SRC与DST不能同时为存储器操作数—不支持两个存储单元间数据的直接传送 • SRC与DST不能同时为段寄存器 • 不能将立即数直接传送到段寄存器 • 例: DS ← ES • 错误: MOV DS,ES • 正确实现: MOV AX,ES MOV DS,AX • 错误示例: MOV AX,BL • MOV CL,3824H • 错误示例: MOV VAR1,VAR2 • 正确实现: MOV AL,VAR2 MOV VAR1,AL • 例: MOV AX,ES MOV DS,AX
立即数 存储器 通用寄存器 AX BX CX DX BP SP SI DI 段寄存器 CSDS ES SS 1)传送指令MOV—数据传送方向示意
2) 零扩展传送指令MOVZX • 格式:MOVXZ DST,SRC • 功能:将零扩展至源操作数的高位形成双倍长度传送至目的操作数中即 (DST) ← (SRC) • 说明: • DST可以是16/32位的R(CS、EIP除外) • SRC可以是8/16位的R/M MOVZX DX,AL ;原AL=B0H,则DX=00B0H MOVZX EAX,DATA
3) 带符号扩展传送指令MOVSX • 格式:MOVSX DST,SRC • 功能:将源操作数的符号位扩展至高位形成双倍长度传送至目的操作数中即 (DST) ← (SRC) • 说明: • DST可以是16/32位的R(CS、EIP除外) • SRC可以是8/16位的R/M MOVSX DX,AL ;原AL=B0H,则DX=FFB0H MOVSX EAX,[EDI]
4) 交换指令XCHG(exchange) • 指令格式: XCHG DST,SRC • 指令功能:(DST) ← →(SRC) • 寄存器与寄存器之间对换数据 • 寄存器与存储器之间对换数据 • 注意:不能在存储器与存储器之间对换
4) 交换指令XCHG—寄存器间交换 MOV AX,1234H ;AX=1234H MOV BX,5678H ;BX=5678H XCHG AX,BX ;AX=5678H,BX=1234H XCHG AH,AL ;AX=7856H MOVZX CX,AL ;CX=0078H MOVSX DX,AH ;DX=0056H XCHG CX,DX ;CX=0056H,DX=0078H
4)交换指令XCHG —寄存器与存储器交换 XCHG AX,DS:[2000H] ;字交换 XCHG DS:[2000H],AX XCHG AL, DS:[2000H] ;字节交换 XCHG DS:[2000H],AL
4) 交换指令XCHG—例题分析 • 例: (BX)=6F30H, (BP)=0200H, (SI)=0046H, (SS)=2F00H,(2F246H)=4154H,在指令 XCHG BX,[BP+SI]执行后,相关寄存器和存储器的内容是什么? • 分析:源操作数的物理地址= (SS) × 16+(BP)+(SI)= 2F000H+0200H+0046H=2F246H • 指令的功能:(BX) ← →(2F246H) • 指令执行结果:(BX)=4154H,(2F246H)=6F30H
5) 堆栈操作指令—进栈指令PUSH • 格式: PUSH SRC • 功能: SP←SP-2, SS:[SP]←(r/m16) 386+ ESP←ESP-2/4, SS:[ESP]←(r/m16)/ (r/m32)/imm32 例: PUSH AX PUSH DS:[2000H]
6) 堆栈操作指令—出栈指令POP • 格式: POP DST • 功能: (r/m16) ← SS:[SP] SP ← SP+2 • 386+ • (r/m16)/ (r/m32)← SS:[ESP] • ESP ← ESP+2/4 例: POP DX POP DS:[2000H]
堆栈操作指令—应用举例 PUSH AX ;进入子程序后 PUSH BX PUSH DS ... POP DS ;返回主程序前 POP BX POP AX
20070H 66H 00H 55H 00H 84H 00H 78H 00H 22H 00H 44H 00H 33H 00H SP SP xxH 7) 所有寄存器进栈指令 —PUSHA/PUSHAD • 格式: PUSHA • 功能:将所有16位寄存器压栈,顺序为: AX、CX、DX、BX、SP、BP、SI、DI ESP←ESP-16 如:AX=11H, BX=22H CX=33H, DX=44H SI =55H, DI =66H SP=80H, BP =84H PUSHA 执行后有: • 格式: PUSHAD • 功能:将所有32位寄存器压栈,顺序为: • EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI • ESP←ESP-32 11H 00H 20080H
8) 所有寄存器出栈指令—POPA/POPAD • 格式: POPA • 功能:将堆栈中的数据弹给16位寄存器,顺序与压栈指令相反 ESP←ESP+16 • 格式: POPAD • 功能:将堆栈中的数据弹给32位寄存器,顺序与压栈指令相反 ESP←ESP+32
累加器专用传送指令 换码指令XLAT(translate) • 指令格式: XLAT • 指令功能: AL←DS:[BX+AL],将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL • 换码指令执行前: 在主存建立一个字节量表格,内含要转换成的目的代码 表格首地址存放于BX,AL存放相对表格首地址的位移量 • 换码指令执行后: 将AL寄存器的内容转换为目标代码
(BX) DS 78H 12H (AL)=78H (AL) 数据段 34H 56H 78H 9AH 3)换码指令XLAT—例题 MOV BX,100H MOV AL,03H XLAT
3. 地址传送指令 • 地址传送指令将存储器单元的逻辑地址送至指定的寄存器 • 有效地址传送指令 LEA • 指针传送指令 LDS和LES • 指针传送指令 LFS、LGS、LSS • 注意不是获取存储器单元的内容
3. 地址传送指令—有效地址传送指令LEA(load EA) 格式: LEA DST,SRC 存储器操作数 16/32位寄存器 功能:DST←SRC的有效地址EA • 将存储器操作数的有效地址传送至指定的16/32位寄存器中