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”这是什么意思?有四种方法可以将内容加载到寄存器中:
$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几乎所有作为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;