我一直在尝试使用NASM在Linux中进行汇编,这样我就能理解loader.s script on OSDev。
我发现有趣的一件事是用dd声明变量时生成的程序集。我运行了一些测试,我把输出放在下面。本质上,我只是分配不同的数字,看看在目标文件中生成的程序集(而不是可执行文件)。
$ cat test1.s
global _start
section .text
dd 0x0
_start:
mov eax, 1
mov ebx, 0
int 80h
$ nasm -f elf test1.s ; objdump -d test1.o
test1.o: file format elf32-i386
Disassembly of section .text:
00000000 <_start-0x4>:
0: 00 00 add %al,(%eax)
...
00000004 <_start>:
4: b8 01 00 00 00 mov $0x1,%eax
9: bb 00 00 00 00 mov $0x0,%ebx
e: cd 80 int $0x80
$ cat test2.s
global _start
section .text
dd 0x0
dd 0x5
_start:
mov eax, 1
mov ebx, 0
int 80h
$ nasm -f elf test2.s ; objdump -d test2.o
test2.o: file format elf32-i386
Disassembly of section .text:
00000000 <_start-0x8>:
0: 00 00 add %al,(%eax)
2: 00 00 add %al,(%eax)
4: 05 00 00 00 b8 add $0xb8000000,%eax
00000008 <_start>:
8: b8 01 00 00 00 mov $0x1,%eax
d: bb 00 00 00 00 mov $0x0,%ebx
12: cd 80 int $0x80
$ cat test3.s
global _start
section .text
dd 0x0
dd 0x5
dd 0xf
_start:
mov eax, 1
mov ebx, 0
int 80h
$ nasm -f elf test3.s ; objdump -d test3.o
test3.o: file format elf32-i386
Disassembly of section .text:
00000000 <_start-0xc>:
0: 00 00 add %al,(%eax)
2: 00 00 add %al,(%eax)
4: 05 00 00 00 0f add $0xf000000,%eax
9: 00 00 add %al,(%eax)
...
0000000c <_start>:
c: b8 01 00 00 00 mov $0x1,%eax
11: bb 00 00 00 00 mov $0x0,%ebx
16: cd 80 int $0x80
$ cat test4.s
global _start
section .text
dd 0x0
dd 0x5
dd 0xf
dd 0x16
_start:
mov eax, 1
mov ebx, 0
int 80h
$ nasm -f elf test4.s ; objdump -d test4.o
test4.o: file format elf32-i386
Disassembly of section .text:
00000000 <_start-0x10>:
0: 00 00 add %al,(%eax)
2: 00 00 add %al,(%eax)
4: 05 00 00 00 0f add $0xf000000,%eax
9: 00 00 add %al,(%eax)
b: 00 16 add %dl,(%esi)
d: 00 00 add %al,(%eax)
...
00000010 <_start>:
10: b8 01 00 00 00 mov $0x1,%eax
15: bb 00 00 00 00 mov $0x0,%ebx
1a: cd 80 int $0x80
我的问题是为什么我们最初在eax寄存器中添加内容,然后在数据增长时修改edx和esi等其他寄存器?分配数据不应该使用寄存器,特别是不应该添加它们。为什么我永远不会看到正确的变量被放入寄存器(第一个问题的答案可能会回答这个问题)?例如,当我分配0x5时,我看到指令add $0xb8000000,%eax
,但该指令中没有0x5。
答案 0 :(得分:5)
当您使用dd 0
声明DWORD时,它实际上只是在该点的输出二进制文件中放置了4个字节的零。当您反汇编二进制文件时,它会将其解释为代码(当您打算将其作为数据时)。碰巧add %al,(%eax)
的操作码为00 00
答案 1 :(得分:0)
你在.text部分声明了这些变量,以及为什么要进行这些添加,为了摆脱这一点,只需声明.data部分,那些额外的添加就不会发生。