2013-03-13 55 views
1

我一直在與NASM一起玩耍,並研究這種情況如何編譯asm代碼。我編譯的彙編代碼用下面的命令行來自nasm編譯器的jmp指令的奇怪機器代碼

nasm -f bin crash_test_172.asm -o crash_test -l crash_test_172.lst 

和它的一個非常簡單的彙編文件,其內容是

bits 16 
org 0x7c00 

jmp main 

Message db "Hello World", 0x0 

main: 
    cli 
    mov ax,cs 
    mov ds,ax 
    mov es,ax 
    mov ss,ax 
    sti 

當我打開列表文件crash_test_172.lst我發現這相當有趣觀察。這是列表文件的內容。

1         bits 16 
2         org 0x7c00 
3 
4 00000000 EB0C     jmp main 
5 
6 00000002 48656C6C6F20576F72-  Message db "Hello World", 0x0 
7 0000000B 6C6400 
8 
9         main: 
10 0000000E FA       cli 
11 0000000F 8CC8      mov ax,cs 
12 00000011 8ED8      mov ds,ax 
13 00000013 8EC0      mov es,ax 
14 00000015 8ED0      mov ss,ax 
15 00000017 FB       sti 
16 

如果我不理解這個錯誤,在第4行中,JMP指令指向字節0C而,按照上市後,在0E主開始的第一條指令。

我也注意到在我一直在玩的所有其他asm代碼中的這種差異。令人驚訝的是,他們每個人的作品。

我錯過了什麼嗎?有人能幫我理解爲什麼它是這樣的嗎?不應該4行爲EB0E;指向字節0E,主指令下的第一條指令?

回答

2

0xEB是一個短暫的相對跳轉,所以它是跳轉後的IP(0x2)加上使其成爲0xE的偏移量(0xC)的IP。

+0

好的。這是我不知道的。非常感謝你! – grammar 2013-03-13 23:09:26

0

EB是短相對跳轉...

JMP SHORT IMM具有128個字節的最大範圍內,因爲位移 被指定爲唯一的8位,但佔用較少的代碼空間。

這意味着操作數不是絕對地址,而是與當前地址相關的正或負偏移量,如500 - Internal Server Error 所述。

+0

如果使用8位指定位移,最大尋址範圍不應該是256字節嗎?或者我再次不正確地理解這一點? – grammar 2013-03-13 23:16:05

+0

@grammar它可以是正數或負數,所以它的範圍是'-127'到'128'(以二進制補碼形式存儲),所以它可以向前和向後跳轉。 :) – alex 2013-03-13 23:20:06

+0

啊是的!我不考慮後退的愚蠢行爲:)感謝您的幫助! – grammar 2013-03-13 23:25:17