汇编学习笔记 第三章
来源:互联网 发布:淘宝富安娜蚕丝被 编辑:程序博客网 时间:2024/06/06 04:03
3.1 指令格式
汇编指令由操作码与操作数两部分构成
标号中的冒号表示属性为NEAR
对于段寄存器,CS不允许用户干预,其他必须通过通用寄存器间接传送。
对于单操作数指令,操作数不能是立即数
对于双操作数指令,目的操作数不能是立即数,且操作数不能均为内存操作数。
3.2 寻址方式
立即数寻址与寄存器寻址
直接寻址
- 符号常量通常为立即数寻址,符号变量为直接寻址
- 对于符号变量(X)来说, MOV AX, X 等价于 MOV AX,[X]
寄存器间接寻址
- 组合方式
- DS 和 BX/SI/DI
- SS 和 BP
- 隐含段地址仅有DS/SS两种,间接寻址寄存器只有BX,SI,DI,BP四种
- 组合方式
寄存器相对寻址
- 等价的三种表示方法
- MOV AX, disp[SI]
- MOV AX, [SI]+disp
- MOV AX, [SI+disp]
注:即在3的条件下增加一个常量偏移
- 等价的三种表示方法
基址变址寻址
- 组合方式
- DS * 16 + BX + SI/DI
- SS * 16 + BP + SI/DI
注:即在3的条件下增加一个寄存器偏移
相对基址变址寻址
注:即在5的条件下再增加一个常量偏移
比例变址寻址
要求:80386以上处理器
组合方式
- DS:基址寄存器 + 比例 * 变址寄存器 + disp
- SS:基址寄存器 + 比例 * 变址寄存器 + disp
说明
- 基址寄存器有8个
- 变址寄存器有7个,除去ESP
- 基址寄存器为ESP/EBP时默认数据段为SS,其他默认为DS
转移地址相关寻址方式
个数:5种
影响寄存器:CS、IP
- CS:记录标号所在的段地址(高字)
- IP:记录段内偏移地址(低字)
注:和其他寻址方式大同小异
3.3 指令系统
MOV/MOVSX/MOVZX
MOV
- IP 不能作为操作数
- 不能传送数据给CS寄存器
- MOV不会影响标志寄存器
MOVSX
- 源操作数是带符号数
- 源操作数长度小于目的操作数
- 不影响标志寄存器
- MOVZX
- 源操作数是无符号整数,扩展为0
- 其他同上
PUSH/POP/PUSHA/POPA
- PUSHA/POPA 在80286以上才有效
- PUSHA/POPA顺序:AX,CX,DX,BX,SP,BP,SI,DI
XCHG
只能通用寄存器与通用寄存器互换或通用寄存器与存储器互换。地址传送指令
- LEA
- 功能:LEA reg, mem,将mem有效地址存入reg
- 等价指令:MOV reg, OFFSET mem
- 要求
- 源操作数是存储器,目前操作数为寄存器
- LDS/LES/LFS/LGS/LSS
- 说明:均为地址指针传送指令,后两位表明高字传送的目的段
- 低字传入寄存器
- 等价指令:MOV BX, OFFSET X + MOV AX, SEG X
- LEA
加减法指令
主要影响标志寄存器:ZF,SF,CF,OF
无符号数溢出CF=1,有符号数溢出OF=1
ADC:运算结果 + CF
SBB:运算结果 - CF
通常将AL扩展为AX时,需两步
MOV AH, 0ADC AH, 0
例题
求Z = X + Y,X、Y为16位数,Z为32位数
注:先求和,传送时考虑进位
MOV AX, XADD AX, YMOV DX, 0ADC DX, 0MOV WORD PTR Z+2, DXMOV WORD PTR Z, AX ;这两行很关键
求Z = X-Y, 其中X,Y,Z均为32位数
注:在做减法时就考虑借位
MOV DX, WORD PTR X + 2MOV AX, WORD PTR XSUB AX, WORD PTR Y ;先做低位减法,无需借位SBB DX, WORD PTR Y + 2 ;高位减法,需要借位MOV WORD PTR Z, AXMOV WORD PTR Z + 2, DX
求W = X+Y+60-Z,其中X,Y,Z,W均为双字
MOV AX, WORD PTR XMOV DX, WORD PTR X+2ADD AX, WORD PTR YADC DX, WROD PRT Y+2ADD AX, 60ADC DX, 0SUB AX, WORD PTR ZSBB DX, WORD PTR Z+2MOV WORD PTR W, AXMOV WORD PTR W+2,DX
判断OF、CF在运算后的变化
MOV AL, -100MOV AH, 88SUB AL, AH;运算结果-188,等于-(10111100),无法表示符号位,产生溢出,OF = 1;-100 = (10011100),88 = (01011000),做无符号减法,不产生借位,故CF = 0;-(10111100) 补码为 (01000100) = 44HMOV BL, 100MOV BH, -88SUB BL, BH;运算结果+188,等于+(10111100),无法表示符号位,产生溢出,OF = 1;100 = (01100100),-88 = (10101000),做无符号减法,显然产生借位,故CF = 1;+(10111100)补码为(10111100) = 0BCHMOV CL, 100MOV CH, 88SUB CL, CH;运算结果为+12,等于+(00001100),可以表示符号位,无溢出,OF = 0;100 = (01100100),88 = (01011000),做无符号减法,显然不产生借位,故CF = 0;+(00001100)的补码为(00001100) = 0CHMOV DL, -100MOV DH, -88SUB DL, DH;运算结果为-12,等于-(00001100),可以表示符号位,无溢出,OF = 0;-100 = (10011100),-88 = (10101000),做无符号减法,显然产生借位,故CF = 1;-(00001100) = 11110100 = 0F4H
乘除法指令
乘法(MUL/IMUL)
若为字节乘法(8位),结果送入AX,若为字乘法(16位),结果送入DX:AX
乘法操作目的操作数为隐含的,源操作数不能为立即数
当高位结果不为0时,CF = OF = 1
若为IMUL 2操作数指令,只要求目的操作数为寄存器,源操作数和目的操作数同规模
若为IMUL 3操作数指令,要求去上述相同,第三操作数为立即数
有符号乘法,高位未必是乘积的符号扩展
MOV AX, 0MOV BL, 10MOV AL, 9CHIMUL BL ; AX = 0FC18H
除法(DIV/IDIV)
- 商存低位,余数存高位
- 对标志寄存器无定义,除数为0或商溢出,自动中断退出程序。
符号扩展指令
- 说明:一般出现在除法操作前的预处理中
- 例子
- 计算(X + 125 - X * Y) / Z,其中X、Y、Z为16位带符号字变量,商存入X,余数存入Y
MOV AX, XIMUL YMOV CX, AXMOV BX, DXMOV AX, XADD AX, 125CWDSUB AX, CXSBB DX, BXIDIV ZMOV X, AXMOV Y, DX
- 计算(X + 125 - X * Y) / Z,其中X、Y、Z为16位带符号字变量,商存入X,余数存入Y
逻辑运算指令
- 常用操作
- 清零(清CF标志)
XOR AX, AX - 加 30H(数字的ASCII码变化)
OR AL, 30H
- 清零(清CF标志)
- 常用操作
移位指令
- SHL/SHR
- 格式:SHL/SHR DST, COUNT
- 说明:左移/右移count位
- SHL/SHR
比较指令
实际内容为减法,详见第五章笔记。
- 汇编学习笔记 第三章
- 汇编学习笔记 第三章
- 【汇编】学习笔记——第三篇
- 【汇编学习】汇编语言读书笔记(第三章)
- 汇编学习笔记 第二章
- 汇编学习笔记 第四章
- 汇编学习笔记 第五章
- 汇编学习笔记 第六章
- 汇编学习笔记 第七章
- 第三章学习笔记
- 学习笔记 第三章
- Asp学习笔记第三章
- APUE 学习笔记(第三章)
- SICP第三章学习笔记
- JavaScript学习笔记-第三章
- opencv3 学习笔记 第三章:
- Win32API学习笔记第三章
- APUE第三章学习笔记
- Hadoop之wordcount(Java 原生和Hadoop Streaming)
- Java集合
- 构造根文件系统之启动第一个程序
- JVM、Dalvik、 ART三种虚拟机简单对比
- 又是一年考试周啊
- 汇编学习笔记 第三章
- L1-018. 大笨钟
- 各种软件安装教程以及好用软件的推荐,也方便自己日后寻找。
- 选择排序,冒泡排序,双向冒泡排序
- 笑着理解设计模式-java--代理模式
- GitHub详解(2)
- 在迁移到HTTPS之前需要考虑的事情
- C++ 标准库之iomanip
- 机器人(n舵机)电源解决方案