文章目录
常见汇编指令
格式:mov 目的操作数,源操作数
作用:拷贝源操作数到目标操作数
- 源操作数可以是立即数,通用寄存器,段寄存器,或者内存单元
- 目标操作数可以是通用寄存器,段寄存器或者内存单元
- 操作数的宽度必须一样
- 源操作数和目标操作数不能同时位内存单元
- SUB 相减指令
- ADD 相加指令
- AND 相与指令
- OR 或指令
- XOR 异或指令
- NOT 非指令
- LEA 取地址
mov word ptr DS:[0x12345678],0xFFFF
word:数据宽度
ptr:表示这是内存
[]:[]内的是内存编号
db 内存地址 data byte
dd 内存地址 data dword
dw 内存地址 data word
寻址公式:
寻址公式一:[立即数]
寻址公式二:[reg]
寻址公式三:[reg+立即数]
寻址公式四:[reg+reg*(1 2 4 8)]
寻址公式五:[reg+reg*(1 2 4 8)+立即数]
位移(Displacement) - 8 位、16 位或 32 位值
基(Base) - 通用目的寄存器
索引(Index) - 除 ESP 外的通用目的寄存器
比例因子(Scale Factor) - 1,2,4 或 8
下列五种地址模式为常用组合(图 2-3):
·位移
·基
·基 + 位移
·(索引×比例因子)+ 位移
·基 + (索引×比例因子)+ 位移
为什么只有五种表示方法,而且比例因子还有限制?
极有可能的原因是(猜测):计算机只识别机器语言,所以我们要将内存地址的表示方
法翻译成机器语言才能得到执行。组合越多,翻译起来越麻烦,cpu 的技术员们只好订个规
矩:只能使用五种表示方法,否则一律不识别。
堆栈
-
PUSH:压栈
lea esp,[esp-4] // 上移指针sp
mov [esp],eax // 向sp指向的位置填入eax
这两条指令的组合就是指令:push eax
push r32
push r16
push m32
push m16
push imm8/imm16/imm32
-
POP:出栈
mov eax,[esp] //把sp处的内容填入eax
lea esp,[esp+4] //把sp指针下移
就是指令 pop eax。
pop r32
pop r16
pop m32
pop m16
- PUSHAD
保存现场:把八位寄存器全部压栈
pushad={
tmp=esp
push eax
push ecx
push edx
push ebx
push tmp
push ebp
push esi
push edi
}
- POPAD
恢复现场:还原八位寄存器的值
需要了解具体的(pusha pushad;popa popad),请看:https://blog.csdn.net/longintchar/article/details/50866801