![]() |
#2
ONEPROBLEM2008-11-22 08:54
这个程序问题不少~~
;============================= DATA SEGMENT ORG 100H;偏移量为100 BUF DB 256 dup (?) ZR DB 0 ;0元素 ZH DB 0 ;正元素 FU DB 0 ;负元素 COUNT EQU $-BUF;长度 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA start: mov ax, data mov ds, ax mov si, offset buf ;设置数据块首地 mov cx, COUNT ;设数据块长度 cld ;地址修改为增量 xor al, al ;数据块第一个数据为0 nexta: mov [si], al ;向内存送256个数据 inc si inc al loop nexta mov si, offset buf mov cx, COUNT done1: mov al, [si] ;显示数据块数据 call disp inc si loop done1 mov si, offset buf mov cx, COUNT _loop: test al, 80h ;测试是否为负数 ;这里是不是得先有一句:mov al,[si]? jnz _FU ;是负数则转 or al,00h jz _ZR ;是零转 inc ZH ;正数 inc si loop _loop ;这句后面是不是少了jmp bi _FU: inc FU jmp _loop ;这里怎么不递增si? 应加inc si _ZR: inc ZR jmp _loop ;同上 inc si bi : mov bl,ZR call _Chg mov bl,ZH call _Chg mov bl,FU call _Chg mov ah, 4ch int 21h disp proc mov dl,al; xian shi mov ah,2 int 21h mov ah, 2 ; kong ge mov dl, 20h int 21h Ret disp endp _Chg proc mov ch,bl mov cl,4 shr bl, cl call dip mov bl, ch and bl, 0ah call dip ret _Chg endp dip proc cmp bl, 0ah js done1 ;这还跳回done1?不是死循环吗? add bl, 7 don1:add bl, 30h mov dl, bl mov ah, 02 int 21h ret dip endp CODE ENDS end start |
程序目的:100H单元开始写入00H-ffH的数据,并在DOS功能调用下显示数据块的内容,统计数据块中0元素 负元素 正元素个数,以下程序没有数据统计的结果为什么?
请给一个完整的程序参考下。
DATA SEGMENT
ORG 100H;偏移量为100
BUF DB 256 dup (?)
ZR DB 0 ;0元素
ZH DB 0 ;正元素
FU DB 0 ;负元素
COUNT EQU $-BUF;长度
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
start: mov ax, data
mov ds, ax
mov si, offset buf ;设置数据块首地
mov cx, COUNT ;设数据块长度
cld ;地址修改为增量
xor al, al ;数据块第一个数据为0
nexta: mov [si], al ;向内存送256个数据
inc si
inc al
loop nexta
mov si, offset buf
mov cx, COUNT
done1: mov al, [si] ;显示数据块数据
call disp
inc si
loop done1
mov si, offset buf
mov cx, COUNT
_loop: test al, 80h ;测试是否为负数
jnz _FU ;是负数则转
or al,00h
jz _ZR ;是零转
inc ZH ;正数
inc si
loop _loop
_FU: inc FU
jmp _loop
_ZR: inc ZR
jmp _loop
bi : mov bl,ZR
call _Chg
mov bl,ZH
call _Chg
mov bl,FU
call _Chg
mov ah, 4ch
int 21h
disp proc
mov dl,al; xian shi
mov ah,2
int 21h
mov ah, 2 ; kong ge
mov dl, 20h
int 21h
Ret
disp endp
_Chg proc
mov ch,bl
mov cl,4
shr bl, cl
call dip
mov bl, ch
and bl, 0ah
call dip
ret
_Chg endp
dip proc
cmp bl, 0ah
js done1
add bl, 7
don1:add bl, 30h
mov dl, bl
mov ah, 02
int 21h
ret
dip endp
CODE ENDS
end start