2015-02-08 63 views
0

大小我有下面的代碼,在x86彙編,它試圖在屏幕上打印X:混亂在Word中的x86

mov ah , 0x0e 
mov al , the_secret 
int 0x10 
mov al , [the_secret] 
int 0x10 
mov bx , the_secret 
add bx , 0x7c00 
mov al , [bx] 
int 0x10 
mov al , [0x7c1e] 
int 0x10 
jmp $ ; Jump forever. 
the_secret : 
db " X " 
times 510-($-$$) db 0 
dw 0xaa55 

當我在GDB檢查上面的代碼中我發現,JMP $指令存儲在地址0x7c1b中。但是GDB在不同的地址顯示不同的數據大小。例如:

(gdb) p/x *0x7c1e 
$5 = 0x2058 
(gdb) p/x *0x7c1b 
$6 = 0x5820feeb 
(gdb) p/x *0x7c1d 
$7 = 0x205820 

有時它會給2個字節有時4個字節或3個字節。不應該總是打印2bytes,這是x86中的字大小(因爲我處於實模式)。爲什麼它在這些地址顯示不同大小的數據?
我也呈現出組裝上述彙編代碼後創建的十六進制轉儲:

7c00: b4 0e b0 1d cd 10 a0 1d 00 cd 10 bb 1d 00 81 c3 
7c10: 00 7c 8a 07 cd 10 a0 1e 7c cd 10 eb fe 20 58 20 
7c20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

回答

2

它實際上是讓每次四個字節,它只是,如果上個字節爲零,它不會告訴他們輸出,出於同樣的原因,你不會寫爲00000007

例如,在打印出兩個字節值64 時,您會看到0x40。如果雙字節價格是12345 ,那麼您會看到0x3039

從你的十六進制轉儲,你可以看到這個序列:

7c1b: eb fe 20 58 20 00 00 

所以,在給定的地址,你看到的字節(和值與高零個字節不打印):

7c1b: eb fe 20 58 (5820feeb) 
7c1d: 20 58 20 00 ( 205820) 
7c1e: 58 20 00 00 ( 2058) 
+0

謝謝....但由於我們處於實模式,不應該爲x86的字大小爲16位? – sarthak 2015-02-08 10:21:40

+1

@sarthak,顯然_not_ :-)我不確定真實模式是否指定'gcc'中的整數大小,而'p/x'命令只是「將值的位視爲一個整數,並打印十六進制的整數「。如果'gdb'有一個類型可以使用,也許它可以計算出來,但是'* 0x7c1e'沒有像'* myvar'這樣的類型。無論如何,這是我的猜測。 – paxdiablo 2015-02-08 11:17:26