常用寄存器
- 常用寄存器通常有以下16個:
- %rax,%rbx,%rcx,%rdx,%rdi,%rsi,%rbp,%rsp
- %r8,%r9,%r10,%r11,%r12,%r13,%r14,%r15
-
%rax,%rdx通常存儲函數(shù)的返回值; - %rdi,%rsi,%rcx,%rdx,%r8,%r9通常用來存儲函數(shù)的參數(shù);
-
%rbp,%rsp通常用于棧操作,函數(shù)棧的內(nèi)存分配,局部變量的內(nèi)存分配; -
以%r開頭的寄存器,能存儲8個字節(jié)64位的數(shù)據(jù); -
以%e開頭的寄存器,能存儲4個字節(jié)32位數(shù)據(jù); - %ax,%bx,%cx寄存器,能存儲2個字節(jié)16位數(shù)據(jù);
- %ah,%al,%bh,%bl寄存器,能存儲1個字節(jié)8位數(shù)據(jù);
- 注意存儲高字節(jié)的寄存器是向下兼容低字節(jié)寄存器的;
指令
-
movp %rax,%rdx-->將rax寄存器中的值,賦值給rdx寄存器; -
movp $3,%rax--> 將立即書3,以8字節(jié)的方式,放入rax寄存器中; -
movp $0xa,0x4ab6(%rip)--> 將立即數(shù)0xa,以8字節(jié)的方式,放入內(nèi)存地址(rip + 0x4ab6)中,寄存器rip中存儲的是內(nèi)存地址; -
leaq -0x18(%rbp),%rax--> 將(rip - 0x18)的內(nèi)存地址,存儲到rax寄存器中,寄存器rip中存儲的是內(nèi)存地址; -
jmp 0x10101010--> 跳轉(zhuǎn)到地址0x10101010,一般是函數(shù)的內(nèi)存地址;當(dāng)當(dāng)前函數(shù)執(zhí)行完成時,不會返回到原來跳轉(zhuǎn)之前地址的下一個內(nèi)存地址,會一直往下執(zhí)行; -
jmp *%rdx--> 跳轉(zhuǎn)到寄存器rdx存儲的內(nèi)存地址; -
call 0x10101010--> 也是跳轉(zhuǎn)到地址0x10101010,當(dāng)當(dāng)前函數(shù)執(zhí)行完成時,會返回到原來跳轉(zhuǎn)之前地址的下一個內(nèi)存地址; - 操作數(shù)長度:
- b -- 表示1字節(jié)8位;
- w -- 表示2字節(jié)16位;
- l -- 表示4字節(jié)32位;
- q -- 表示8字節(jié)64位;