声明:本文为个人学习总结笔记,如有谬误,望不吝指教。
注意:代码在win10系统的dosbox中运行,运行过程无异样,代码部分解释程序中给出
统计20个数中正数、负数、零的个数
换行代码解析:参考链接
; 统计20个数的正数,负数,零的个数
DATAS SEGMENT
CRLF DB 0AH,0DH,"$";回车换行
string1 DB "The number of positive numbers is:","$";正数的个数输出提示 $字符串结束标志
string2 DB "The number of negative numbers is:","$";负数的个数输出提示
string3 DB "The number of zeros is:","$" ;零的个数输出提示
table db 7,98,-98,123,18,113,-45,66,-13,-122,0,-33,0,-99,0,1,2,3,-4,-5
DATAS ENDS
STACKS SEGMENT
; 此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;变量初始化
MOV SI,OFFSET TABLE;偏移量
mov cl,0;用于计数,总共15个
mov ch,0;用于数字为零的计数
mov bh,0;用于数字为正数的计数
mov bl,0;用于数字为负数的计数
again:;比较计数板块
cmp cl,20;比较次数是否达到最后了
je overoutput;跳转到输出板块
MOV AL,[SI];接收数据
CMP AL,0h
jz zero;表示为零,ch
js negative;表示负数,bl
jmp positive;表示正数,bh
zero:
add ch,1
jmp over;每一次输出收尾
negative:
add bl,1
jmp over
positive:
add bh,1
jmp over
over:
add cl,1;计数
add si,1;偏移量
jmp again;回到起点
; 输出一个字符时仅支持输出数字0~9
overoutput:;输出板块 bx/cx不能动,保留着计数
LEA DX, string1;正数的输入提示
MOV AH, 09H ;字符串(需要结束标志$)
INT 21H ;中断调用(输出字符串)
add bh,48 ; 转化为对应ASCII码值
mov dl,bh
mov ah,2 ; 输出一个字符
int 21h
LEA DX, crlf ;换行
MOV AH, 09H
INT 21H
LEA DX, string2;负数的输入提示
MOV AH, 09H
INT 21H
add bl,48
mov dl,bl
mov ah,2
int 21h
LEA DX, crlf
MOV AH, 09H
INT 21H
LEA DX, string3;零的输入提示
MOV AH, 09H
INT 21H
add ch,48
mov dl,ch
mov ah,2
int 21h
LEA DX, crlf
MOV AH, 09H
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START