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