2013-01-06 28 views
2

我一直在用NASM試驗Linux程序集,以便我能理解loader.s script on OSDevNASM爲dd生成的程序集說明

我發現有趣的一件事是當用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。

回答

5

當你聲明一個帶有dd 0的DWORD時,它實際上只是在輸出二進制文件中放置了4個字節的零。當你拆解二進制文件時,它將解釋爲代碼(當你打算將它作爲數據時)。碰巧add %al,(%eax)的操作碼是00 00

0

你在.text部分聲明瞭這些變量,這就是爲什麼這些添加正在發生,爲了擺脫這一點,只聲明.data部分,這些額外的添加不會發生。