第五周
3.21周一
老师答案:
;提示用户输入一个字符,
;如果是大写字母则显示upper case letter,
;如果是小写字母则显示lower case letter,
;如果不是字母,则重复等待用户输入字母为止。
DATA SEGMENT
D1 DB 0DH,0AH,'Please input a letter:',0DH,0AH,'$'
D2 DB 0DH,0AH,'upper case letter$'
D3 DB 0DH,0AH,'lower case letter$'
DATA ENDS
CODE SEGMENT
ASSUME DS: DATA, CS: CODE
START: MOV AX, DATA
MOV DS, AX
AGAIN: MOV DX,OFFSET D1 ;输出提示字符串 Please input a letter:
MOV AH,9
INT 21H
MOV AH,1 ;等待用户输入单字符
INT 21H
UPPER: CMP AL,'A' ;判断是否是大写字母
JB NEXT
CMP AL,'Z'
JA LOWER
JBE UPPER1
LOWER: CMP AL,'a' ;判断是否是小写字母
JB NEXT
CMP AL,'z'
JA NEXT
JBE LOWER1
NEXT: JMP AGAIN
UPPER1: MOV DX,OFFSET D2 ;输出提示字符串Upper case letter
MOV AH,9
INT 21H
JMP EXIT
LOWER1: MOV DX,OFFSET D3 ;输出提示字符串Lower case letter
MOV AH,9
INT 21H
JMP EXIT
EXIT:MOV AH,4CH
INT 21H
CODE ENDS
END START
自己写的:
DATA SEGMENT
D1 DB 0DH,0AH,'Please input a letter:',0DH,0AH,'$'
D2 DB 0DH,0AH,'upper case letter$'
D3 DB 0DH,0AH,'lower case letter$'
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:MOV AX,DATA
MOV DS,AX
BEGIN:MOV DX,OFFSET D1
MOV AH,9
INT 21H
MOV AH,1 ;输入字符
INT 21H
CMP AL,41H
JB BEGIN ;如果小于A,等待再次输入
JNL AA ;如果>=A,继续跳转
AA: CMP AL,5AH
JA BB ;>Z,继续跳转
JNG UPPER ;<=Z,是大写字母
UPPER:MOV DX,OFFSET D2 ;输出大写字母提示
MOV AH,9
INT 21H
JMP EXIT ;结束
BB: CMP AL,61H
JB BEGIN;<a,等待再次输入
JNL CC;;>=a,继续判断
CC: CMP AL,7AH
JNG LOWER ;<=z,是小写字母
JA BEGIN; >z,等待再次输入
LOWER:MOV DX,OFFSET D3 ;输出小写字母提示
MOV AH,9
INT 21H
JMP EXIT ;结束
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END START
2. 判断输入的字符是否是0-9的数字,如果是,输出“a number”字符串,如果不是,输出“not a number”字符串
- 注意回车和换行定义在字符串里
- 指令JA (above)JB(below)的使用
- 判断是否是0-9:使用CMP指令判断是否<0或>9,若是则不在[0,9]范围内
DATA SEGMENT
D1 DB 0DH,0AH, 'a number',0DH,0AH, '$' ; 0DH是回车,0AH是换行
D2 DB 0DH,0AH, 'not a number',0DH,0AH, '$'
DATA ENDS
CODE SEGMENT
ASSUME DS: DATA, CS: CODE
START: MOV AX, DATA
MOV DS, AX
MOV AH,1 ;1号功能,等待用户输入单字符
INT 21H
CMP AL,'0' ;判断是否为数字
JB NO
CMP AL,'9'
JA NO
YES : MOV DX,OFFSET D1 ;是数字,则输出提示字符串 a number
MOV AH,9
INT 21H
JMP EXIT
NO : MOV DX,OFFSET D2 ;不是数字,则输出提示字符串 not a number
MOV AH,9
INT 21H
JMP EXIT
EXIT : MOV AH,4CH
INT 21H
CODE ENDS
END START
3.将两个将两个字节数据相加,存放到一个结果单元中,并显示十六进制结果。
该代码可以判断要输出的是数字还是字母
DATA SEGMENT
D1 DB 4DH
D2 DB 21H
SUM DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,D1
ADD AL,D2
MOV SUM,AL ;结果存进sum中
MOV BL,AL ;备份
MOV BH,0 ;记录输出次数
;第一位数,移动4位
MOV CL,4
SHR AL,CL
BEGIN: AND AL,0FH
CMP AL,0AH ;判断是数字还是字母
JNL LETTER
;数字转换
NUMBER:ADD AL,30H
JMP OUTPUT
;字母转换
LETTER:SUB AL,09H
ADD AL,40H
;输出
OUTPUT:INC BH;输出1次,BH+1
MOV DL,AL
MOV AH,2
INT 21H
CMP BH,2
JZ EXIT
;第二位数
MOV AL,BL
JMP BEGIN
;输出
EXIT: MOV DL,'H'
MOV AH,2
INT 21H
;返回系统,结束
MOV AH,4CH
INT 21H
CODE ENDS
END START
- 输出单个字符时数字到ASCII码的转换
- 分别输出7和1
DATA SEGMENT
D1 DB 4CH
D2 DB 25H
SUM DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,D1
ADD AL,D2
MOV SUM,AL;71H存进sum中
MOV BL,AL;备份71H
;输出'7'
MOV CL,4
SHR AL,CL
AND AL,0FH
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
;输出'1'
MOV AL,BL
AND AL,0FH
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
MOV DL,'H'
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
第四周
1. WORD类型变量x1中有自定义的5个数据。要求编写程序实现将这5个数求和,把结果存放到WORD类型变量S中
- 使用循环指令loop
;5个数求和
DATA SEGMENT
X1 DW 1H,2H,3H,1H,1H
S DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,5
XOR AX,AX
LEA BX,X1
AA: ADD AX,[BX]
INC BX
INC BX
LOOP AA
MOV S,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
- 使用jnz指令(cx的值减1,如果不为零则继续执行aa语句段)
;5个数求和
DATA SEGMENT
X1 DW 1H,2H,3H,1H,1H
S DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,5
XOR AX,AX
LEA BX,X1
AA: ADD AX,[BX]
INC BX
INC BX
DEC CX
JNZ AA
MOV S,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
2. 编写计算1+2+3+…+99+100的程序,要求把结果存放于WORD类型变量X中 。
注意:利用loop循环指令中cx自减的特性,从100开始加和,加到cx减少到0为止
DATA SEGMENT
X DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DX,AX
XOR AX,AX
MOV CX,100
AA: ADD AX,CX
LOOP AA
MOV X,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
3. 有三个字节类型的变量D1、D2和D3,比较大小,把最小的数放在D4变量中
注意:因为变量都是两字节8位,所以不能使用AX,而要使用AL,因为AL是8位,需要注意类型匹配问题
DATA SEGMENT
D1 DB 12H
D2 DB 24H
D3 DB 5H
D4 DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,D1
CMP AL,D2
JC AA
MOV AL,D2
AA: CMP AL,D3
JC BB
MOV AL,D3
BB: MOV D4,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
4. 实验
编写完整的汇编语言程序,实现如下功能:
1.在数据段定义word型变量sum,byte型变量flag。
2.计算2+4+6+...+98+100的和,将结果存放在变量sum中。
3.若sum的值大于2500,则令flag的值为1;否则,令flag的值为0。
DATA SEGMENT
SUM DW 0
FLAG DB 1
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX,2
MOV CX,50
XOR AX,AX
;循环语句
AA: ADD AX,BX
INC BX
INC BX
LOOP AA
;判断sum的值
CMP AX,2500
JC BB ;产生借位,AX<2500
JZ BB ;AX=2500
JNC CC ;不产生借位,AX>2500
BB: MOV FLAG,0
;把AX中的值传回sum
CC: MOV SUM,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START