写入 bl 和 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 个字节为零,则打印 EBX 与 BX 相同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章