@shaobaobaoer
2019-06-09T05:45:41.000000Z
字数 4603
阅读 1153
汇编
汇编学的实在是太菜了。趁着这个国庆好好看下
位:计算机存储信息的基本单位,存储二进制数0或1。
字节:每8位组成一个字节,在存储器里以字节单位存储。
字长:8086/8088、80286字长为16位,由2个字节组成;80386字长为32位,由4个字节组成,双字。
段 | 偏 移 |
---|---|
CS DS ES SS |
IP BX、DI、SI或16位数 DI SP或BP |
MOV AX , [2000H];【位移量】
AX = (DS) * 16 D + [BIAS]
段跨越前缀
MOV AX,ES:[VALUE]
当指定段的时候就要用(ES) * 16 d 了不指定的话就默认是 (DS)
MOV AX,[BX]
AX = (DS) * 16 d + (BX)
MOV AX,COUNT[SI]
MOV AX,[COUNT + SI]
AX = (DS) * 16 d + (COUNT + (SI))
扩展部分
MOV EAX, TABLE[ESI]
MOV DL, STRING[SI]
MOV AX, [BX][DI]
AX = (DS) * 16 d + (BX) + (DI)
MOV AX,MASK[BX][SI]
AX = (DS) * 16 d + (BX) + (SI) +MASK
段内直接短转移(短跳转):位移量8位
-128 ~ +127
80386以后机型也可为8位和32位
加操作符SHORT
只能用作段内直接寻址的条件转移指令
段内直接近转移(近跳转):位移量16位
-32768 ~ +32767
80386以后机型也可为8位和32位
加操作符 NEAR PTR
其中,NEAR PTR可缺省。
通常,默认的东西使用比较广泛。
EB 04 JMP SHORT NEXT
JMP BX
JMP WORD PTR [BP + TABLE]
段内转移(直接或间接),程序仍在同一段内跳转:
CS不变,IP修改。
一般形式:
MOV dst, src ; (dst) ← (src),
将源操作数src复制到目的操作数dst,src不变。
扩展形式:
MOVSX (Move with Sign-extend)
一般形式:
MOVSX dst, src ; src符号扩展为dst;386新增
MOVZX (Move with Zero-extend)
一般形式:
MOVZX dst, src ; src零扩展为dst;386新增
进栈指令(入栈)
PUSH (Push onto the stack)
一般形式:
PUSH reg/mem/seg/imm
操作数可以是:寄存器、存储器、段寄存器以及立即数
PUSHA (Push All General Registers)
指令格式:PUSHA ;80286+
其功能是依次把寄存器AX、CX、DX、BX、SP、BP、SI和DI等压栈。
PUSHAD (Push All 32-bit General Registers)
指令格式:PUSHAD ;80386+
其功能是把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI等压栈。
出栈指令
POP (Pop from the stack)
一般形式:
POP reg/mem/seg
POPA (Pop All General Registers)
指令格式:POPA ;80286+
其功能是依次把寄存器DI、SI、BP、SP、BX、DX、CX和AX等弹出栈。
不用记住具体顺序,只要与指令PUSHA对称使用即可。
POPAD (Pop All 32-bit General Registers)
指令格式:POPAD ;80386+
其功能是依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX等弹出栈,它应该与PUSHAD对称使用。
以下指令结果相同
LEA AX,ARR
MOV AX,OFFSET ARR
注:OFFSET ARR求出ARR的偏移地址
inc 不影响标志
dec 不影响标志
注意减法设置CF的规则:
MUL (Unsigned Multiply) 无符号数乘法指令
格式:MUL SRC
执行的操作:
IMUL(Signed Integer Multiply) 有符号数乘法指令
格式: IMUL SRC
注意:
DIV(Unsigned Divide) 无符号除法指令
格式 DIV SRC
IDIV(Signed Integer Divide) 带符号除法指令
格式 IDIV SRC
操作时需要符号扩展指令
格式 DIV SRC,执行的操作:
SHL、SHR、SAL、SAR: 移位指令
ROL、ROR、RCL、RCR: 循环移位指令
实际上这里就是背单词
基于单个标志位的条件转移指令(Jumps Based on Special Arithmetic)
指令格式 | 检测的转移条件 | 功能描述 |
---|---|---|
JE/JZ opr | ZF=1 | Jump Equal or Jump Zero |
JNE/JNZ opr | ZF=0 | Jump Not Equal or Jump Not Zero |
JC opr | CF=1 | Jump Carry |
JNC opr | CF=0 | Jump Not Carry |
JO opr | OF=1 | Jump Overflow |
JNO opr | OF=0 | Jump Not Overflow |
JP/JPE opr | PF=1 | Jump Parity or Jump Parity Even |
JNP/JPO opr | PF=0 | Jump Not Parity or Jump Parity Odd |
JS opr | SF=1 | Jump Sign (negative) |
JNS opr | SF=0 | Jump Not Sign (positive) |
无符号数和有符号数字的跳转指令
指令格式 | 检测的转移条件 | 功能描述 |
---|---|---|
JA/JNBE opr | CF=0 and ZF=0 | Jump Above or Jump Not Below or Equal |
JAE/JNB opr | CF=0 | Jump Above or Equal or Jump Not Below |
JB/JNAE opr | CF=1 | Jump Below or Jump Not Above or Equal |
JBE/JNA opr | CF=1 or ZF=1 | Jump Below or Equal or Jump Not Above |
指令格式 | 检测的转移条件 | 功能描述 |
---|---|---|
JG/JNLE opr | ZF=0 and SF=OF | Jump Greater or Jump Not Less or Equal |
JGE/JNL opr | SF=OF | Jump Greater or Equal or Jump Not Less |
JL/JNGE opr | SF≠OF | Jump Less or Jump Not Greater or Equal |
JLE/JNG opr | ZF=1 or SF≠OF | Jump Less or Equal or Jump Not Greater |
CLD:(Clear Direction flag)
使DF=0,在执行串处理指令时可使地址自动增量
STD:(Set Direction flag)
使DF=1,在执行串处理指令时可使地址自动减量