Linux 在美国电话电报公司,;T组件,什么';s=2和=2美元之间的差额是多少?

Linux 在美国电话电报公司,;T组件,什么';s=2和=2美元之间的差额是多少?,linux,assembly,x86,constants,att,Linux,Assembly,X86,Constants,Att,我曾经认为,当使用整数作为常量时,我总是需要附加一个“$”符号,除非数字被解释为地址,所以我有: .data a=$2 .equ b,3 .text .globl _start _start: movl $a,%ebx movl $b,%ecx movl $1,%eax int $0x80 此代码编译为: 0: bb 00 00 00 00 mov $0x0,%ebx 5: b9 03 00 00 00 mov $0x3,%ecx a: b

我曾经认为,当使用整数作为常量时,我总是需要附加一个“$”符号,除非数字被解释为地址,所以我有:

.data
a=$2
.equ b,3
.text
.globl _start
_start:
movl $a,%ebx
movl $b,%ecx
movl $1,%eax
int $0x80
此代码编译为:

0:  bb 00 00 00 00          mov    $0x0,%ebx
5:  b9 03 00 00 00          mov    $0x3,%ecx
a:  b8 01 00 00 00          mov    $0x1,%eax
f:  cd 80                   int    $0x80
我不知道作为编译器如何处理a=$2,为什么$2被编译成0x0? 然后我删除了“$”

这一次,编译的代码是正确的:

0:  bb 02 00 00 00          mov    $0x2,%ebx
5:  b9 03 00 00 00          mov    $0x3,%ecx
a:  b8 01 00 00 00          mov    $0x1,%eax
f:  cd 80                   int    $0x80

所以我的问题是,这里的“2”和“$2”有什么区别?

我假设您显示的输出是
.o
文件的
objdump
,而不是最终的可执行文件。因为
a=$2
以及随后的
movl$a,%ebx
将由汇编程序解析为
movl$$2,%ebx
。这会将标签
$2
的地址移动到EBX。除非您在链接的对象之一中定义了符号
$2
,否则我希望您在尝试链接到可执行文件时会得到一个未定义的引用。如果您在使用OBJDUMP时处理对象文件(
.o
),则您看到的0x0是链接器在链接时解析的占位符。如果要执行
objdump-Dr myfile.o
,它可能会显示一个重新定位条目。对于符号
$2
。类似于
1:R\u 386\u 32$2
。当链接器最终创建一个可执行文件时,0x00将由标签地址填写
$2
Michael Petch说到点子上了!我假设您显示的输出是
.o
文件的
objdump
,而不是最终的可执行文件。因为
a=$2
以及随后的
movl$a,%ebx
将由汇编程序解析为
movl$$2,%ebx
。这会将标签
$2
的地址移动到EBX。除非您在链接的对象之一中定义了符号
$2
,否则我希望您在尝试链接到可执行文件时会得到一个未定义的引用。如果您在使用OBJDUMP时处理对象文件(
.o
),则您看到的0x0是链接器在链接时解析的占位符。如果要执行
objdump-Dr myfile.o
,它可能会显示一个重新定位条目。对于符号
$2
。类似于
1:R\u 386\u 32$2
。当链接器最终创建一个可执行文件时,0x00将由标签地址填写
$2
Michael Petch说到点子上了!
0:  bb 02 00 00 00          mov    $0x2,%ebx
5:  b9 03 00 00 00          mov    $0x3,%ecx
a:  b8 01 00 00 00          mov    $0x1,%eax
f:  cd 80                   int    $0x80