了解ATT组装(立即)

时间:2013-02-15 17:58:54

标签: c assembly att

假设我有以下装配线

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

  2. 从另一个注册表movl %eax, %edx - 我们现在将eax值复制到edx

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

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

  5. 如果这是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中等效。