【发布时间】:2021-09-12 16:00:47
【问题描述】:
.model small
.data
nizA db 1,2,3,4,5,6,7,8
nizB db 8 dup(?)
len equ 8
.code
main proc
mov si,0
mov di,0
mov cx,len
program:
mov al,nizA[si] ;problem is here it always stores CDh in AL
cbw ;convert AL to AX so i can divide
mov bl,2 ;The number I want to divide so I test if its even or not
div bl ;Overflow message
cmp ah,0
je next:
input:
mov dl,nizA[si]
mov nizB[di],dl
inc di
next:
add si,2
loop program
endp
end
我这里有这段代码,用于我需要制作的决赛,非常简单。从给定数组的偶数索引中查找奇数。所以很自然,这意味着我将SI 增加 2,然后将该数组元素放入AL。但是无论数组中的数字是什么,在AL 中存储的始终是十六进制数字CD,然后,如果它按预期存储,我想做CBW 转换为AX 并成为能够与BL分开
我现在只有来自 EMU 8086 的错误消息说
除法错误 - 溢出。要手动处理此错误,请更改 中断向量表中INT 0的地址。
这肯定和CD号有关,我这里只有两个问题
- 存储的是 CD 而不是 1
- 溢出(很可能是因为 CD 太高了,但我仍然将数字除以它们只会减少,所以这有点没有意义)
【问题讨论】:
-
我忘记了EXE文件是如何工作的——你必须在程序启动时自己加载数据段寄存器吗?
-
不不,它会自动完成
-
只是因为
0xCD是INT的操作码,这让我怀疑你是不是从代码段中获取数据。 -
在列表中,我有如下
[ 5] 0000: 01 02 03 04 05 06 07 08 nizA db 1,2,3,4,5,6,7,8 [ 6] 0008: 00 00 00 00 00 00 00 00 nizB db 8 dup(?)有点不清楚,首先是内存位置,其次是机器代码,第三是源代码所以我有点假设,它正在被阅读好?同样在符号表中,我的两个数组放在数据段中,我会查看 IP 是否指向正确的位置