2

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,%eax0x5を割り当てているときに命令が表示されますが、その命令には0x5がありません。

4

2 に答える 2

5

でDWORDを宣言するとdd 0、文字通り、その時点で出力バイナリに4バイトのゼロが配置されます。バイナリを分解するときは、それをコードとして解釈します(データを意図した場合)。のオペコードadd %al,(%eax)00 00

于 2013-01-06T22:21:07.547 に答える
0

.textセクションでこれらの変数を宣言したので、これらの追加が行われています。これを取り除くには、.dataセクションを宣言するだけで、これらの追加の追加は行われません。

于 2015-01-19T00:32:05.083 に答える