LinuxでNASMを使用してアセンブリを実験してきたので、OSDevのloader.sスクリプトを理解できました。
私が興味深いと思ったのは、変数が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などの他のレジスタを変更するのかということです。そのデータを割り当てることはレジスターを使用するべきではなく、特にそれらを追加するべきではありません。そして、なぜ正しい変数がレジスターに入れられているのを見ることができないのですか(最初の質問への答えがこれに答えるかもしれません)?たとえば、add $0xb8000000,%eax
0x5を割り当てているときに命令が表示されますが、その命令には0x5がありません。