【发布时间】:2018-05-31 07:39:26
【问题描述】:
我正在尝试理解以下行为:
mov bl, 51 ; now print $ebx in gdb returns 51
mov bh, 52 ; now it is 13363 but I thought it would be 5251
为什么? 我在 Intel x86 上使用 Linux nasm
【问题讨论】:
-
您使用的是十进制,而不是十六进制。所以
52*256+51=13363 -
你为什么期待 5251?
-
@Ped7g 我期待这张照片的原因imgur.com/a/LmGLb
-
@danielleontiev 这是一种正确的思维方式,但您错过了一个重要的基本事实,即
bh和bl都是“8 位”寄存器。当您在汇编器mov bl,51中写入时,汇编器将发出二进制机器码,将值51转换为二进制8 位值0011_0011(当解释为十进制整数时为51)。所以你用0011_0011和bh用0011_0100(0x34或52)加载bl,那么bx等于0011_0100_0011_0011= 16个连接位。但是您的print $bx会将这 16 位解释为十进制值,即等于13363。 -
@danielleontiev 对我来说,彼得的回答基本上是一样的,当你没有设置它的高 16 位时,他还添加了你正在打印的注释
ebx,这样就可以作为来源另一个意想不到的值。但对我来说,十六进制和二进制之间的转换非常容易,因为我完全理解每个十六进制数字正好是 4 位,所以我通常以十六进制写入位值,并将它们转换为头部。然而对于像你这样的初学者来说,这可能是最后一个缺失的难题,要意识到 CPU 内部的“位”(带电压的单元)和值编码有直接的物理连接
标签: assembly x86 nasm radix number-systems