汇编语言程序设计之二
从键盘输入一系列字符(以回车结束),按数字,大小写字母分类计数,并在屏幕上打印出来。
DATA SEGMENT
INFOR1 DB 0AH,0DH,"Please Press Any Key to input a letter:$"
INFOR2 DB 0AH,0DH,"Lowercase Letter : $"
INFOR3 DB 0AH,0DH,"Uppercase Letter : $"
INFOR4 DB 0AH,0DH,"Digit : $"
INFOR5 DB 0AH,0DH,"Other Letter : $"
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
PRINT MACRO STR,RHS ; MACRO 为宏
LEA DX,RHS
MOV AH,09H
INT 21H
MOV DL,STR
ADD DL,30H
MOV AH,02H
INT 21H
ENDM
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET INFOR1
MOV AH,09H
INT 21H
MOV BX,0
MOV CX,0
XUNHUAN:
MOV AH ,01H
INT 21H ;AL
CMP AL,0DH ; \n
JZ DISPLAY
CMP AL,'0'
JB OTHER
CMP AL,'9'
JBE DIGIT
CMP AL,'A'
JB OTHER
CMP AL,'Z'
JBE UPPER
CMP AL,'a'
JB OTHER
CMP AL,'z'
JBE LOWER
JMP XUNHUAN
LOWER:
INC BL
JMP XUNHUAN ;
UPPER:
INC BH
JMP XUNHUAN
DIGIT:
INC CL
JMP XUNHUAN
OTHER:
INC CH
JMP XUNHUAN
DISPLAY:
PRINT BL,INFOR2
PRINT BH,INFOR3
PRINT CL,INFOR4
PRINT CH,INFOR5
MOV AH,4CH
INT 21H
CODE ENDS
END START
小结:
1. 如何判断回车符号?
回车符(跳转到本行开头) 0DH
换行符(到下一行) 0AH
2. 在输出的时候记得加上30H,用来以ASCII码的形式输出
2.输入一段数字字符,将其转换为数值,然后从1加到该数值,最后以十进制数值形式输出总和
DATA SEGMENT
INF1 DB 0AH,0DH,"PLEASE INPUT A NUMBER (0~361): $"
MSG2 DB 0AH,0DH," 2 Hexadecimal : $"
MSG3 DB 0AH,0DH,"THE SUM(1+2+3+....) IS : $"
IBUF DB 100,0,100 DUP('$')
OBUF DB 6 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:
PRINT_MSG MACRO parameter
LEA DX,parameter
MOV AH,09H
INT 21H
ENDM
MOV AX,DATA
MOV DS,AX
PRINT_MSG INF1
LEA DX,IBUF ;输入一个十进制数字(<361 )
MOV AH,0AH
INT 21H
MOV CL,IBUF+1
MOV CH,0
MOV AX,0
LEA SI,IBUF+2
AGAIN:
MOV DX,10
MUL DX
;如果参数是字节,将把 AL 做乘数, 结果放在 AX
;如果参数是字 , 将把 AX 做乘数, 结果放在 DX:AX
AND BYTE PTR [SI],0FH
ADD AL,[SI]
ADC AH,0
INC SI
LOOP AGAIN
; AX 中存放累加和
; BX 用来存放每次要加的数值
MOV CX,AX
MOV AX,0
MOV BX,1
LOOP2:
ADD AX,BX
INC BX
LOOP LOOP2
MOV BX,OFFSET OBUF+5
MOV BYTE PTR [BX],'$'
MOV CX,10
LOOP1:
MOV DX,0
DIV CX
; 被除数默认存放在 AX 中
; 除数是8位, 则被除数为 AX, AL 存储商,AH 储存余数
; 除数是16位,则被除数为 DX:AX ,AX 储存商,DX 储存余数
ADD DL,30H
DEC BX
MOV [BX],DL
OR AX,AX
JNZ LOOP1;
PRINT_MSG MSG3
MOV DX,BX
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
小结:
1. MUL 乘法指令
如果参数是字节,将把 AL 做乘数, 结果放在 AX
如果参数是字 , 将把 AX 做乘数, 结果放在 DX:AX
2. ADC 指令
- 要求低位字节相加,高位字节再相加时就要考虑低位相加的进位,即CF,这时就要用到ADC指令。
ADD AL,[SI]
ADC AH,0
3. 为什么不能超过 361 ?
因为从1加到361,会是65341,再大的话会超出AX的存储范围。
4. DIV 指令
除数是8位, 则被除数为 AX, AL 存储商,AH 储存余数
除数是16位,则被除数为 DX:AX ,AX 储存商,DX 储存余数