一个汇编程序的输出问题,请指教
DATA SEGMENT
NUM1 DB 22H,33H,44H,55H,66H,77H
NUM1L DB 6
NUM2 DB 22H,22H,22H,22H
NUM2L DB 4
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START:MOV AX,DATA
MOV DS,AX
MOV CH,0
MOV SI,OFFSET NUM1
MOV DI,OFFSET NUM2
MOV AH,NUM1L
MOV AL,NUM2L
CMP AH,AL
JAE CHA
XCHG SI,DI
XCHG AH,AL
CHA: SUB AH,AL
MOV CL,AL
CLC
LOP1: MOV AL,[DI]
ADC [SI],AL
MOV AX,[SI]
DIVID:MOV AH, 0
MOV BL, 10
DIV BL
MOV BL,AH
MOV DL,AL
cmp DL,10
JGE DIVID
ADD DL,30H
MOV AH, 02
INT 21H
MOV DL,BL
ADD DL,30H
MOV AH,02
INT 21H
MOV DL,','
MOV AH, 02
INT 21H
INC SI
INC DI
LOOP LOP1
MOV CL,AH
JCXZ NEXT2
LOP2: ADC BYTE PTR [SI],0
MOV AX,[SI]
MOV AH, 0
MOV BL, 10
DIV BL
MOV BL,AH
MOV DL,AL
ADD DL,30H
MOV AH, 02
INT 21H
MOV DL,BL
ADD DL,30H
MOV AH,02
INT 21H
MOV DL,','
MOV AH, 02
INT 21H
INC SI
LOOP LOP2
NEXT2: MOV AH,4CH
INT 21H
CODE ENDS
END START
-----------------------------------------
输出结果本来应该是
68,85,102,119,102,119,的
可实际输出却是
68,85,10,11,;2,;9,
请问怎么改正才能正确输出呢?
谢谢
问题点数:50、回复次数:7Top
1 楼VxD1(Dump)回复于 2004-12-02 17:13:55 得分 0
帮你up,太长了Top
2 楼clumsy(Kyrie eleison)回复于 2004-12-02 19:21:13 得分 10
原因在于显示数值时, 没有考虑多于 2 位数的情况吧. 第一组的输出, 只是输出了最前面的两位数字; 第二组时, 则直接就按照 2 位数的要求输出了. 所以出现了结果不对的现象. 一般地, 还是建议把显示数值作为一个独立的子程来做. 具体的方法, 可以搜索一下这里的以前的帖子.Top
3 楼Sniper167(啥都不会)回复于 2004-12-02 21:16:41 得分 0
如果不把显示数值作为一个独立的子程序来做,请问在上面的哪个程序里怎么改正?
谢谢Top
4 楼xwdd129(高手就是:不出手)回复于 2004-12-03 15:57:27 得分 10
那就需要你自己知道要显示的数值都是几位的,然后再分别读取!!Top
5 楼Sniper167(啥都不会)回复于 2004-12-03 22:00:00 得分 0
有两位的
也有三位的Top
6 楼clumsy(Kyrie eleison)回复于 2004-12-04 08:33:09 得分 30
基于多个理由, 还是考虑写个通用点儿的输出数值的子程比较合理. 否则, 按照你上面的代码的思路, 实现起来比较繁琐, 要么就是显示效果不好. 你看看下面的子程, 这是以前有在这里贴出来的:
; display the unsigned integer value in AX
dec2asc proc
push ax
push dx
push cx
mov dx, -1 ; flag of ending
push dx ; flag to stack
mov cx, 10
l_div10:
xor dx, dx
div cx ; DX:AX / CX
push dx ; remainder to stack
test ax, ax ; quotient is zero?
jne l_div10
mov cx, -1
mov ah, 2 ; display character in DL
l_disp:
pop dx
cmp dx, cx
je l_ret
add dl, '0' ; one-digit value turns to character
int 21h ; display the digit
jmp l_disp
l_ret:
pop cx
pop dx
pop ax
ret
dec2asc endpTop
7 楼jk88811(你的就是我的,我的还是我的~!)回复于 2004-12-04 11:59:54 得分 0
楼上的有理Top




