了解ATT组装(立即)

假设我有以下assembly线

movl $-1, %edi movl $1, %edx 

我究竟要存储在%edi /%edx寄存器中。

基本上如果我将这个代码转换成C程序,我会将一些变量初始化为-1和1,因为这就是我看到它的方式,而这就是我认为我感到困惑的地方。

我明白,立即=“一些常数”,但这是什么意思?

将内容加载到寄存器有四种方法:

  1. 立即值 – 在AT&T汇编程序中,使用$number ,并将该特定值(数字)加载到寄存器中。 请注意, number不必是数字值,例如,它可以是movl $printf, %eax – 这会将函数printf的地址加载到寄存器eax

  2. 从另一个寄存器, movl %eax, %edx – 我们现在将eax值复制到edx

  3. 从固定的内存位置, movl myvar, %eaxmyvar的内容在eax

  4. 从另一个寄存器中的内存位置, 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;