微机系统 实验上机课
实验二
加强型实验: 编写程序要求对键盘输入的小写字母用大写字母显示出来
代码如下(便于复制版本)
DATA SEGMENT
NOTIC DB "Please input the word!",0AH,0DH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CX,19H
LEA BX,[NOTIC]
AA0: MOV DL,[BX]
MOV AH,2
INT 21H
INC BX
LOOP AA0
AA1: MOV AH,1
INT 21H
CMP AL,1BH
JZ AA3
CMP AL,61H
JS AA2
CMP AL,7AH
JNS AA2
SUB AL,20H
AA2: MOV DL,AL
MOV AH,2
INT 21H
LOOP AA1
AA3: MOV AH,4CH
INT 21H
CODE ENDS
END START
代码如下(便于理解版)
DATA SEGMENT
NOTIC DB "Please input the word!",0AH,0DH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CX,19H
LEA BX,[NOTIC];将字符串NOTICE的地址加载到BX寄存器中
AA0: MOV DL,[BX]
MOV AH,2
INT 21H;调用DOS 21H的功能,将DL中字符显示在屏幕上
INC BX
LOOP AA0
AA1: MOV AH,1
INT 21H;等待用户键入一个字符将其保存在 AL中
CMP AL,1BH
JZ AA3
CMP AL,61H
JS AA2;检查SF的状态,负数为1,否则为0,为1的时候跳转
CMP AL,7AH
JNS AA2;为0跳转
SUB AL,20H
AA2: MOV DL,AL
MOV AH,2
INT 21H
LOOP AA1
AA3: MOV AH,4CH
INT 21H
CODE ENDS
END STAR
思考题
【1】若在源程序中把 INT 21H的 ‘H’ 省去,会产生什么现象?
答:若在源程序中把 INT 21H的 ‘H’ 省去汇编器会将其解析为十进制数,最终执行的实际上是INT 15H这个中断是为了在启动分页之前获得当前内存使用状况的。
【2】把 INT 21H 4CH号功能改为 INT 20H,行不行?
答:把 INT 21H 4CH号功能改为 INT 20H不行,INT 21H/4CH是DOS的中断调用命令,而INT 20H是程序终止命令并只适用于MS-DOS。
实验三
基础性实验 :将二十个数分为正负两组,分别统计正负数的个数,将其输出
代码如下(便于复制版)
DSEG SEGMENT PARA PUBLIC'DSEG'
M DB -1,-2,-3,-4,-5,-6,-7,-8,-9,-10,1,2,3,4,5,6,7,8,9,12
P DB 20 DUP(?)
N DB 20 DUP(?)
DSEG ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DSEG
START:MOV AX,DSEG
MOV DS,AX
LEA SI,P
LEA DI,N
LEA BX,M
XOR AX,AX
XOR DX,DX
MOV CX,20
L1: MOV AL,[BX]
TEST AL,80H
JZ L2
MOV [DI],AL
INC BX
INC DI
INC DH
JMP L3
L2: MOV [SI],AL
INC BX
INC SI
INC DL
L3: LOOP L1
MOV CX,2
L5: MOV BL,DL
SHR DL,1
SHR DL,1
SHR DL,1
SHR DL,1
AND DL,0FH
CMP DL,10
JB L4
ADD DL,7
L4:ADD DL,30H
MOV AH,2
INT 21H
MOV DL,BL
AND DL,0FH
CMP DL,10
JB L6
ADD DL,7
L6:ADD DL,30H
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,DH
LOOP L5
MOV AH,4CH
INT 21H
CODE ENDS
END START
代码如下(看注释)
DSEG SEGMENT PARA PUBLIC'DSEG'
M DB -1,-2,-3,-4,-5,-6,-7,-8,-9,-10,1,2,3,4,5,6,7,8,9,12
P DB 20 DUP(?)
N DB 20 DUP(?)
DSEG ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DSEG
START:MOV AX,DSEG
MOV DS,AX
LEA SI,P;正数数组首地址
LEA DI,N;负数数组首地址
LEA BX,M;输入数组首地址
XOR AX,AX;清零用于计数 下同
XOR DX,DX
MOV CX,20;设置循环次数为20,遍历数组M的20个元素
L1: MOV AL,[BX];首先取出一元素将其放入AL
TEST AL,80H;检查最高位是否为1,即是否为负数
JZ L2;Jump if Zero ZF设置为1的时候跳转,表示前一个操作数为零,此处表示AL是非负数时跳到L2
MOV [DI],AL;若为负数 将其存入[DI]
INC BX;接下来三个自增 各个数组中指针往下
INC DI
INC DH;记录负数个数
JMP L3
L2: MOV [SI],AL;非负情况
INC BX
INC SI
INC DL;记录非负数个数
L3: LOOP L1;循环继续直至遍历完所有元素
MOV CX,2;循环次数设置为2,遍历两次分别输出数组N和P中的元素
L5: MOV BL,DL
SHR DL,1;右移四位 将DL寄存器的十进制数值转化为BCD码
SHR DL,1
SHR DL,1
SHR DL,1
AND DL,0FH;按位与,获得DL寄存器的低四位
CMP DL,10
JB L4;Jump if Below CF标志位为1的时候跳转,表示前一个操作中发生了无符号数的进位,小于10跳转
ADD DL,7;得到字符的ASCII码
L4:ADD DL,30H;BCD码转化为ASCII码 加上十进制的48
MOV AH,2
INT 21H;显示字符
MOV DL,BL
AND DL,0FH
CMP DL,10
JB L6
ADD DL,7
L6:ADD DL,30H
MOV AH,2
INT 21H
MOV DL,0AH;换行符
MOV AH,2
INT 21H
MOV DL,0DH;回车
MOV AH,2
INT 21H
MOV DL,DH;开始处理负数的个数
LOOP L5
MOV AH,4CH;用于程序的正常退出
INT 21H
CODE ENDS
END START
思考题
【1】示例题中是否一定要用 CMP 指令来实现条件转移?如果不是,请设计出替代程序。
答:示例题中不是一定要用CMP指令来实现条件转移,CMP比较指令是将两个操作数做减法,CMP比较指令和SUB普通减法指令都可以设置相应的标志位。因此CMP DL, 10便可以改写成MOV AL, DL SUB AL, 10这两条指令,最终所得到的结果是一样的。