Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 致函bl和bh_Assembly_X86_Nasm_Radix_Number Systems - Fatal编程技术网

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(带电压的单元)内部的“位”和编码值之间存在直接的物理连接,这可能是拼图中最后缺失的一块