了解ATT组装(立即)
假设我有以下assembly线
movl $-1, %edi movl $1, %edx
我究竟要存储在%edi /%edx寄存器中。
基本上如果我将这个代码转换成C程序,我会将一些变量初始化为-1和1,因为这就是我看到它的方式,而这就是我认为我感到困惑的地方。
我明白,立即=“一些常数”,但这是什么意思?
将内容加载到寄存器有四种方法:
-
立即值 – 在AT&T汇编程序中,使用
$number
,并将该特定值(数字)加载到寄存器中。 请注意,number
不必是数字值,例如,它可以是movl $printf, %eax
– 这会将函数printf
的地址加载到寄存器eax
。 -
从另一个寄存器,
movl %eax, %edx
– 我们现在将eax
值复制到edx
。 -
从固定的内存位置,
movl myvar, %eax
–myvar
的内容在eax
。 -
从另一个寄存器中的内存位置,
movl (%eax), %edx
– 现在,edx
具有eax
地址的32位值。 当然,假设它实际上是一个“好”的内存位置 – 如果没有,我们就有一个段错误。
如果这是C代码,代码可能会像这样:
1)
int x = 42; int (*printfunc)(const char *fmt, ...) = printf;
2)
int x = 1; int y = 2; ..., x = y; // movl %eax, %edx
3)
int x = myvar;
4)
int x = *myptr;
编辑:几乎所有作为移动指令的“源”的东西也可以作为算术运算的来源,例如add $3, %eax
将等效于C x += 3;
。