Assembly 理解ATT组件(即时)

Assembly 理解ATT组件(即时),assembly,x86,att,immediate-operand,Assembly,X86,Att,Immediate Operand,假设我有以下装配线 movl $-1, %edi movl $1, %edx 我到底在%edi/%edx寄存器中存储什么 基本上,如果我把这段代码转换成一个C程序,我会把一些变量初始化为-1和1,因为我就是这么看的,这就是我感到困惑的地方 我理解immediate=“some constant”这是什么意思?有四种方法可以将内容加载到寄存器中: 立即值-在AT&T汇编程序中,使用$number,并将特定值(number)加载到寄存器中。请注意,number不必是数值,它可以是,例如,m

假设我有以下装配线

movl   $-1, %edi
movl   $1, %edx
我到底在%edi/%edx寄存器中存储什么

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


我理解immediate=“some constant”这是什么意思?

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

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

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

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

  • 从另一个寄存器中的内存位置,
    movl(%eax),%edx
    -现在,
    edx
    具有
    eax
    中地址处的任何32位值。当然,假设它实际上是一个“好”的内存位置——如果不是,我们就有一个segfault

  • 如果这是C代码,代码可能有点像这样:

    (一)

    (二)

    (三)

    (四)

    编辑:
    几乎所有作为move指令“源”的东西也可以是算术运算的源,例如
    add$3,%eax
    在C中等同于
    x+=3

    看起来你已经正确理解了。Immediate是嵌入到代码中的常量。这里我们有两个常量,-1和1。请注意,这不一定与在
    C
    中初始化变量相同。实际上,您正在将一个值加载到寄存器中。正如您所说,立即数是一个常量。它被称为立即数,因为它被编码到实际的指令中(而不是从内存中)。AT&T风格的语法可以按任意方式执行所有操作。你最好使用英特尔的语法。理解AT&T语法的人越少,它就死得越早。不幸的是,我必须坚持我的学校教给我的东西:(只是中间值也可以用于其他上下文,例如加法或其他操作。你也可以使用
    lea
    加载立即值或其他寄存器中的值(两者都需要表示为内存地址)到寄存器中:1)
    lea-eax,number
    2)
    lea-edx,[eax]
    3)&4)无法使用
    lea
    执行这些操作。
    int x = 42; 
    
    int (*printfunc)(const char *fmt, ...) = printf;
    
    int x = 1;  
    int y = 2; 
    ..., 
    x = y;     // movl  %eax, %edx
    
    int x = myvar;
    
    int x = *myptr;