AX 累加器,算术,逻辑运算,外设传输
AH
AL
EAX
BX 基址寄存器,存放存储器地址
BH
BL
EBX 指向DS段中数据的指针
CX 循环计数器,串操作中隐含计算器
CH
CL
ECX 串和循环操作的计算器
DX 数据寄存器,存放双字节高16位,端口地址
DH
DL
EDX I/O端口指针
SI 源地址寄存器,自增减,寻址DS
ESI 串操作的原操作数指针DS段
DI 目的地址寄存器,自增减,寻址ES
EDI 串操作的原操作数指针ES段
BP 基址指针
EBP 定位堆栈位置,指向堆栈中数据的指针SS段
SP 堆栈指针
ESP 堆栈顶指针SS段
CS 代码段寄存器
SS 堆栈段寄存器
DS 数据段寄存器
ES 附加段寄存器
FS
GS
IP 指令指针
FLAGS 标志寄存器
状态标志
CF 进位标志,最高有效位,有进位或借位,进位CF=1,否则CF=0
ZF 零标志,运算结果为0,ZF=1,否则ZF=0
SF 符号标志,运算结果最高位为1,SF=1,否则SF=0
PF 奇偶标志,运算结果最低8位字节中1的个数为零或偶数,PF=1,否则PF=0
OF 溢出标志,算术运算结果有溢出,OF=1,否则OF=0
AF 辅助进位标志,运算时低半字节有进位或借位,AF=1,否则AF=0
控制标志
DF 方向标志,DF=0串操作后存储器地址自增,DF=1自减
IF 中断允许标志,IF=1允许中断,否则IF=0
TF 陷阱标志,TF=1处理器单步执行指令,TF=0正常执行
32位标志
NT NT=1表示当前任务嵌套于另一任务,执行完返回原来任务
IOPL 表示程序所处的特权级
VM 虚拟8086方式,VM=1
RF 回复标志与调试寄存器一起使用
AC 对齐检测标志,设置是否在存储器位访问时进行数据对齐检测
VIF 虚拟中断标志,IF的影像与VIP联用
VIP 虚拟中断挂起标志,标志一个中断被挂起
ID CPU识别标志,如果能置位或复位这个标志,表示改处理器支持识别指令CPUID
-- 8088汇编指令表
一、数据传输指令
───────────────────────────────────────
它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
1. 通用数据传送指令.
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈SS,SP指向堆栈顶,SP-2
POP 把字弹出堆栈,后进先出. SP+2
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. (32位)
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.(32位)
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. (32位)
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. (32位)
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
例: mov ax,1234h
xchg ah,al ;ax=3412h
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
XADD 先交换再累加.( 结果在第一个操作数里 )
XLAT 从BX寄存器,取出AL位移处数据赋给AL( [BX+AL]->AL )
2. 输入输出端口传送指令.
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,
其范围是 0-65535.
3. 目的地址传送指令.
LEA 装入有效地址.
例: LEA DX,string ;把偏移地址存到DX.
LDS 传送目标指针,把指针下一字内容装入DS.
例: LDS SI,string ;把段地址:偏移地址存到SI<-[string],DS,<-[string]+4.
LES 传送目标指针,把指针下一字内容装入ES.
例: LES DI,string ;把段地址:偏移地址存到DI<-[string],ES,<-[string]+4.
LFS 传送目标指针,把指针内容装入FS.
例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
LGS 传送目标指针,把指针内容装入GS.
例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
LSS 传送目标指针,把指针内容装入SS.
例: LSS DI,string ;把段地址:偏移地址存到SS:DI.
4. 标志传送指令.
LAHF 把标志寄存器FLAGS低字节装入AH.(SF/ZF/AF/PF/CF送入7/6/4/2/0,5/3/1位任意)
SAHF 把AH内容装入标志寄存器FLAGS低字节,逆向LAHF.
PUSHF 标志入栈,栈顶指针SP-2. (sp<-sp-2, SS:[SP]<-FLAGS)
POPF 标志出栈,栈顶指针SP+2. (FLAGS<-SS:[SP], SP<-SP+2)
PUSHD 32位标志入栈.
POPD 32位标志出栈.
PUSHFD 压入EFLAGS
POPFD 弹出EFLAGS
二、算术运算指令
───────────────────────────────────────
ADD 加法. (影响全部标志位)
ADC 带进位加法. 多精度数相加
INC 加 1. 不影响CF标志
AAA 加法的ASCII码调整. 转成ASCII码相加,以16进制数返回,有进位AH+1,CF=AF=1否则为0,AL高4位清0
DAA 加法的十进制调整. 跟在ADD/ADC之后,(其实就是将16进制数当10进制计算相加)
SUB 减法. (影响全部标志位)
SBB 带借位减法. 多精度数相减
DEC 减 1. 不影响CF标志
NEG 求反(以 0 减之).
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
AAS 减法的ASCII码调整. 有借位AH-1,CF=AF=1否则为0,AL高4位清0
DAS 减法的十进制调整.
MUL 无符号乘法. 字节相乘存入AX,16位数相乘得出32位值,高字存入DX,低字存入AX
if (AH/DX == 0) -> 标志位OF=CF=0,否则为1. 由此判断高半位是否有效数字
IMUL 整数乘法. 如果乘积高一半是低一半的符号扩展,OF=CF=0,否则为1
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
AAM 乘法的ASCII码调整. 设置标志位SF/ZF/PF,高4位清0,AX目的操作数返回值
DIV 无符号除法. 字节除法,商存入AL,余数存入AH。字除法,商存入AX,余数存入DX。余数无符号
IDIV 有符号整数除法.
以上两条,结果回送:
商回送AL,余数回送AH, (字节运算);
或 商回送AX,余数回送DX, (字运算).
AAD 除法的ASCII码调整. (难理解)
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
三、逻辑运算指令
───────────────────────────────────────
AND 与运算. 两位都是1,结果为1,否则为0,结果存入目的操作数(后),复位0:要置0的位和0相与,否则用1相与
OR 或运算. 其中一位为1,结果为1,否则为0
XOR 异或运算. 两位结果不相同,结果为1,否则为0,求反:和1异或,不变位和0
NOT 取反.
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
以上指令,NOT除外(CF/OF=0,AF未定义,按需设置SF/ZF/PF)
SHL 逻辑左移.
SAL 算术左移.(=SHL)
SHR 逻辑右移.
SAR 算术右移.(=SHR)
ROL 循环左移.
ROR 循环右移.
RCL 通过进位的循环左移.
RCR 通过进位的循环右移.
以上八种移位指令,其移位次数可达255次.
移位一次时, 可直接用操作码. 如 SHL AX,1.
移位>1次时, 则由寄存器CL给出移位次数.
如 MOV CL,04
SHL AX,CL
四、串指令
───────────────────────────────────────
DS:SI 源串段寄存器 :源串变址.
ES:DI 目标串段寄存器:目标串变址.
DI,SI指针自动增减(土1字节,土2字)取决于方向标志DF
系统初始化执行CLD指令后DF=0,+1/2,STD指令后DF=1,-1/2
CX 重复次数计数器.
AL/AX 扫描值.
DF标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
ZF标志 用来控制扫描或比较操作的结束.
MOVS 串传送.
( MOVSB 传送字节. MOVSW 传送字. MOVSD 传送双字. )
( 另一种写法:MOVS byte ptr 传送字节. MOVS word ptr 传送字. )
CMPS 串比较. 根据减法结果设置标志位
( CMPSB 比较字符. CMPSW 比较字. )
SCAS 串扫描. 比较ES和AX/AL的值,操作DI指针指向ES
把AL或AX的内容与目标串作比较,比较结果反映在标志位.
LODS 装入串. SI存入AL/AX
把源串中的元素(字或字节)逐一装入AL或AX中.
STOSB ;AL<-DS:[SI],SI<-SI土1
STOSW ;AX<-DS:[SI],SI<-SI土2
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
STOS 保存串. AL/AX存入DI
是LODS的逆过程.
STOSB ;ES:[DI]<-AL,DI<-DI土1
STOSW ;ES:[DI]<-AX,DI<-DI土2
REP 当CX/ECX!=0时重复. 用在MOVS,STOS,LODS前
REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX!=0时重复. 用在CMPS,SCAS前
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX!=0时重复. 用在CMPS,SCAS前
REPC 当CF=1且CX/ECX!=0时重复.
REPNC 当CF=0且CX/ECX!=0时重复.
输入输出端口传送指令.
INS 由DX指定地址I/O输入,传输到ES,DI指定的存储单元,DI土1
OUTS 由DS:SI指针输出到DX指定I/O,SI土1
五、程序转移指令
───────────────────────────────────────
1>无条件转移指令 (长转移)
JMP 无条件转移指令
CALL 过程调用
RET/RETF/RETN /段内/段间,过程返回.
2>条件转移指令 (短转移,-128到+127的距离内)
( 当且仅当(SF XOR OF)=1时,OP1<OP2 )
JA/JNBE 不小于或不等于时转移.
JAE/JNB 大于或等于转移.
JB/JNAE 小于转移.
JBE/JNA 小于或等于转移.
以上四条,测试无符号整数运算的结果(标志C和Z).
JG/JNLE 大于转移.
JGE/JNL 大于或等于转移.
JL/JNGE 小于转移.
JLE/JNG 小于或等于转移.
以上四条,测试带符号整数运算的结果(标志S,O和Z).
JE/JZ 等于转移.
JNE/JNZ 不等于时转移.
JC 有进位时转移.
JNC 无进位时转移.
JNO 不溢出时转移.
JNP/JPO 奇偶性为奇数时转移.
JNS 符号位为 "0" 时转移.
JO 溢出转移.
JP/JPE 奇偶性为偶数时转移.
JS 符号位为 "1" 时转移.
3>循环控制指令(短转移)
LOOP CX不为零时循环. CX--
LOOPE/LOOPZ CX不为零且标志Z=1时循环.
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
JCXZ CX为零时转移.
JECXZ ECX为零时转移.
4>中断指令
INT int21h中断指令
AH=02H 输出字符,DL存放输出字符(ASCII)
AH=09H 输出字符串,DS:DX offset string存放字符串
AH=01H 输入字符,AL存放输入的字符
AH=0AH 输入字符串,DS:DX offset string存放字符串
AH=0BH 判断是否按键,AL=0无按键,AL=FFH已经按键
ROM-BIOS键盘功能调用int16h中断指令
AH=1 判断是否按键,ZF=1无按键,ZF=0有按键,AX=键值代码
INTO 溢出中断
IRET 中断返回
5>处理器控制指令
HLT 处理器暂停, 直到出现中断或复位信号才继续.
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态,低电平才返回.
ESC 转换到浮点处理器执行.
LOCK 封锁总线. 直到命令完成后解锁
NOP 空操作. 填充代码空间
SEG 段超越前缀指令,用指定段寄存器寻址操作数(CS/SS/DS/ES)
STC 置进位标志位. CF=1
CLC 清进位标志位. CF=0
CMC 进位标志取反. CF=~CF
STD 置方向标志位. DF=1
CLD 清方向标志位. DF=0
STI 置中断允许位. IF=1
CLI 清中断允许位. IF=0
六、伪指令
───────────────────────────────────────
DB/DW/DD/DF/DQ/DT 字节/字/双字/三字/四字/十字
DUP: 复制操作符。DUP 前面的常量或表达式的值(正整数)指明DUP 后面的括号中的操作数之重复次数
PROC/ENDP 函数定义.
PROTO 声明函数
LOCAL 定义局部变量,可以用在宏定义第一行
INVOKE 调用函数
宏
MACRO/ENDM/EXITM 宏定义
PURGE 删除宏定义
REPEAT 重复指定次数
FOR 重复参数个数
FORC 按参数字符个数重复
IF/ELSE/ENDIF/... 条件宏
STRUCT 结构
RECORD 记录
UNION 联合
TYPEDEF 类型定义
简化代码定义
.STARTUP 程序开始
.EXIT 0 程序结束,返回DOS
.DATA/.DATA?/.CONST/.CODE/.MODEL/.STACK/
完整代码定义
SEGMENT 完整定义段. 定义堆栈段/代码段/数据段
ENDS 段结束.
ASSUME 建立段寄存器寻址.
GROUP 段组指令,将多个同类型段合并为一个物理段
.SEG 按源程序顺序
.DOSSEG 按DOS顺序
.ALPHA 按段名字母顺序
END 汇编结束.
(START:
END START 由END指定开始的段地址)
.IF/.ELSEIF/.ELSE/.ENDIF
== != > && || ! >= <= < & ()
CARRRY?(CF=1?) OVERFLOW?(OF=1?) PARITY?(PF=1?) SIGN?(SF=1?) ZERO?(ZF=1?)
.WHILE/.ENDW
.REPEAT/.UNTIL 先循环后判断
.UNTILCXZ[表达式] CX=0或条件为真
.BREAK/.CONTINUE
OFFSET 偏移地址
SEG 返回名字或标号的段地址
PTR 指定字节/字等类型
THIS 指定当前逻辑地址
ORG 将偏移地址指针指向表达式的偏移地址
EVEN 指向偶数地址
ALIGN 指向n(2的乘方)的整数倍地址
[] 将表达式作为存储器地址指针
$ 当前偏移地址
SIZEOF 变量占用字节数
LENGTHOF 变量数据项个数
TYPE 返回类型,即所占的字节数
SIZEOF = LENGTHOF * TYPE
EQU 比较字符或数值
= 比较数值
运算符 + - * / MOD AND OR XOR NOT SHL(逻辑左移) SHR(逻辑右移)
EQ(等于) NE(不等) GT(大于) LT(小于) GE(大于等于) LE(小于等于)
HIGH高字节 LOW低字节 HIGHWORD高字 LOWWORD低字 mov ah,HIGH 8765h; ==mov ah,87h
PE文件结构
.text 代码段,包含IAT
.bss 未初始化数据
.rdata 常量
.data 变量
.rsrc 模块的资源信息
.edata 导出数据段,包含了应用程序或DLL的导出数据
.idata 导入数据段,包括导入库和导入地址名称表
.debug 调试信息段
.reloc 不进行映射的段