Sets dst to the address computed by the srcexpression (does not go to memory! –it just does math)
Example: leaq (%rdx,%rcx,4), %ra
条件语句
CMP s2, s1 s1 - s2 compare
cmpb compare byte
cmpw compare word
cmpl compare double word
TEST s2, s1 s1 & s2
testb test byte
testw test word
testl test double word
资料
常见指令
Constant integer data
register
Memory
Moving Data
Missing letter (_) specifies size of operands
movb src, dst
movw src, dst Move 2‐byte “word
movl src, dst
movq src, dst
Arithmetic operations
Memory Addressing Modes
Address Computation Instruction
条件语句
set指令
jump指令
未完待续
反汇编工具
指针和引用的反汇编
反汇编:
对于 pnVar = &var 这个语句,我们看是对应于两条指令,用一个
栈空间保存了该地址
。pcVar也是这样。对于引用,则是编译器计算了地址,然后将将其赋值给rdi。对于函数调用:rdi是第一个参数,rsi是第2个。所以我们在看调用printf的反汇编的时候,看到了如下的几种方式引用和指针的区别:只是引用类型是通过编译器实现寻址,而指针需要手动寻址。 手动寻址的意思是要用栈空间保存该指针的地址。
我们看看返回的引用:
直接就是leaq指令将地址返回给rax,所以这样做,在程序返回后是无效的地址。
this指针
这里经过反汇编:
见下图
我们看看,这里首先分配了16个字节,然后,将rdi设置成该改地址,而rdi就是this指针的值。this指针中保存了所属对象的首地址。在调用成员函数的过程中,编译器利用`rdi寄存器保存了对象的首地址,并以寄存器传参的方式传递到成员函数中。
虚函数
虚函数的布局:
SubClass 中包含两个指向属于BaseClass的函数( BaseClass::vfunc2 和 BaseClass::vfunc4)的指针。这是因为 SubClass 并没有重写这2个函数,而是直接继承自BaseClass 。
由于没有针对纯虚函数BaseClass::vfunc1的实现,因此,在 BaseClass的虚表中并没有存储 vfunc1 的地址。 这时,编译器会插入一个错误处理函数的地址,名为 purecall,万一被调用,它会令程序终止或者其他编译器想要发生的行为。
另外,一般的成员函数不在虚表里面,因为不涉及动态调用,如BaseClass中的hello()函数。