[求助]这个程序的错误是什么

wolaixiazaile 2007-12-08 01:15:57
编写一个程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:正数数组arrayB和负数数组arrayC并分别把这两个数组中的数据显示出来.
DATA SEGMENT
MA DB 2,-5,34,28,10,-9,-56,20,-25,-23,-46,-8,-14,-10,81,82,-97,30,-47,3

;定义20个元素的数组
MB DB 20 DUP(?) ;定义正数的存储单元
MC DB 20 DUP(?) ;定义负数的存储单元
PLUS DB ? ;记录正数个数
NEGATV DB ? ;记录负数个数
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START: MOV AX,DATA
MOV DS,AX ;设置数据段寄存器
LEA SI,MA
LEA DI,MB
LEA BX,MC
MOV CX,20 ;设置循环次数
LOP1: MOV AX,0
MOV AL,[SI]
AND AL,128 ;与10000000相与,判断一下AL是否为0,为0是正数,否则为负.
CMP AL,0
JE LOP2 ;元素为正数则跳出
MOV [BX],AL ;否则为负数则存入负数数组
INC NEGATV ;负数计数
INC BX ;修改数组地址
JMP AGAIN0
LOP2: MOV [DI],AL ;将正数存入正数数组
INC PLUS ;正数计数
INC DI ;修改数组地址
AGAIN0: INC SI ;修改原数组地址
LOOP LOP1

MOV CL,PLUS
MOV BX,OFFSET MB ;输出正数组
AGAIN1: MOV DL,10
MOV AX,[BX]
DIV DL
CMP AL,0
JE TO1
MOV DH,AH
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
ADD DH,30H
MOV DL,DH
MOV AH,2
INT 21H
MOV DL,','
MOV AH,2
INT 21H
JMP TO2
TO1: ADD AH,30H
MOV DL,AH
MOV AH,2
INT 21H
MOV DL,','
MOV AH,2
INT 21H
TO2: INC BX
DEC CL
JNE AGAIN1
CALL ENTER ;回车换行

MOV CL,NEGATV ;输出负数组
MOV BX,OFFSET MC
AGAIN2: MOV DL,10
MOV AX,[BX]
NOT AX ;负数转换为绝对值(的原码)就是"按位取反然后加一"
ADD AX,1
DIV DL
CMP AL,0
JE TO3
MOV DH,AH
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
ADD DH,30H
MOV DL,DH
MOV AH,2
INT 21H
MOV DL,','
MOV AH,2
INT 21H
JMP TO4
TO3: ADD AH,30H
MOV DL,AH
MOV AH,2
INT 21H
MOV DL,','
MOV AH,2
INT 21H
TO4: INC BX
DEC CL
JNE AGAIN2

ENTER PROC NEAR
MOV DL,13
MOV AH,2
INT 21H
MOV DL,10
MOV AH,2
INT 21H
RET
ENTER ENDP
MAIN ENDP
CODE ENDS
END START
输出的结果是:
0,0,0,0,0,0,0,0,0,

divide overflow

帮帮看这个程序的错误是什么,我实在找不出来。
...全文
83 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2007-12-08
  • 打赏
  • 举报
回复
还有一个问题, 程序在分类输出完数据后, 没有正常的程序结束功能的调用. 比如应该在 JNE AGAIN2 后应该有:
mov ah, 4ch
int 21h
这样的 dos 功能调用
zara 2007-12-08
  • 打赏
  • 举报
回复
1. 对数据进行正负值判断时, 采取的是 and 和 cmp 指令组. 这样的操作破坏了 AL 中的原来的内容, 造成最后的结果的错误. 可以直接使用 test al, 80h 和 jz 这样的指令组
2. 在对数据进行输出时, 首先没有考虑数组中个数为 0 的情况.
其次, 取值时采用的是 MOV AX, [BX] 这样的指令, 但数据类型却是 db 定义的字节, 两边不匹配, 数据取错了. 这样的话, 要么是采用 386 级别的 movzx 指令 (负数部分就需要是 movsx 指令了), 要么就是:
mov AL, [bx]
mov ah, 0 ; 负数部分应该是 mov ah, 0ffh
另外, 负数部分的输出, 没有负数符号 '-'
JobSeeker 2007-12-08
  • 打赏
  • 举报
回复
确实是MOV AX, [BX] 有问题,但是不需要区分正数和负数,因为都可以当作有符号数,使用movsx
movsx ax, byte ptr[bx]
wolaixiazaile 2007-12-08
  • 打赏
  • 举报
回复
非常感谢,问题已经解决了。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧