所以程序就像这样开始:
....
.....
<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?
答案 0 :(得分:0)
为什么您认为ah
可能是04和al
40?
我问了两个原因。
1)如果您要调试它,调试器应该能够显示ah
,al
的当前值。虽然它可能显示ax
的六进制形式,但你不理解六进制数,所以这可能是你要学习的另一件事。
2)你错过了“位”这一点。 al
是8位信息,这意味着它可以包含2个 8 不同的信息。因为每个位可以是0
或1
(两个选项),并且您有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
被拆分为1
:0
在ah
:al
中,255
被拆分为0
:255
)。如果您将值h
:l
放入ah
:al
,则ax
的值为256*h + l
。
在调试器中,您可能会阅读:ax 01B8
。十六进制格式具有这个简洁的特征,每个数字正好是4位长。 0
= 0000
,1
= 0001
,B
(十进制11)= 1011
,8
= {{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
,要么0
将movzx ax,bh
的8位值零扩展为16位xor ah,ah
。 (上面解释了DIV和ASCII编码的结果)
最后你首先显示digit1,但是digit1是什么?剩余除以10的原值。因此,对于440,您将意外输出bh
,ax
,0
,4
(嗯,不会,因为digit1-2-3-4的内容不正确) ,看起来像440,但顺序相反。尝试22 * 49 = 1078进行调试(如果你的代码产生正确的数字#值,那么它会打印8701)。