假设我有以下装配线
movl $-1, %edi
movl $1, %edx
我究竟要存储在%edi /%edx寄存器中。
基本上,如果我将这段代码转换为C程序,我是否会将一些变量归为-1和1,因为我就是这样看的,这就是我认为我感到困惑的地方。
我理解立即=“某些常数”,但这是什么意思?
答案 0 :(得分:3)
有四种方法可以将某些内容加载到寄存器中:
立即值 - 在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
将在x += 3;
的C中等效。