Assembly 致函bl和bh
我试图理解以下行为:Assembly 致函bl和bh,assembly,x86,nasm,radix,number-systems,Assembly,X86,Nasm,Radix,Number Systems,我试图理解以下行为: mov bl, 51 ; now print $ebx in gdb returns 51 mov bh, 52 ; now it is 13363 but I thought it would be 5251 为什么?? 我在英特尔x86上使用Linux nasm打印16位整数时,不会将两个字节分别转换为十进制字符串并将其串联。您必须将整个16位数字转换为一串位值数字 它不起作用的原因是基数10不是2的幂。对于平均除以256的基,如十六进制,单独处理每
mov bl, 51 ; now print $ebx in gdb returns 51
mov bh, 52 ; now it is 13363 but I thought it would be 5251
为什么??
我在英特尔x86上使用Linux nasm打印16位整数时,不会将两个字节分别转换为十进制字符串并将其串联。您必须将整个16位数字转换为一串位值数字 它不起作用的原因是基数10不是2的幂。对于平均除以256的基,如十六进制,单独处理每个字节(或十六进制的4位半字节)是可行的 e、 g.bh=0x34:bl=0x33为您提供
52*256+51=0x3433
这就是为什么转换为十六进制比转换为十进制更容易(也更有效)的原因之一:您可以先从最重要的数字开始
对于与256不一致的基(如果这是正确的术语),除以基数(例如,除以10得到低位)会更改高位
顺便说一句,请注意,写入BL和BH不会将EBX的上2个字节归零。BH:BL的16位级联可寻址为BX,而不是EBX。但如果EBX的上2个字节为零,则打印EBX与BX相同。您使用的是十进制,而不是十六进制。那么
52*256+51=13363
你为什么期望5251?@Ped7g我期望这张图片的原因@daniellontiev这是一种正确的思维方式,但是你忽略了一个重要的基本事实,bh
和bl
都是“8位”寄存器。当您在汇编程序mov-bl,51
中写入时,汇编程序将发出二进制机器代码,将值51
转换为二进制8位值0011\u 0011
(当解释为十进制整数时为51
)。因此,用0011\u 0011
加载bl
,用0011\u 0100
加载bh
(0x34
或52
),然后bx
等于0011\u 0100\u 0011\u 0011
=16个串联位。但是您的print$bx
会将这16位解释为十进制值,这等于13363
@Daniellontiev对我来说,Peter的回答基本上是说相同的事情,他还添加了您在打印ebx
时没有设置其上16位的注释,因此这可能是另一个意外值的来源。但对我来说,十六进制和二进制之间的转换非常容易,因为我完全理解每个十六进制数字正好是4位,所以我通常用十六进制写位值,在head中转换它们。然而,对于像你这样的初学者来说,认识到CPU(带电压的单元)内部的“位”和编码值之间存在直接的物理连接,这可能是拼图中最后缺失的一块