微机系统 实验上机课

该文描述了两个微机系统实验,实验二涉及编写汇编语言程序,将键盘输入的小写字母转化为大写显示。实验三则是统计给定数组中正负数的数量并输出。代码中使用了DOS中断INT21H进行字符显示和输入处理,并通过测试最高位判断数字的正负。
摘要由CSDN通过智能技术生成

微机系统 实验上机课

实验二

加强型实验: 编写程序要求对键盘输入的小写字母用大写字母显示出来

代码如下(便于复制版本)
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这两条指令,最终所得到的结果是一样的。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值