为什么以下代码打印“Hello,world!” (在“我的”系统上)?
.file "test.c"
.globl main
.data
.align 32
.type main, @object
.size main, 56
main:
.value 3816
.value 0
.value 18432
.value 27749
.value 28524
.value 8236
.value 28535
.value 27762
.value 8548
.value -29942
.value 9228
.value 7305
.value -17884
.value 14
.value 0
.value 20818
.value 443
.value 0
.value 21248
.value 1208
.value 0
.value -32000
.value 1260
.value -32563
.value -15229
.value 23312
.value -16335
.value -28477
另外,.value
是什么意思,它将如何转换为机器代码?
答案 0 :(得分:5)
我把它组装好然后拆开它,这就是我得到的。我没有运行它,因为我知道比在网上运行随机的汇编语言更好。
代码首先分支到打印代码:
00000000 <main>:
0: e8 0e 00 00 00 call 13 <main+0x13>
然后按照ASCII“Hello,World!\ n”:
5: 48 65 6c 6c 6f 2c 20
c: 77 6f 72 6c 64 21 0a
代码跳转到第一条指令:
13: 8b 0c 24 mov (%esp),%ecx
16: 89 1c 24 mov %ebx,(%esp)
19: ba 0e 00 00 00 mov $0xe,%edx
1e: 52 push %edx
1f: 51 push %ecx
20: bb 01 00 00 00 mov $0x1,%ebx
25: 53 push %ebx
26: b8 04 00 00 00 mov $0x4,%eax
2b: 83 ec 04 sub $0x4,%esp
2e: cd 80 int $0x80
30: 83 c4 10 add $0x10,%esp
33: 5b pop %ebx
34: 31 c0 xor %eax,%eax
36: c3 ret
37: 90 nop
FWIW,使用的方法是将代码粘贴到文件foo.S
中,然后:
gcc -S foo.S
objdump -D foo.o
答案 1 :(得分:2)
这看起来像汇编代码。需要指出的一些关键事项是
鉴于此,剩下的技巧是将emmited的字节转换为它们对应的指令。这可以使用“英特尔64和IA-32架构软件开发人员手册:第2B卷”中的操作码映射来完成,可从here获得
答案 2 :(得分:0)
.value
是原始内存数据。它们本身就是机器代码。该文件包含的程序不是人类可读的助记符,而是十进制数字(看起来像两个字节的有符号数字)如果你想把程序视为可读代码,编译它并使用任何反汇编程序。
答案 3 :(得分:0)
.value未转换为机器代码。这是一个汇编指令。
.globl指令导出主符号。这是典型的,因为链接器需要公开显示main。 .data指令开始可执行文件的数据段,然后将main声明为大小为56的对象,因为有28个.value语句,每个语句代表一个16位值。
.value之后指定的数字似乎是表示已翻译指令的原始二进制值。需要了解您的操作系统和处理器才能进一步确定其含义。
希望有所帮助。