Я написал этот простой ассемблерный код, запустил его и посмотрел на область памяти, используя GDB:
.text
.global _main
_main:
pushq %rbp
movl $5, -4(%rbp)
addl $6, -4(%rbp)
popq %rbp
ret
Он добавлял 5-6 непосредственно в память и, согласно GDB, работал. Так что это выполнение математических операций непосредственно в памяти вместо регистров процессора.
Теперь написать то же самое в C и собрать его в сборку получается так:
... # clang output
xorl %eax, %eax
movl $0, -4(%rbp)
movl $5, -8(%rbp)
movl -8(%rbp), %ecx # load a
addl $6, %ecx # a += 6
movl %ecx, -8(%rbp) # store a
....
Это перемещение их в регистр, прежде чем добавлять их вместе.
Так почему бы нам не добавить непосредственно в память?
Это медленнее? Если это так, то почему добавление непосредственно в память даже разрешено, почему ассемблер не жаловался на мой код ассемблера в начале?
Изменение: Вот код C для второго блока сборки, я отключил оптимизацию при компиляции.
#include <iostream>
int main(){
int a = 5;
a+=6;
return 0;
}