如何将2个数字相乘并形成4位数然后显示?

时间:2016-08-17 11:15:24

标签: assembly

所以程序就像这样开始:

....
.....
<li><a href="#">Separated link</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">One more separated link</a></li>
          </ul>
        </li>
      </ul>
      <form class="navbar-form navbar-left">
        <div class="form-group">
          <input type="text" class="form-control" placeholder="Search">
        </div>
        <button type="submit" class="btn btn-default">Search</button>
      </form>
      <ul class="nav navbar-nav navbar-right">
        <li ng-hide="navbar.isLoggedIn"><a ui-sref="login">Login {{navbar.ctrlName}}</a></li>
        <li ng-hide="navbar.isLoggedIn" ><a ui-sref="register">Signup</a></li>
        <li ng-show="navbar.isLoggedIn"><a>Logged as {{navbar.username}}</a></li>
        <li ng-show="navbar.isLoggedIn"><a ui-sref="login">Logout</a></li>
      </ul>
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>
....
.....

程序打印出的是一堆十六进制数。有人能告诉我如何存储3位数字或4位数字。它存储在AX中还是AL?

1 个答案:

答案 0 :(得分:0)

为什么您认为ah可能是04和al 40?

我问了两个原因。

1)如果您要调试它,调试器应该能够显示ahal的当前值。虽然它可能显示ax的六进制形式,但你不理解六进制数,所以这可能是你要学习的另一件事。

2)你错过了“位”这一点。 al是8位信息,这意味着它可以包含2个 8 不同的信息。因为每个位可以是01(两个选项),并且您有8位,定位 - 顺序很重要。如果你要检查组合理论,那就是所有可能组合的“两个提升到八次幂”,那就是256.现在这些组合最常用作二进制数,当被视为从0到255的数字时(检查二进制形式看如何将位模式分配给特定数字,这是合乎逻辑的,每个位代表2的幂之一,就像我们的十进制格式一样,每个数字代表10的特定幂。)

你可能会想到的所有乱语,告诉我这个错误。根据你的逻辑,数字100将在ah:al之间分配为01:00。因此al中的最大数字将为99.这会浪费另外3/5的可能组合(最多255个)。

440采用二进制(位)编码为:0000 0001 1011 1000,前8位位于ah,等于1,其他8位位于al ,那些等于(440 - 啊* 256)=(440 - 1 * 256)= 184.(256中的值ax被拆分为10ahal中,255被拆分为0255)。如果您将值hl放入ahal,则ax的值为256*h + l

在调试器中,您可能会阅读:ax 01B8。十六进制格式具有这个简洁的特征,每个数字正好是4位长。 0 = 00001 = 0001B(十进制11)= 10118 = {{1 }}。因此前两位数字是1000的内容,其他两位数字是ah的内容。

阅读有关位,字节的更多信息,并做一些数学练习,以完全掌握二进制&lt; - &gt;之间的转换。十进制&lt; - &gt;八分之一&lt; - &gt;十六进制工作,只需手动计算几次。特别是做一些基本的dec&lt; - &gt;在ASM中编程时,bin / hex数学是非常方便的,例如当您将寄存器的内容视为位掩码而不是数字时,通常更容易写下该值的十六进制形式,而不是将所有设置位重新计算为小数并总结他们。

现在回到你的代码(每个段落都是一个错误描述,或者至少非常强大的代码风格建议,你应该遵循,以防你想让我再次看一下你的来源)。

我认为这是MASM或TASM。我不喜欢al,它隐藏了这样一个事实:你实际上是在获取内存的内容,而不是地址。 mov al,num更准确地定义了CPU中发生的事情。你甚至可以在TASM中编写它(当需要时,数据的大小由mov al,[num]指定。

byte ptr [...]div byte ptr [mem8]除以[mem8]中的值,在您的情况下,您将440除以10.这将产生0余数为ax,商44为{{1} }。 “错误”不在指令本身,而是在你的期望中。您将ah存储为al,但它不是字体数字,它是从0到9的值数字。要将其转换为字体字形,您需要ASCII编码数字。您必须将其转换为ASCII编码(检查ASCII表以查看哪个字形具有哪些代码)。所以ah会修复digit1。

Digit2完全关闭,正如你所看到的,44在0到9范围内不是偶数值,所以它不能变成单个数字,你必须重复整个过程,但这次从一个订单开始10下降(因此将digit1设置为44,而不是440)。 然后将其重写为循环。

add ah,30h ax - 现在您将MOV AL,BH除以字节DIV divide,而未设置ax。它可以包含任何数字1冒险之后的任何内容,幸运的是您的10版本AH。要么AH,要么0movzx ax,bh的8位值零扩展为16位xor ah,ah。 (上面解释了DIV和ASCII编码的结果)

最后你首先显示digit1,但是digit1是什么?剩余除以10的原值。因此,对于440,您将意外输出bhax04(嗯,不会,因为digit1-2-3-4的内容不正确) ,看起来像440,但顺序相反。尝试22 * 49 = 1078进行调试(如果你的代码产生正确的数字#值,那么它会打印8701)。