📄 count.asm
字号:
DATA SEGMENT
NUM DB -19,28,37,-46,55,61,-74,255
NUMC EQU $-NUM
COUNT DB ? ,"$"
MAX DB -127
MIN DB 127
MSG_MAX DB 0DH,0AH,"MAX=","$"
MSG_MIN DB "H,MIN=","$"
MSG_END DB "H","$"
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
LEA SI,NUM ;将NUM的地址传给SI
MOV CX,NUMC ;CX记录还未统计的NUM的个数
XOR BL,BL ;BL置0
NEXT :
MOV AL,[SI]
CMP AL,0 ;AL与0做比较
JGE POSI ;比0大的话,BL不增加
CMP AL,-1 ;-1即255,NUM中不含-1
JE POSI ;如果是255的话,BL不增加
INC BL ;负数计数加一
POSI :
CMP MAX,-1 ;最大值是255,则不改变MAX的值
JE NMAX
CMP AL,-1 ;AL是255,则直接把MAX置为255
JNE N255
MOV MAX,AL
JMP NMAX
N255 :
CMP AL,MAX ;比较AL与MAX的大小关系
JLE NMAX
MOV MAX,AL ;更新MAX
NMAX :
CMP AL,MIN ;比较AL与MIN的大小关系
JGE NMIN
MOV MIN,AL ;更新MIN
NMIN :
INC SI ;SI移动一位
LOOP NEXT
MOV COUNT,BL
OR COUNT,30H
MOV DX,OFFSET COUNT
CALL DISP ;显示负数的个数
MOV DX,OFFSET MSG_MAX
CALL DISP
MOV BL,MAX
CALL PRINTHEX ;调用PRINTHEX函数把MAX按十六进制显示出
MOV DX,OFFSET MSG_MIN
CALL DISP
MOV BL,MIN
CALL PRINTHEX ;调用PRINTHEX函数把MIN按十六进制显示出
MOV DX,OFFSET MSG_END
CALL DISP
MOV AH,4CH
INT 21H
DISP PROC ;输出字符串
MOV AH,9
INT 21H
RET
DISP ENDP
PRINTHEX PROC ;将BL按十六进制显示出
MOV DL,BL ;把BL的值存到DL中
MOV CL,4
SHR DL,CL ;DL右移4位,先将BL高4位以十六进制显示出
ADD DL,30H ;”0”的ASCII码为30H
CMP DL,3AH ;如果大于9
JL PDL1
ADD DL,07H ;再加7 因为” A”的ASCII码是41H
PDL1:
MOV AH,2
INT 21H ;显示出BL高4位的十六进制
MOV DL,BL
AND DL,0fH ;取BL的低四位
ADD DL,30H ;和高四位一样的处理方式,显示出低四位表示的十六进制
CMP DL,3AH
JL PDL2
ADD DL,07H
PDL2:
MOV AH,2
INT 21H
RET
PRINTHEX ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -