写入 bl 和 bh
Writing to bl and bh
我试图理解以下行为:
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
当您打印一个 16 位整数时,您不会将两个字节分别转换为十进制字符串并将它们连接起来。您必须将整个 16 位数字转换为一串位值数字。
它不起作用的原因是基数 10 不是 2 的幂。对于均匀划分 256 的基数,如十六进制,分别处理每个字节(或十六进制的 4 位半字节) 有效吗。
例如bh=0x34 : bl=0x33 给你 52*256 + 51 = 0x3433
这是转换为十六进制比转换为十进制更容易(也更有效)的原因之一:您可以先从最高有效数字开始。
对于不等于 256 的基数(如果这是正确的术语),除以基数(例如 除以 10 得到低位)改变高位
顺便说一句,请注意,写入 BL 和 BH 不会将 EBX 的高 2 个字节清零。 BH:BL 的 16 位连接可寻址为 BX,而不是 EBX。但是如果EBX的高2字节为0,那么打印EBX和BX是一样的。
我试图理解以下行为:
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当您打印一个 16 位整数时,您不会将两个字节分别转换为十进制字符串并将它们连接起来。您必须将整个 16 位数字转换为一串位值数字。
它不起作用的原因是基数 10 不是 2 的幂。对于均匀划分 256 的基数,如十六进制,分别处理每个字节(或十六进制的 4 位半字节) 有效吗。
例如bh=0x34 : bl=0x33 给你 52*256 + 51 = 0x3433
这是转换为十六进制比转换为十进制更容易(也更有效)的原因之一:您可以先从最高有效数字开始。
对于不等于 256 的基数(如果这是正确的术语),除以基数(例如 除以 10 得到低位)改变高位
顺便说一句,请注意,写入 BL 和 BH 不会将 EBX 的高 2 个字节清零。 BH:BL 的 16 位连接可寻址为 BX,而不是 EBX。但是如果EBX的高2字节为0,那么打印EBX和BX是一样的。