1

假设我有以下装配线

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

我究竟将什么存储到 %edi/%edx 寄存器中。

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

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

4

1 回答 1

3

有四种方法可以将某些内容加载到寄存器中:

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

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

  3. 从一个固定的内存位置, movl myvar, %eax- 的内容myvareax.

  4. 从另一个寄存器中的内存位置,movl (%eax), %edx- 现在,edx无论 32 位值在eax. 当然,假设它实际上是一个“好”的内存位置——如果不是,我们就有一个段错误。

如果这是 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, %eaxC 中的x += 3;.

于 2013-02-15T18:21:32.130 回答