未命名
2023-12-12
第3章 8086汇编
常用指令
数据传送
mov destination,source : 两个操作数不能同时为内存、目的操作数不能是 CS,IP、立即数不能送至段寄存器
1
2mov r/m16,sreg
mov sreg,r/m16
逻辑运算
AND 目的,源:按位与,某一位或某些位置 0
OR:置 1
NOT reg/mem 操作数所有数据位取反
XOR
对某些位取反,同时不影响其他位(哪些为置1,就对哪些为取反)两次异或之后还是原来的数
判断 16 位值的奇偶性
1
2mov ax,64C1h ; 0110 0100 1100 0001
xor ah,al ; PE,奇偶标志被设置简单数据加密:将某个操作数与同样的操作数执行两次异或运算后,其值保持不变。
移位
- SHL : 逻辑左移:低位补0,最高位移动到 CF
- SHR:逻辑右移 :高位补 0,最低位移动到 CF
- ROL:循环左移:最高位同时移动到 CF 和最低位
- ROR:循环右移:最低位同时移动到 CF 和最低位
- SAL:算术左移:低位补0,最高位移动到 CF
- SAR:算术右移:最高位不变
算术运算
DAA:将 ADD 或 ADC 指令执行后 AL 的结果转换成压缩的 BCD 格式
DAS:将 SUB 或 SBB 指令执行后 AL 的结果转换成压缩的 BCD 格式
1
2
3
4
5
6
7
8mov al,35h
add al,48h ; AL = 7Dh
daa ; AL = 83h
mov bl,48h
mov al,85h
sub al,bl ; AL = 3Dh
das ; AL = 37h==MUL==
MUL r/m8 MUL r/m16,给出一个操作数,另一个操作数隐含寻址
被乘数 乘数 积 CF=1的条件 AL r/m8 AX AH≠0 AX r/m16 DX:AX DX≠0 EAX r/m32 EDX:EAX EDX≠0 ==DIV==
被除数 除数 商 余数 AX r/m8 AL AH DX:AX r/m16 AX DX EDX:EAX r/m32 EAX EDX
堆栈
- PUSH、POP
程序控制
CALL、RET
INT
LOOP
TEST
CMP
Jcond Z 零、C 进位、O溢出、S符号、P奇偶
助记符 描 述 标志值 JZ 为零则跳转 ZF=1 JNZ 不为零则跳转 ZF=0 JC 如果设置进位标志则跳转 CF=1 JNC 如果未设置进位标志则跳转 CF=0 JO 如果设置溢出标志则跳转 OF=1 JNO 如果未设置溢出标志则跳转 OF=0 JS 如果设置符号标志则跳转 SF=1 JNS 如果未设置符号标志则跳转 SF=0 JP 如果设置了奇偶标志则跳转(偶) PF=1 JNP 如果未设置奇偶标志则跳转(奇) PF=0 无符号整数比较结果:大于A 、小于 B
助记符 描 述 JA 大于则跳转(leftOp>rightOp) JNBE 不小于或等于则跳转(同JA指令) JAE 大于或等于则跳转(leftOp≥rightOp) JNB 不小于则跳转(同JAE指令) JB 小于则跳转(leftOp<rightOp) JNAE 不大于或等于则跳转(同JB指令) JBE 小于或等于则跳转(leftOp≤rightOp) JNA 不大于则跳转(同JBE指令) 有符号整数比较结果:大于 G、小于 L
助记符 描 述 JG 大于则跳转(leftOp>rightOp) JNLE 不小于或等于则跳转(同JG指令) JGE 大于或等于则跳转(leftOp≥rightOp) JNL 不小于则跳转(同JGE指令) JL 小于则跳转(leftOp<rightOp) JNGE 不大于或等于则跳转(同JL指令) JLE 小于或等于则跳转(leftOp≤rightOp) JNG 不大于则跳转(同JLE指令)
输入、输出
IN、OUT
IN:从端口读入一个字节、字
OUT:向端口输出一个字节、字
1
IN AL\AX, 端口地址l端口地址:0~FFh 之间的一个常量,或是包含 0~FFFFh 之间的值的DX 寄存器。
常用伪指令、操作符
定义变量类型:
DB:定义八位无符号整数 (BYTE)
DW:定义 16 位无符号整数
OFFSET:
- 返回数据标号的偏移地址(标号距数据段开始的距离,以字节为单位)。
SEG + 符号:
- 取符号所在段的起始地址的高16位
PTR:
用来重载操作数的默认尺寸
1
2
3
4
5
6
7.data
myDouble DWORD 12345678h
.code
mov ax, myDouble ; 错误
mov ax, WORD PTR myDouble ; ax = 5678h
mov ax, WORD PTR [myDouble+2] ; ax = 1234h
mov bl, BYTE PTR myDouble ; bl = 78hSIZEOF + 数组首地址符号
返回标号定义的数据所占用的字节数 (=LENGTHOF返回值×TYPE返回值)
常用寻址方式
- 立即寻址、直接寻址、寄存器寻址
- 寄存器间接寻址:[BX]、[SI]、[DI]
- 寄存器相对寻址:用于查表
- TAB[BX]、TAB[SI]、TAB[DI]
- [TAB+BX]、[TAB+SI]、[TAB+DI]
- 基址变址寻址:
- [BX][SI]、[BX][DI]
- [BX+SI]、[BX+DI]
- 相对基址变址寻址:
- TAB[BX][SI]、TAB[BX][DI]
- TAB[BX+SI]、TAB[BX+DI]
- [TAB+BX+SI]、[TAB+BX+DI]
程序框架
1 | |
子程序结构
1 | |