一个c/c++开发人员,居然不会汇编,真是惭愧。趁着闲暇时间学习一下汇编,曲不离口,码不离手。看一个简单的例子:
.section .datavalue:.quad 200.section .text
.global main
main:nopMOVL value, %eaxret
就这一条指令:movl value, %eax 表示把 value 的值加载到 eax 寄存器,GDB 跟踪一下:
看结果,value 的值 200 已经加载到了 eax 寄存器,那如果是 movl $value, %eax 呢?看下面这段汇编代码:
.section .datavalue:.quad 200.section .text
.global main
main:nopmovl $value, %eaxmovl $500, %eaxret
GDB 跟踪一下看看,在执行 movl $value, %eax 后,eax 寄存器里是什么样的?
在执行 movl $value, %eax 后,eax 寄存器里存入了 value 的地址 0x601028(十进制为6295592),那如果往下执行 movl $500, %eax 会是怎样的结果呢?
此时 eax 寄存器里已经变成了 500,而原来的 value 的值是没有必变的,用 x 查看其内存里的值还是200。如果想修改 eax 里存的那个地址指向的值改如何操作呢,即如何通过这个寄存器修改 value 的值 ?
可以看到,用 movl $500, (%eax) 来修改 eax 里地址指向的值,eax 里的值是没变化的,但它的值所指向的值被修改了,即 value 变成了 500。这个是不是类似 c/c++ 里的指针呢?
总结:$标签 ----- 表示此标签的地址,而不加 $ 表示标签的值。