【问题标题】:Writing to bl and bh写给 bl 和 bh
【发布时间】: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 这是一种正确的思维方式,但您错过了一个重要的基本事实,即bhbl 都是“8 位”寄存器。当您在汇编器mov bl,51 中写入时,汇编器将发出二进制机器码,将值51 转换为二进制8 位值0011_0011(当解释为十进制整数时为51)。所以你用0011_0011bh0011_01000x3452)加载bl,那么bx等于0011_0100_0011_0011 = 16个连接位。但是您的 print $bx 会将这 16 位解释为十进制值,即等于 13363
  • @danielleontiev 对我来说,彼得的回答基本上是一样的,当你没有设置它的高 16 位时,他还添加了你正在打印的注释ebx,这样就可以作为来源另一个意想不到的值。但对我来说,十六进制和二进制之间的转换非常容易,因为我完全理解每个十六进制数字正好是 4 位,所以我通常以十六进制写入位值,并将它们转换为头部。然而对于像你这样的初学者来说,这可能是最后一个缺失的难题,要意识到 CPU 内部的“位”(带电压的单元)和值编码有直接的物理连接

标签: assembly x86 nasm radix number-systems


【解决方案1】:

当您打印一个 16 位整数时,您不会将这两个字节分别转换为十进制字符串并将它们连接起来。您必须将整个 16 位数字转换为一串位值数字。

它不起作用的原因是基数 10 不是 2 的幂。对于将 256 整除的基数,例如十六进制,分别处理每个字节(或十六进制的 4 位半字节)可以 em> 工作。

例如bh=0x34 : bl=0x33 给你52*256 + 51 = 0x3433

这是转换为十六进制比转换为十进制更容易(也更有效)的原因之一:您可以先从最重要的数字开始。

对于不等于 256 的碱基(如果这是正确的术语),除以基数(例如除以 10 得到低位)会改变高位


顺便说一句,请注意写入 BL 和 BH 不会将 EBX 的高 2 个字节归零。 BH:BL 的 16 位串联可寻址为 BX,而不是 EBX。但是如果EBX的高2字节为零,那么打印EBX和BX是一样的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2014-06-23
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2018-10-19
    相关资源
    最近更新 更多