RAP:用来存放返回值
RBP,RSP:做栈,保护栈
pop edp:ebp转换到指向原来所在地址的栈中内容(一般是个地址)
以上为编译器发展的近况,与操作系统(cpu)无关。
rax,rbx,rcx,rdx,rsi,rdi,rbp,rsp等r8之前的寄存器前三十二位为eax等(exx形式),后三十二位为xx(例:ax)。
r8之后为r8d等.(rxx形式),后32位为rxxw。
rip:存放当前执行的指令的地址。
(gdb) disassemble $rip 反编译rip中地址所对应的命令
rip可换为其对应的命令函数名(eg:main)
set disassembly-flavor intel将反编译转化为英特尔模式 在gdb运行编译程序时直接输入命令
设置断点:
b * 0x8048489
查看断点 个数,地址,所在函数位置
i b
执行到断点位置
c
查看寄存器信息
i r
使断点有效(已设置断点):
enable b id[b-id为中断编号]
enable id
使断点失效(已设置断点):
标准写法:disable b id[b-id为中断编号]
不标准写法:d 2(2指断电的num),disable 2
lea =》Load effective address(原含义)
现含义:lea rax,[rbp-0x18] 用于计算等 op后长度更短,必须加方括号,不加为原含义
xor异或指令:
eg:xor ebx,ebx (两指令)=>将ebx=0 (对比mov ebx ,0(三指令)更短)
但xor有影响标志寄存器的副作用,但mov没有
jcc系列
cmp:
大概类用于sub,减的作用。
区别:
cmp:cmp al,0x61——al-0x61不赋值且不存储,与jne对比使用(strcmp类似于cmp)
sub:sub al ,0x61——al=al-0x61赋值且存储
ni:步入
si:步过
finish:步出函数
PTR——指针
8 16 32 64 个01位(bit)
BYTE WROD DWORD QWORD
拿多少内存的数赋值
cpu进行运算。从寄存器中取数。
定义的数优先存在16个寄存器中,其余过多的参数存在虚拟内存中。
如果刚开始就过多,参数从寄存器移到虚拟内存(push),使用时候从虚拟内存移到寄存器中。
查看内存的数:
X/20i 4RIP
{与disassemble不同的一点是 x只会显示你输入的数量的相关语句,而disassemble会把所有相关语句都汇编}
20:以下20行关于XXX的指令
rip:相当于上句的xxx
i:采用汇编的形式呈现 b:以byte形式看一个字节的形式显示 g:以八个字节的形式呈现 w以四个字节的形式呈现
d:以十进制显示 (常用搭配bd) x:以十六进制显示
x/20b $rbp-0x10
看最后方地址的内容是什么,连续看20句相关内容
x/20i 0向5555555552ce
从末尾地址往下看20行以汇编形式呈现
set
*0x1111111111 =19 *地址=值
$rbp=19 $寄存器=值
{char[4]} 0x131312=“ACE”