寄存器
RIP
存放下一条指令的偏移地址
RSP
存放当前栈帧的栈顶偏移地址
RBP
存放当前栈帧的栈底偏移地址
RAX
通用寄存器。存放函数的返回值
汇编
实际中执行指令时,EIP已经移动到下一行了
cmp
语句 | cmp a1,0x61 | sub a1,0x61 |
---|---|---|
本质 | a1-0x61 | a1=a1-0x61 |
不同 | a1不会赋值 | a1会赋值 |
cmp只会判断减去后值是不是为0
lea
把寄存器存储的地址进行加减操作后赋值给另外一个寄存器
lea rax,[rbp-0x18] :rax=rbp-0x18
为什么不用sub
- 如果用sub,需要sub rbp,0x18;mov rax,rbp;add rbp,0x18,指令太长了。
- mov rax,[rbp-0x18]会直接把[rbp-0x18]存储的信息赋值给rax,而不是地址
xor
xor eax,eax:让eax等于0
不用mov ebx 0
xor eax,eax短
test
test eax,eax => cmp eax,0 exa=0 -> 0 eax!=0 -> !0
相当于and eax,eax,但是不赋值给eax
push
push ebp : esp-4,把ebp放入esp所指的位置
pop
pop ebp :把esp指向的地方赋给ebp,esp+4。esp往下挪
junp
junp 0x11111 -> mov eip 0x11111
call
call : push call的下一条指令(返回地址); jump func;
leave
leave : move esp,ebp;pop ebp;
把esp移到ebp的位置,ebp再到此时栈顶(esp)的地址上,然后esp再加4。也就是往下挪
ret
pop eip ; 从栈中弹出返回地址并存入 EIP
到ret命令时,esp在哪,就把哪里的地址存储的参数给eip
把esp给eip,同时eip加4
对应关系
push ebp; --- pop ebp;
push ebp;pop ebp; --- leave
call; --- ret
标签:esp,汇编语言,pop,rbp,a1,eax,ebp From: https://www.cnblogs.com/r0xy/p/18498527