假设我有以下装配线
movl $-1, %edi
movl $1, %edx
我究竟将什么存储到 %edi/%edx 寄存器中。
基本上,如果我要将此代码转换为 C 程序,我是否会将一些变量初始化为 -1 和 1,因为这就是我的看法,这就是我认为我感到困惑的地方。
我理解立即 =“一些常数”,但这是什么意思?
假设我有以下装配线
movl $-1, %edi
movl $1, %edx
我究竟将什么存储到 %edi/%edx 寄存器中。
基本上,如果我要将此代码转换为 C 程序,我是否会将一些变量初始化为 -1 和 1,因为这就是我的看法,这就是我认为我感到困惑的地方。
我理解立即 =“一些常数”,但这是什么意思?
有四种方法可以将某些内容加载到寄存器中:
立即值 - 在 AT&T 汇编程序中,它使用 a $number
,并将该特定值(数字)加载到寄存器中。请注意,number
它不一定是数值,例如,它可以是movl $printf, %eax
- 这会将函数的地址加载printf
到寄存器eax
中。
从另一个寄存器,movl %eax, %edx
- 我们现在将eax
值复制到edx
.
从一个固定的内存位置, movl myvar, %eax
- 的内容myvar
在eax
.
从另一个寄存器中的内存位置,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, %eax
C 中的x += 3;
.