x86 中的字长混乱
Confusion in Word Size in x86
我在 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
= 0x2058
(gdb) p/x *0x7c1b
= 0x5820feeb
(gdb) p/x *0x7c1d
= 0x205820
有时它给出2个字节有时4个字节或3个字节。它不应该总是打印 2 个字节,这是 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
它实际上每次都得到四个字节,只是,如果高位字节为零,它不会在输出中显示它们,出于同样的原因,你不会把七个写成 00000007
.
例如,在打印出 6410 的两个字节值时,您会看到 0x40
。如果两个字节的值是 1234510,您会看到 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)
我在 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
= 0x2058
(gdb) p/x *0x7c1b
= 0x5820feeb
(gdb) p/x *0x7c1d
= 0x205820
有时它给出2个字节有时4个字节或3个字节。它不应该总是打印 2 个字节,这是 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
它实际上每次都得到四个字节,只是,如果高位字节为零,它不会在输出中显示它们,出于同样的原因,你不会把七个写成 00000007
.
例如,在打印出 6410 的两个字节值时,您会看到 0x40
。如果两个字节的值是 1234510,您会看到 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)