汇编基本问题(高手请进)

来源:百度知道 编辑:UC知道 时间:2024/05/30 21:01:11
【注意】不需要您给我程序,也不要给我拷贝或上网搜索来的资料。我希望有人能给我指出错误,因为我觉得是我程序的结构有问题,告诉我以后要注意些什么,谢谢。

题目要求:从3500H开始依次输入N个数据,第一个单元(即3500H)存放数据的总个数N,编写程序使其能分别求出数据区的正数、负数以及0的个数。正数的个数放在3510H,负数个数放在3511H,零的个数放在3512H。
测试输入的数据:09H(即总共9个数)、12H、80H、78H、C8H、00H、00H、FEH、99H、34H。
正常应得结果:03、04、02

以下是我编的程序:
STACK SEGMENT STACK
DW 64 DUP(?)
STACK ENDS

DATA SEGMENT
ORG 3500H
VAR DB 10 DUP(?)
ORG 3510H
RESULT DB 3 DUP(?)
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA SI,VAR
LEA DI,RESULT
MOV CL,[SI]
XOR CH,CH
MOV BL,CH
MOV BH,CH
MOV DL,CH

JUDGE:INC SI
MOV AL,[SI]
TEST AL,0FFH
JE ZERO
TEST AL,80H
JE POS
INC DL

ZERO: INC BL
POS : INC BH

LOOP JUDGE
MOV [DI],BH
M

毛病只有一个:计数某一个类型之后没有直接执行LOOP指令,而是重复计数。零的个数里面含有负数的个数,正数的个数里面则是9个全部数据的个数。

INC DL

ZERO: INC BL
POS : INC BH

LOOP JUDGE

错误在这里。
举个列子,当数字是个负数时,DL自增1,但程序还是会继续往下执行的
也就是说同时BL,BH也自增1。
由程序可知,存放正数个数的BL再最后面,所以该指令一定会执行,所以BL=09
修改方法可以在每个自增指令后面加无条件跳转

你在程序设计的时候存在的问题是不能将分支程序能独立起来,以后多注意点。