急求帮助 16位MS-DOS子系统遇到无效指令

xone777 2007-12-11 09:22:46
这是我编的一个汇编语言的排序,要求输入20个有符号数,排序后在屏幕上输出
代码:
DATAS SEGMENT
BUFF DB 150
DB ?
DB 150 DUP(?) ;存储字符串
ARY DB 60 DUP(0) ;存放转换后的BCD码
P1 DB 'Input the number : (-9999~9999)','$'
P2 DB 'The result is :','$'
CR DB 0DH,0AH,'$'
P3 DB '-','$'
P4 DB 'SP','$'
DATAS ENDS

STACKS SEGMENT
ST1 DB 100 DUP(?)
TOP LABEL WORD
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN PROC FAR
START: MOV AX,STACKS
MOV SS,AX
MOV SP,OFFSET TOP
;;输入字符串
MOV AX,DATAS
MOV DS,AX
MOV AH,09
LEA DX,P1
INT 21H
LEA DX,CR
INT 21H
MOV DX,OFFSET BUFF
MOV AH,0AH
INT 21H
MOV AH,09
LEA DX,CR
INT 21H
MOV DX,OFFSET BUFF
MOV BX,DX
MOV CX,[BX+1]
ADD DX,2
LEA BX,ARY
;;转换成压缩型BCD码,存入数组ARY中
MOV SI,DX
ASC2BCD: SUB DX,DX
MOV AL,[SI]
CMP AL,' '
JNZ ZF
INC SI
DEC CX
CMP CX,0
JZ PAIXU
JMP ASC2BCD
ZF: CMP AL,'-'
JNZ CHK
MOV [BX],1
INC SI
DEC CX
MOV AL,[SI]
JMP NEXT
CHK: CMP AL,'+'
JNZ NEXT
INC SI
DEC CX
MOV AL,[SI]
NEXT: PUSH CX
MOV CL,4
SHL DX,CL
POP CX
CMP AL,'0'
JB ERR
CMP AL,'9'
JA ERR
AND AX,000FH
ADD DX,AX
JC ERR
INC SI
DEC CX
MOV AL,[SI]
CMP AL,' '
JNZ NEXT
MOV [BX+1],DH
MOV [BX+2],DL
ADD BX,3
INC SI
LOOP ASC2BCD
LEA BX,ARY
;;排序
PAIXU: MOV CX,19
L1: MOV DX,CX
L2: MOV AX,[BX]
CMP AX,[BX+3]
JB JIAOHUAN
JA JIAOHUANH
CMP AX,0
JNZ FUSHU
MOV AX,[BX+1]
CMP AX,[BX+4]
JA JIAOHUAN
JB JIAOHUANH
MOV AX,[BX+2]
CMP AX,[BX+5]
JA JIAOHUAN
JMP JIAOHUANH
FUSHU: MOV AX,[BX+1]
CMP AX,[BX+4]
JB JIAOHUAN
JA JIAOHUANH
MOV AX,[BX+2]
CMP AX,[BX+5]
JB JIAOHUAN
JMP JIAOHUANH
JIAOHUAN: XCHG AX,[BX+3]
MOV [BX],AX ;;;;;;;;;??????
MOV AX,[BX+1]
XCHG AX,[BX+4]
MOV [BX+1],AX
MOV AX,[BX+2]
XCHG AX,[BX+5]
MOV [BX+2],AX
JIAOHUANH: ADD BX,3
LOOP L2
MOV CX,DX
LEA BX,ARY
LOOP L1
;;输出
MOV AH,09
LEA DX,P2
INT 21H
LEA DX,CR
INT 21H
MOV CX,20
SHUCHU: PUSH CX
MOV CH,4
MOV CL,4
MOV AX,[BX]
CMP AX,0
JZ NEXT1
MOV AH,09
LEA DX,P3
INT 21H
NEXT1: MOV AH,[BX+1]
MOV AL,[BX+2]
LZ: ROL AX,CL
MOV DL,BL
AND DL,0FH
CMP DL,0
JNZ LNZ
DEC CH
JNZ LZ
LL: ROL BX,CL
MOV DL,BL
AND DL,0FH
LNZ: ADD DL,30H
MOV AH,2
INT 21H
DEC CH
JNZ LL
MOV AH,09
LEA DX,P4
INT 21H
POP CX
LOOP SHUCHU
ERR: RET
MAIN ENDP
CODES ENDS
END START
...全文
619 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2007-12-11
  • 打赏
  • 举报
回复
这个错误的主要原因是 ERR: RET 那里的问题, 如果在数据的最后再加个空格可以简单地解决, 不过, 仍然不是完善的方法. 如果是所有数据整体输入, 应该在每读入一个字符时, 都要对 cx 即读入的字符是否为字符串末尾进行判别.
另外, 排序和输出上也有些问题吧, 好像结果不对.
xone777 2007-12-11
  • 打赏
  • 举报
回复
最新修改的
DATAS SEGMENT
BUFF DB 150
DB ?
DB 150 DUP(?) ;存储字符串
ARY DB 60 DUP(0) ;存放转换后的BCD码
P1 DB 'Input the number : (-9999~9999)','$'
P2 DB 'The result is :','$'
CR DB 0DH,0AH,'$'
P3 DB '-','$'
P4 DB ' ','$'
DATAS ENDS

STACKS SEGMENT
ST1 DB 100 DUP(?)
TOP LABEL WORD
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN PROC FAR
START: MOV AX,STACKS
MOV SS,AX
MOV SP,OFFSET TOP
;;输入字符串
MOV AX,DATAS
MOV DS,AX
MOV AH,09
LEA DX,P1
INT 21H
LEA DX,CR
INT 21H
MOV DX,OFFSET BUFF
MOV AH,0AH
INT 21H
MOV AH,09
LEA DX,CR
INT 21H
MOV DX,OFFSET BUFF
MOV BX,DX
MOV CL,[BX+1]
MOV CH,0
ADD DX,2
ADD BX,CX
ADD BX,2
MOV [BX],' '
INC CX
LEA BX,ARY
;;转换成压缩型BCD码,存入数组ARY中
MOV SI,DX
ASC2BCD: SUB DX,DX
MOV AL,[SI]
CMP AL,' '
JNZ ZF
INC SI
DEC CX
CMP CX,0
JZ PAIXU
JMP ASC2BCD
ZF: CMP AL,'-'
JNZ CHK
MOV BYTE PTR [BX],1
INC SI
DEC CX
MOV AL,[SI]
JMP NEXT
CHK: CMP AL,'+'
JNZ NEXT
INC SI
DEC CX
MOV AL,[SI]
NEXT: PUSH CX
MOV CL,4
SHL DX,CL
POP CX
CMP AL,'0'
JB ERR
CMP AL,'9'
JA ERR
AND AX,000FH
ADD DX,AX
JC ERR
INC SI
DEC CX
MOV AL,[SI]
CMP AL,' '
JNZ NEXT
MOV [BX+1],DH
MOV [BX+2],DL
ADD BX,3
INC SI
LOOP ASC2BCD
LEA BX,ARY
;;排序
PAIXU: MOV CX,19
L1: MOV DX,CX
L2: MOV AL,[BX]
CMP AL,[BX+3]
JB JIAOHUAN
JA JIAOHUANH
CMP AL,0
JNZ FUSHU
MOV AL,[BX+1]
CMP AL,[BX+4]
JA JIAOHUAN
JB JIAOHUANH
MOV AL,[BX+2]
CMP AL,[BX+5]
JA JIAOHUAN
JMP JIAOHUANH
FUSHU: MOV AL,[BX+1]
CMP AL,[BX+4]
JB JIAOHUAN
JA JIAOHUANH
MOV AL,[BX+2]
CMP AL,[BX+5]
JB JIAOHUAN
JMP JIAOHUANH
JIAOHUAN: MOV AL,[BX]
XCHG AL,[BX+3]
MOV [BX],AL
MOV AL,[BX+1]
XCHG AL,[BX+4]
MOV [BX+1],AL
MOV AL,[BX+2]
XCHG AL,[BX+5]
MOV [BX+2],AL
JIAOHUANH: ADD BX,3
LOOP L2
MOV CX,DX
LEA BX,ARY
LOOP L1
;;输出
MOV AH,09
LEA DX,P2
INT 21H
LEA DX,CR
INT 21H
MOV CX,20
SHUCHU: PUSH CX
MOV CH,4
MOV CL,4
MOV AL,[BX]
CMP AL,0
JZ NEXT1
MOV AH,09
LEA DX,P3
INT 21H
NEXT1: MOV AH,[BX+1]
MOV AL,[BX+2]
LZ: ROL AX,CL
MOV DL,AL
AND DL,0FH
CMP DL,0
JNZ LNZ
DEC CH
JNZ LZ
LL: ROL AX,CL
MOV DL,AL
AND DL,0FH
LNZ: ADD DL,30H
PUSH AX
MOV AH,2
INT 21H
POP AX
DEC CH
JNZ LL
MOV AH,09
LEA DX,P4
INT 21H
POP CX
ADD BX,3
LOOP SHUCHU
ERR: MOV AH,4CH
INT 21H
MAIN ENDP
CODES ENDS
END START
zara 2007-12-11
  • 打赏
  • 举报
回复
; 大致修改了下. 不过你这个程序对输入要求比较高. 一是各个数据间只能有一个空格隔开;
; 另外, 最后一个数据最后也需要再加上一个空格; 数据输入的个数也必须正好是 20 个.
; 修改部分, 行后有 ;* 标记; 添加的内容是 ;*+ 标记; 去除了的是 ;*-
; 需 Masm6 编译通过: ml /Zm ....
;
DATAS SEGMENT
BUFF DB 150
DB ?
DB 150 DUP(?) ;存储字符串
ARY DB 60 DUP(0) ;存放转换后的BCD码
P1 DB 'Input the number : (-9999~9999)','$'
P2 DB 'The result is :','$'
CR DB 0DH,0AH,'$'
P3 DB '-','$'
P4 DB ' ','$'
DATAS ENDS

STACKS SEGMENT
ST1 DB 100 DUP(?)
TOP LABEL WORD
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN PROC FAR
START: MOV AX,STACKS
MOV SS,AX
MOV SP,OFFSET TOP
;;输入字符串
MOV AX,DATAS
MOV DS,AX
MOV AH,09
LEA DX,P1
INT 21H
LEA DX,CR
INT 21H
MOV DX,OFFSET BUFF
MOV AH,0AH
INT 21H
MOV AH,09
LEA DX,CR
INT 21H
MOV DX,OFFSET BUFF
MOV BX,DX
MOV CL,[BX+1] ;*
mov ch, 0 ;*+
ADD DX,2
LEA BX,ARY
;;转换成压缩型BCD码,存入数组ARY中
MOV SI,DX
ASC2BCD: SUB DX,DX
MOV AL,[SI]
CMP AL,' ' ;*
JNZ ZF
INC SI
DEC CX
CMP CX,0
JZ PAIXU
JMP ASC2BCD
ZF: CMP AL,'-'
JNZ CHK
MOV byte ptr [BX],1 ;*
INC SI
DEC CX
MOV AL,[SI]
JMP NEXT
CHK: CMP AL,'+'
JNZ NEXT
INC SI
DEC CX
MOV AL,[SI]
NEXT: PUSH CX
MOV CL,4
SHL DX,CL
POP CX
CMP AL,'0'
JB ERR
CMP AL,'9'
JA ERR
AND AX,000FH
ADD DX,AX
JC ERR
INC SI
DEC CX
MOV AL,[SI]
CMP AL,' '
JNZ NEXT
MOV [BX+1],DH
MOV [BX+2],DL
ADD BX,3
INC SI
LOOP ASC2BCD
LEA BX,ARY
;;排序

PAIXU: MOV CX,19
L1: MOV DX,CX
L2: MOV AL,[BX]
CMP AL,[BX+3]
JB JIAOHUAN
JA JIAOHUANH
CMP AL,0
JNZ FUSHU
MOV AL,[BX+1]
CMP AL,[BX+4]
JA JIAOHUAN
JB JIAOHUANH
MOV AL,[BX+2]
CMP AL,[BX+5]
JA JIAOHUAN
JMP JIAOHUANH
FUSHU: MOV AL,[BX+1]
CMP AL,[BX+4]
JB JIAOHUAN
JA JIAOHUANH
MOV AL,[BX+2]
CMP AL,[BX+5]
JB JIAOHUAN
JMP JIAOHUANH
JIAOHUAN: mov al, [bx] ;*+
XCHG AL,[BX+3]
MOV [BX],AL ;;;;;;;;;??????
MOV AL,[BX+1]
XCHG AL,[BX+4]
MOV [BX+1],AL
MOV AL,[BX+2]
XCHG AL,[BX+5]
MOV [BX+2],AL
JIAOHUANH: ADD BX,3
LOOP L2
MOV CX,DX
LEA BX,ARY
LOOP L1

;;输出
MOV AH,09
LEA DX,P2
INT 21H
LEA DX,CR
INT 21H
MOV CX,20
SHUCHU: PUSH CX
MOV CH,4
MOV CL,4
MOV AL,[BX]
CMP AL,0
JZ NEXT1
MOV AH,09
LEA DX,P3
INT 21H
NEXT1: MOV AH,[BX+1]
MOV AL,[BX+2]
LZ: ROL AX,CL
MOV DL,AL ;*
AND DL,0FH
CMP DL,0
JNZ LNZ
DEC CH
JNZ LZ
LL: ROL AX,CL ;*
MOV DL,AL ;*
AND DL,0FH
LNZ: ADD DL,30H
push ax ;*+
MOV AH,2
INT 21H
pop ax ;*+
DEC CH
JNZ LL
MOV AH,09
LEA DX,P4
INT 21H
POP CX
add bx, 3 ;*+
LOOP SHUCHU
ERR: ; RET ;*-
mov ah, 4ch ;*+
int 21h ;*+
MAIN ENDP
CODES ENDS
END START
xone777 2007-12-11
  • 打赏
  • 举报
回复
我修改后的代码:(谁帮我改改啊!多谢多谢!急要的!)
DATAS SEGMENT
BUFF DB 150
DB ?
DB 150 DUP(?) ;存储字符串
ARY DB 60 DUP(0) ;存放转换后的BCD码
P1 DB 'Input the number : (-9999~9999)','$'
P2 DB 'The result is :','$'
CR DB 0DH,0AH,'$'
P3 DB '-','$'
P4 DB ' ','$'
DATAS ENDS

STACKS SEGMENT
ST1 DB 100 DUP(?)
TOP LABEL WORD
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN PROC FAR
START: MOV AX,STACKS
MOV SS,AX
MOV SP,OFFSET TOP
;;输入字符串
MOV AX,DATAS
MOV DS,AX
MOV AH,09
LEA DX,P1
INT 21H
LEA DX,CR
INT 21H
MOV DX,OFFSET BUFF
MOV AH,0AH
INT 21H
MOV AH,09
LEA DX,CR
INT 21H
MOV DX,OFFSET BUFF
MOV BX,DX
MOV CX,[BX+1]
ADD DX,2
LEA BX,ARY
;;转换成压缩型BCD码,存入数组ARY中
MOV SI,DX
ASC2BCD: SUB DX,DX
MOV AL,[SI]
CMP AL,' '
JNZ ZF
INC SI
DEC CX
CMP CX,0
JZ PAIXU
JMP ASC2BCD
ZF: CMP AL,'-'
JNZ CHK
MOV [BX],1
INC SI
DEC CX
MOV AL,[SI]
JMP NEXT
CHK: CMP AL,'+'
JNZ NEXT
INC SI
DEC CX
MOV AL,[SI]
NEXT: PUSH CX
MOV CL,4
SHL DX,CL
POP CX
CMP AL,'0'
JB ERR
CMP AL,'9'
JA ERR
AND AX,000FH
ADD DX,AX
JC ERR
INC SI
DEC CX
MOV AL,[SI]
CMP AL,' '
JNZ NEXT
MOV [BX+1],DH
MOV [BX+2],DL
ADD BX,3
INC SI
LOOP ASC2BCD
LEA BX,ARY
;;排序
PAIXU: MOV CX,19
L1: MOV DX,CX
L2: MOV AL,[BX]
CMP AL,[BX+3]
JB JIAOHUAN
JA JIAOHUANH
CMP AL,0
JNZ FUSHU
MOV AL,[BX+1]
CMP AL,[BX+4]
JA JIAOHUAN
JB JIAOHUANH
MOV AL,[BX+2]
CMP AL,[BX+5]
JA JIAOHUAN
JMP JIAOHUANH
FUSHU: MOV AL,[BX+1]
CMP AL,[BX+4]
JB JIAOHUAN
JA JIAOHUANH
MOV AL,[BX+2]
CMP AL,[BX+5]
JB JIAOHUAN
JMP JIAOHUANH
JIAOHUAN: XCHG AL,[BX+3]
MOV [BX],AL ;;;;;;;;;??????
MOV AL,[BX+1]
XCHG AL,[BX+4]
MOV [BX+1],AL
MOV AL,[BX+2]
XCHG AL,[BX+5]
MOV [BX+2],AL
JIAOHUANH: ADD BX,3
LOOP L2
MOV CX,DX
LEA BX,ARY
LOOP L1
;;输出
MOV AH,09
LEA DX,P2
INT 21H
LEA DX,CR
INT 21H
MOV CX,20
SHUCHU: PUSH CX
MOV CH,4
MOV CL,4
MOV AL,[BX]
CMP AL,0
JZ NEXT1
MOV AH,09
LEA DX,P3
INT 21H
NEXT1: MOV AH,[BX+1]
MOV AL,[BX+2]
LZ: ROL AX,CL
MOV DL,BL
AND DL,0FH
CMP DL,0
JNZ LNZ
DEC CH
JNZ LZ
LL: ROL BX,CL
MOV DL,BL
AND DL,0FH
LNZ: ADD DL,30H
MOV AH,2
INT 21H
DEC CH
JNZ LL
MOV AH,09
LEA DX,P4
INT 21H
POP CX
LOOP SHUCHU
ERR: RET
MAIN ENDP
CODES ENDS
END START

21,458

社区成员

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

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