寄存器
EAX:累加器,一般存放运算结果
EBX:基址寄存器,一般用作内存寻址的基地址,DS段的数据指针
ECX:计数器,一般用作字符串操作和循环操作的计数器
EDX:用于存储部分乘法结果和部分除法被除数
EBP:栈底指针,SS段的数据指针
ESP:栈顶指针,一般指向栈顶
EDI:字符串操作的目标指针,ES段的数据指针
ESI:字符串操作的源指针,SS段的数据指针
FALAGS寄存器:
内存的表现形式
- 立即数
MOV EAX, DWORD PTR DS:[0x????????]
- 寄存器
MOV EBX, 0x????????
MOV EAX, DWORD PTR DS:[EBX]
- 寄存器+立即数
MOV EBX, 0x????????
MOV EAX, DWORD PTR DS:[EBX+4]
- 数组元素地址=数组首地址+元素索引*数组元素占用空间
MOV EAX, 0x????????
MOV EBX, 0x2
MOV ECX, DWORD PTR DS:[EAX + EBX * 4]
- 比例因子+立即数
MOV EAX, 0x????????
MOV EBX, 0x2
MOV ECX, DWORD PTR DS:[EAX+EBX*4+1]
数据存储模式
大端序:数据高位在内存地位,数据低位在内存高位,常用于arm架构
小段序:数据低位在内存高位,数据高位在内存低位,常用于x86,amd64架构
汇编指令
ADD
: 加法
ADC
:带进位加法
SUB
:减法
SBB
:带借位减法
MUL
:无符号乘法
IMUL
:有符号乘法
DIV
:无符号除法
IDIV
:有符号除法
INC
:自增
DEC
: 自减
AND
:按位与运算
OR
:按位或运算
XOR
:按位异或
NOT
:按位取反运算
PUSH
:压栈指令
POP
:出栈指令
MOV
:数据传送指令
LEA
:有效地址传送指令
XCHG
:数据交换指令
CMP
:比较指令
TEST
:测试指令
JMP
:无条件跳转指令
JZ/JE
:ZF=1不等于0或相等跳转
JNZ/JNE
:ZF=0不等于1或不相等跳转
JBE/JNA
:CF=1/ZF=1低于等于/不高于跳转
JNBE/JA
:CF=0/ZF=0不低于等于/高于跳转
JL/JNGE
:SF!=OF小于/不大于等于跳转
JNL/JGE
:SF=OF不小于/大于等于跳转
MOVS
:字符串传送指令
MOVSB
:BYTE传送指令
MOVSW
:WORD传送指令
STOS
:字符串存储指令
REP
:字符串重复前缀指令
CALL
:过程调用指令,相当于push eip,jmp OPRD
RETN
:返回指令,相当于pop eip,jmp eip
过程调用-函数
过程调用的方式:
//寄存器传参
.586
.model flat, stdcall
.code
myfucntion proc
add eax, ebx
ret
myfunction endp
main proc
mov eax, 1
mov ebx, 2
call myfunction
nop
main endp
end main
//堆栈传参
.586
.model flat, stdcall
.code
myfucntion proc
mov eax, [esp+4]
mov ebx, [esp+8]
add eax, ebx
ret
myfunction endp
main proc
push 1
push 2
call myfunction
nop
main endp
end main
win32API
win32API参数传递遵循从后往前压栈原则
.586
.MODEL flat, stdcall
includelib user32.lib
includelib kernel32.lib
ExitProcess PROTO, dwExitCode:DWORD
MessageBoxA PROTO, hWnd:DWORD, lpText:BYTE, lpCaption:BYTE, uType:DWORD
.data
string db "helloworld",0
.code
main proc
push 0
push offset string
push offset string
push 0
call MessageBoxA
add esp, 16 //堆栈平衡
call ExitProcess
main endp
end main