提示:以下是本篇文章正文内容,下面案例可供参考
提示:以下是本篇文章正文内容,下面案例可供参考
代码如下(示例):
DATA SEGMENT
data1 dw 0,1,2,3233,4,5,6,7,8,9
INPUTTIPS DB 'Please input score,divid with " ":$'
ERRORTIPS DB 'input ERROR!,please try again!$'
tips DB 'not find$'
sii1 dB 0
ENDTIPS DB 'results:$'
DATA ENDS
STACK SEGMENT
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
CALL BEGIN
CALL INPUT; 显示results
CALL NEXT
call PRINT
;此处输入代码段代码
MOV AH,4CH
INT 21H
;========================BEGIN=============================
BEGIN PROC NEAR
MOV DX,OFFSET INPUTTIPS ;显示提示输入
MOV AH,09H ;09h表示显示字符串
INT 21H ;调用dos
XOR AX,AX
XOR BX,BX
XOR CX,CX
XOR SI,SI
XOR DI,DI ;寄存器清零
RET
BEGIN ENDP
;==========================INPUT==========================
INPUT PROC NEAR
MOV AH,1 ;键盘输入并回显 al等于输入字符
INT 21H ;从键盘输入数据
CMP AL,0DH ;回车键为0DH
JZ ENDINPUT ;zf(零标志位)=1跳转,是否为回车键
CMP AL,30H
JB ERROR;左小于右跳转
CMP AL,39H
JA ERROR;左大于右跳转,0-9的ascii码为30h到39h
SUB AL,30H ;变为真数
MOV CL,4
SHL BX,CL ;左移四位.变为BCD码(二进码十进数)四位二进制表示1位十进制
ADD BL,AL
JMP INPUT
ENDINPUT:
MOV DX,OFFSET ENDTIPS ;显示输出提示
MOV AH,09H
INT 21H ;DI得到个数,DI保持不变化
JMP INPUTEND
ERROR: mov dx,offset ERRORTIPS
mov ah,09h
int 21h
CALL NEXT
jmp START
INPUTEND: RET
INPUT ENDP
;========================PRINT========================
PRINT PROC NEAR
MOV SI,0
ADD sii1,1
call BCD_TO_HEN
MOV CX,10
mov si,offset data1
LMAX:
CMP BX,[si]
JE NEXT1
ADD sii1,1
ADD SI,2
LOOP LMAX
NEXT1:
;ADD SI,1
;LOOP LMAX
;XOR BX,BX
;MOV bx,sii1
; CALL PRINTINT
;MOV AL,sii1
;ADD AL,30H
;call PRINTINT
call PRINTINT
add sii1,30H
CMP sii1,30H
JB next2;左小于右跳转
CMP sii1,39H
JA next2;左大于右跳转,0-9的ascii码为30h到39h
MOV DL,sii1
MOV AH,02h
INT 21h
RET
next2:
mov dx,offset tips
mov AH,09h
int 21h
ret
PRINT ENDP
;========================换行========================
NEXT:
mov dl,0ah;换行对应ASCII码
mov ah,02h
int 21h
mov dl,0dh;回车对应的ASCII码
mov ah,02h;输出DL内容
int 21h
ret
;==========
;========================BCD转换为十六进制========================
BCD_TO_HEN PROC NEAR
PUSH CX
PUSH AX
PUSH DX
PUSH SI
PUSH DI
XOR DX, DX
MOV AX, BX
PUSH AX
AND AX,0F000H;取千位数
MOV CL, 4 ;移位取出十位数
SHR AX, CL
MOV DH, AH
POP AX
PUSH AX
AND AX, 0F00H ;取百位数
MOV DL, AH
POP AX
PUSH AX
MOV AX, DX
AAD
MOV DI, 100 ;乘100
MUL DI
MOV SI, AX
POP AX
PUSH AX
MOV CL, 4 ;移位取出十位数
SHR AX, CL
AND AX, 000FH
MOV DH, AL
POP AX
PUSH AX
AND AX, 000FH ;取AL低四位,个位数
MOV DL, AL
POP AX
MOV AX, DX
AAD
ADD AX, SI
MOV BX, AX ;转换结果给BX
POP DI
POP SI
POP DX
POP AX
POP CX
RET
BCD_TO_HEN ENDP
;========================4位十六进制转换为BCD========================
HEN_TO_BCD PROC NEAR
PUSH AX
PUSH CX
PUSH DX
XOR DX,DX
MOV AX,BX
MOV BX,0000H
MOV CX,1000
DIV CX
MOV CL,4
AND AX,000FH
ADD BX,AX
ROL BX,CL
MOV AX,DX ;余数再放到AX里面
MOV CL,100
DIV CL
PUSH AX
AND AX,000FH
ADD BX,AX
MOV CL,4
ROL BX,CL
POP AX
MOV AL,AH;余数再除10
AND AX,00FFH
MOV CL,10
DIV CL
AND AL,0FH
ADD BL,AL
MOV CL,4
ROL BX,CL
ADD BL,AH
POP DX
POP CX
POP AX
RET
HEN_TO_BCD ENDP
;====================打印16进制数为BCD整数====================
PRINTINT PROC NEAR
PUSH BX
PUSH CX
PUSH AX
PUSH DX
MOV AX,BX
CALL HEN_TO_BCD ;结果在转换为BCD码
MOV DL,BH
MOV CL,4
SHR DL,CL
ADD DL,30H
CMP DL,30H
JZ l1
MOV AH,02H;输出千位数
INT 21H
l1: MOV DL,BH ;输出百位数
AND DL,0FH
ADD DL,30H
CMP DL,30H
JZ l2
MOV AH,02H
INT 21H
l2: MOV DL,BL ;输出十位数
MOV CL,4
SHR DL,CL
ADD DL,30H
CMP DL,30H
JZ l3
MOV AH,02H
INT 21H
l3: MOV DL,BL
and dl,0FH ;输出个位数
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,20H ;输出空格
MOV AH,02H
INT 21H
POP DX
POP AX
POP CX
POP BX
RET
PRINTINT ENDP
CODE ENDS
END START