一直以为一个简单的i++
操作,会变成三条会变指令:
- 加载内存内容到寄存器
- 对寄存器进行加法操作
- 写回内存
然而事实上,add指令的操作对象,可以直接是内存的内容,这里有相关的说明:http://x86.renejeschke.de/html/file_module_x86_id_5.html
示例代码如下:
int count = 20;
asm(
"addl $80, %0 \n"
: : "m" (count) :);
printf("%d\n", count);
汇编之后的结果:
movl $20, -4(%rbp)
addl $80, -4(%rbp)
movl $20, -4(%rbp)
是对count进行赋值,后面的addl便是直接对其+80。
如果按照先加载到寄存器再操作的写法:
asm(
"addl $80, %0 \n"
: "+r"(count) : :);
printf("%d\n", count);
汇编之后是:
movl -4(%rbp), %eax
addl $80, %eax
movl %eax, -4(%rbp)
就是常见的3条指令的形式了。