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