注册 登录
编程论坛 汇编论坛

[求助]汇编程序错哪了

linhaice 发布于 2006-10-28 22:00, 659 次点击




下面是我编的程序
STACK SEGMENT
DW 64 DUP(?)
STACK ENDS
DATA SEGMENT
M DB 21H,09H,32H,2DH,12H
N DB 5
PRINT DB 'THE BIGGEST NUM. IS:',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET M
MOV AL,[BX]
MOV CL,N
TT1:INC BX
CMP AL,[BX]
JNA TT2
MOV AL,[BX]
TT2:DEC CL
JNZ TT1
MOV BX,OFFSET M
MOV AH,09H
LEA DX,PRINT
INT 21H
MOV AH,02H
MOV DL,AL
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START

题目是:数据段中已定义了一个有N个字数据的数组M,求出M中绝对值最大的数,并显示。 我是新手,谁能帮我看看哪错了谢谢啊

6 回复
#2
菜鸟上路2006-10-29 10:16

程序有几个可疑之处:
MOV AL,[BX] 两者类型不同;
JNA TT2 应该是JA TT2;
MOV DL,AL 最好放在MOV AH,02H之前;
因为最开始已经MOV AL,[BX],所以N应该为4.



#3
linhaice2006-10-30 18:11
还是不行啊!!怎么都没人看看啊
#4
srl99732006-10-30 20:45
START:MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET M
MOV AL,[BX]
MOV CL,N
TT1:INC BX
CMP AL,[BX]
JNA TT2 ; 改为 JA TT2
MOV AL,[BX]
TT2:DEC CL
JNZ TT1
MOV BX,OFFSET M ;;这条语句无用

;; 后面加上
mov bl,al ;;作用是保护好求得的最大值.因为用DOS调用时会破坏AL中的值

MOV AH,09H
LEA DX,PRINT
INT 21H
;;后面加上
mov dl,bl
mov cl,4
shl dl,4 ;;高四位转换成对应十六进制的ASCII码
add dl,30h
cmp dl,39h
jna jjj1
add dl,7
jjj1:
MOV AH,02H
;; 删掉 MOV DL,AL
INT 21H
;;后面加上
mov dl,bl ;;低四位转换成对应的十六进制的ASCII
and dl,0fh
add dl,30h
cmp dl,39h
jna jjj2
add dl,7
jjj2: int 21h

MOV AH,4CH
INT 21H
CODE ENDS
END START
#5
srl99732006-10-30 20:47

同时N的值应先减1

#6
linhaice2006-10-31 12:19

谢谢了啊

#7
linhaice2006-10-31 18:56
STACK SEGMENT
DW 64 DUP(?)
STACK ENDS
DATA SEGMENT
M DB 21H,09H,32H,2DH,12H
N DB 5
PRINT DB 'THE BIGGEST NUM. IS:',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET M
MOV AL,[BX]
MOV CL,N
TT1:INC BX
CMP AL,[BX]
JA TT2
MOV AL,[BX]
TT2:DEC CL
JNZ TT1
MOV BL,AL
MOV AH,09H
LEA DX,PRINT
INT 21H
MOV DL,BL
MOV CL,4
MOV DL,CL
ADD DL,30H
CMP DL,39H
JNA TT3
MOV AH,02H
INT 21H
TT3:MOV AH,4CH
INT 21H
CODE ENDS
END START
这是修改以后的 为什么输出老是为0啊
1