我在x86程序集中有以下代码,它试图在屏幕上打印X:
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
答案 0 :(得分:2)
实际上每次都有四个字节,只是如果高位字节为零,它就不会在输出中显示它们,原因与你不会将7写为00000007
的原因相同。
例如,在打印出64 10 的双字节值时,您会看到0x40
。如果双字节值为12345 10 ,则会看到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)