首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >汇编x86 imul和div没有做我期望的事情

汇编x86 imul和div没有做我期望的事情
EN

Stack Overflow用户
提问于 2020-01-31 04:32:03
回答 2查看 174关注 0票数 0

当我去除法时,它给了我一些来自这个世界的答案。这样做是可行的:

代码语言:javascript
运行
复制
mov ax, 11
mov bl, 37
div bl
mov [bAns16], ah

会给出11的正确余数。但一旦我将这些数字转换为变量,整个过程就会中断:

代码语言:javascript
运行
复制
mov ax, [bNum1]
mov bl, [bNum4]
div bl
mov [bAns16], ah


;bNum1 = 11
;bNum4 = 37

答案应该是0,剩下的11,但答案最终是104,剩余的3。

而且,我对使用imul有问题--完全没有道理。与div相同:

代码语言:javascript
运行
复制
mov ax, 33
mov bx, -17
imul ax, bx
mov [wAns15], ax

会给我正确的答案,但当我把变量放进去的时候,就不会马上给我答案:

代码语言:javascript
运行
复制
mov ax, [bNum5]
mov bx, [bNum6]
imul ax, bx
mov [wAns15], ax

;bNum5 = 33
;bNum6 = -17

因此,它应该等于-561,但给我-32049,而不是一贯。

我做错了什么?谢谢!

编辑:

以下是数字声明:

代码语言:javascript
运行
复制
bNum1       db  11
bNum2       db  15
bNum3       db  26
bNum4       db  37
bNum5       db  33
bNum6       db  -17
bNum7       db  -29
bNum8       db  -40
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-31 07:00:04

答案应该是0,剩余的是11,但最终答案是104,其余的是3。

这意味着AXdiv指令之前包含了0x0F0B值,而不是0x000B

张先生的评论暗示了这样做的原因:

与高级编程语言(如C)不同,汇编语言是用来直接告诉CPU该做什么的。

因此,应由程序员来确保数据类型的正确使用。

您的“变量”bNum1只有一个字节长。这将是C编程语言中的unsigned char类型的变量。

然而,指令mov ax, [bNum1]将访问内存中的两个字节值.这等于C中的数据类型unsigned short

此指令将将存储在地址 bNum1中的两个字节和该地址后面的地址解释为一个16位数字。

地址bNum1的字节为11,地址后面的字节(bNum2)为15;这两个字节将被解释为0xF0B

做什么

W. Chang已经建议使用dw而不是db

在C编程语言中,这将使变量bNum1的数据类型从unsigned char更改为unsigned short

但是,您可能不想更改数据类型。

在这种情况下,需要将8位数字转换为16位数字:

对于无符号数字,只需将高8位设置为零即可。

对于有符号的数字,x86 CPU有名为cbw (8到16位)和cwd (16至32位)的指令。不幸的是,这只适用于AX寄存器。

下面的示例演示如何将AL中的8位数字转换为AX中的16位数字。

未签署:

代码语言:javascript
运行
复制
mov al, [bNum1]
mov ah, 0

签名:

代码语言:javascript
运行
复制
; You want to load bNum6 to BX ...
mov al, [bNum6]
cbw
mov bx, ax
; ... and bNum5 to AX
mov al, [bNum5]
cbw
票数 2
EN

Stack Overflow用户

发布于 2020-01-31 06:38:34

AXBX是16位寄存器.mov ax, [bNum1]将从bNum1读取16位(两个字节)。但是由于[bNum1] (0x0B)只有一个字节,所以它也会将[bNum2] (0x0F)作为高字节进行读取。因此,在mov ax, [bNum1] AX之后不是11,而是3851 (0x0F0B)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59997884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档