assembly - Irvine 书中的这个 SWORD 零扩展示例真的正确吗?
问题描述
我是个初学者,一直在阅读 Irvine 的《Assembly Language for x86》。我在有符号整数除法部分,遇到了一个让我很困惑的例子。
它旨在作为您不签署扩展时发生的情况的示例。这是代码行:
.data
wordval SWORD -101 ;009Bh
.code
mov DX, 0
mov ax, wordVal ; DX:AX = 0000009Bh (+155)
mov bx, 2 ; BX is the divisor
idiv bx ; divide DX:AX by BX (signed operation)
然后它说因为 ax 实际上等于 +155,所以产生的商是 +77,而不是预期的结果。
为什么-101
在第二行代码中变量 wordVal 表示为 009B 而不是 FF9B?
这是我的逻辑:十进制的 101 是 65h。SWORD 是 16 位,所以二进制补码应该是 0FF9Bh。然后 DX 设置为 0 并且 DX:AX 将等于 0000FF9Bh 因此如果没有符号扩展,该数字将被解释为 65435 十进制。
我本来希望代码如下所示:
.data
wordval SWORD -101 ;FF9Bh
.code
mov DX, 0
mov ax, wordVal ; DX:AX = 0000FF9Bh (+65435)
mov bx, 2 ; BX is the divisor
idiv bx ; divide DX:AX by BX (signed operation)
商为 32717。
(或者将正常cwd
设置为 16-bit idiv
,它实际上会计算-101 / 2
=-50
余数-1
。或者使用算术右移有效地除以 2,AX = -51
CF=1。)
这是书中的错误还是我遗漏了什么?
解决方案
推荐阅读
- java - 从 server.xml 按名称读取变量
- python - 两个列表具有不同的内存地址,但仍被引用
- python - 在 Anaconda Windows 安装下运行 reticulate 的问题
- uitableview - 如何在 Swift 5 中将数据从 UITableViewCell 发送到 ViewController
- python - Windows 中车轮构建再现性的当前状态是什么?
- php - 从 ionic 3 应用程序到 php 服务器的连接错误(导出和导入 mysql)
- java - Jackson - 将 JSON 反序列化为类
- javascript - 在 react Native 中使用外部 API 呈现 Flatlist 的正确方法
- python - 熊猫在列表中正确的值
- java - 为 netbeans 8.2 运行 SQL 时出现词法错误