菜鸟一枚,刚学汇编,编了个统计正负数的程序,怎么做不出来,跪求大神改改!!!

STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP(?)
STACK ENDS
DATA SEGMENT
BUF DW 10
DW 2310,-43,31,-321,-1234,345,0,3213,0,5477
POSITIVE DW 0
NEGATIVE DW 0
ZERO DW 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA,SS:STACK
MAIN PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
LEA BX,BUF
INC BX
INC BX
MOV CL,10
MOV DH,0
MOV DL,0
MOV CH,0
PP1:MOV AX,[BX]
CMP AX,0
JGE PP2
ADD DH,1
JMP AGAIN
PP2:CMP AX,0
JG PP3
ADD DL,1
JMP AGAIN
PP3:ADD CH,1
AGAIN :INC BX
INC BX
LOOP PP1
AND DH,0FH
ADD DH,30H
MOV AH,0
MOV AL,DH
MOV NEGATIVE ,AX
AND DL,0FH
ADD DL,30H
MOV AH,0
MOV AL,DL
MOV ZERO ,AX
AND CH,0FH
ADD CH,30H
MOV AH,0
MOV AL,CH
MOV POSITIVE ,AX
MOV DX,NEGATIVE
MOV AH,9
INT 21H
MOV DL,' ';空格
MOV AH,9
INT T21H
MOV DX,ZERO
MOV AH,9
INT 21H
MOV DL,' ';空格
MOV AH,9
INT 21H
MOV DX,POSITIVE
MOV AH,9
INT 21H
RET
MAIN ENDP
CODE ENDS
END

程序中有两个错误:
(1)输出字符应该用DOS的2号调用,而不是9号,9号是输出字符串的。
(2)LOOP用的是CX,而不是用的CL.因此你不能用CH再做计数器
这个程序改起来不难,你可以自己试着改一下。建议你不要用寄存器做计数器了,可以用:
ADD [zero],1这样的指令计数就行了。输出之前再ADD [ZERO],30H转为字符串就行了。
另外,你这个程序还有一个问题就是,统计结果不能大于9,大于9时,就不能用加30H的方式简单转换显示了。
已经给你说的比较的清楚了,建设你自己改一下,这样才能学会。
实在不会改了,我给你贴个正确的程序。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-21
STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP(?)
STACK ENDS
DATA SEGMENT
BUF DW 10
DW 2310, -43, 31, -321, -1234, 345, 0, 3213, 0, 5477
POSITIVE DB 0
NEGATIVE DB 0
ZERO DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
MAIN:
MOV AX, DATA
MOV DS, AX
MOV POSITIVE, 0
MOV NEGATIVE, 0
MOV ZERO, 0
LEA BX, BUF
MOV CL, [BX] ;10
MOV CH, 0
PP1:
INC BX
INC BX
MOV AX, [BX]
CMP AX, 0
JE _0
JL _1
INC POSITIVE
JMP AGAIN
_0:
INC ZERO
JMP AGAIN
_1:
INC NEGATIVE
AGAIN:
LOOP PP1
;---------------------------------
MOV AL, NEGATIVE
MOV AH, 0
MOV BL, 10
DIV BL
ADD AL, 30H
MOV DL, AL
PUSH AX
MOV AH, 2
INT 21H
POP AX
ADD AH, 30H
MOV DL, AH
MOV AH, 2
INT 21H
MOV DL, ' ';空格
MOV AH, 2
INT 21H
MOV AL, ZERO
MOV AH, 0
MOV BL, 10
DIV BL
ADD AL, 30H
MOV DL, AL
PUSH AX
MOV AH, 2
INT 21H
POP AX
ADD AH, 30H
MOV DL, AH
MOV AH, 2
INT 21H
MOV DL, ' ';空格
MOV AH, 2
INT 21H
MOV AL, POSITIVE
MOV AH, 0
MOV BL, 10
DIV BL
ADD AL, 30H
MOV DL, AL
PUSH AX
MOV AH, 2
INT 21H
POP AX
ADD AH, 30H
MOV DL, AH
MOV AH, 2
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END MAIN
第2个回答  2012-12-21
如果
相似回答