概述
- 学习汇编的意义
- 开发时调试
- 逆向时的代码阅读
- 某些特殊技术的使用(shellcode,壳)
- 16/32/64汇编的区别
栈的作用:
- 存储数据
- 保存寄存器环境
- 传递参数
-
lea eax,dword ptr ss:[esp-4] 将 ss:[esp-4] 传入eax(传址)
-
xchg eax,dword ptr ss:[esp-4] 将两操作数互相交换
比较指令
-
cmp oprd1,oprd2 将两数相减进行比较
-
test oprd1,oprd2 仅影响标志位,进行and运行
选择常用的jcc指令
-
jmp 无条件
-
JZ/JE ZF=1/等于0/相等跳转
-
JNZ/JNE ZF=0 /不等于0/不相等
-
JBE/JNA: CF=1/ZF=1 低于等于/不高于跳转
-
JNBE/JA : CF=0/ZF=0 不低于等于/高于跳转
-
JL/JNGE : SF ! =OF 小于/不大于等于跳转
-
JNL/JGE : SF=OF 不小于/大于等于跳转
串操作指令
-
movs p1,p2 p2-->p1 p2为源串符号地址,p1为目的串符号地址
-
stos oprd
- 功能:把AL(字节)或AX(字)中的数据存储到DI为目的串地址指针所寻址的存储器单元中去指针DI将根据DF的值进行自动调整.
.586
.MODEL flat,stdcall
.code
addf proc
add eax,ebx
ret
addf endp
main proc
mov eax,6
mov ebx,5
call addf
mov eax,eax
main ENDP
END main
.586
.MODEL flat,stdcall
.code
addf proc
mov eax,[esp+4]
mov ebx,[esp+8]
add eax,ebx
ret
addf endp
main proc
push 5
push 6
call addf
mov eax,eax
main ENDP
END main
API
-
ExitProcess PROTO, dwExitCode : DWORD
-
MessageBoxA PROTO hWnd : DWORD, IpText : BYTE, IpCaption: BYTE, uType:DWORD
.586
.MODEL flat,stdcall
includelib user32.lib
includelib kernel32.lib
ExitProcess PROTO, dwExitCode : DWORD
MessageBoxA PROTO hWnd : DWORD, IpText : BYTE, IpCaption: BYTE, uType:DWORD
.data
string db "helloworld",0
.code
main proc
push 0
lea eax,string
push eax
push eax
push 0
call MessageBoxA
add esp,16
call ExitProcess
main ENDP
END main