计组实验

实验一 监控程序与汇编实验

用户区:2000-25FF

监控命令介绍

  • R(Register)命令:1无参 查询寄存器的内容 2有参 修改寄存器
    image
    image
  • D(Display)命令:查询内存的120个单位
    image
    这里解释一下形式,前四位(如2000)是内存的地址,后面的 0000 1880 FFFF 是内容,每两位代表一个字节,最后的符号对应十六进制的ASCII码字符(非可打印字符显示为.) 这里的数值全部都是十六进制的形式,因为四个二进制位可以代表一个十六进制位,所以一个十六进制数占4bit,1个字节占8bit,所以两位一个字节,后面的ASCII码值也是两位的。
  • E(Edit)命令:修改内存
    image
  • A(Assembly)命令:编写汇编程序
    image
    image
  • G(Go)命令:执行汇编程序
    image
  • U(Unassembly)命令:反汇编程序 反汇编把内存中的机器码转换成人类可读的汇编指令
    image

汇编指令 基本指令集:

image
image
image
image
实例:
image

  • 输入一个数,从这个数加到10,并在屏幕上显示结果:
    out 80输出的是寄存器R0的ASCII码代表的字符 不是十六进制形式输出数字,而是自动转译成ASCII码输出
2000: IN 80          ; 读取输入的ASCII字符(如'3')到R0
2001: MVRD R1, 0030  ; 常数'0'
2002: SUB R0, R1     ; 转换为数值n(0~9)
2003: MVRD R1, 0000  ; 累加和寄存器清零
2004: MVRD R2, 000B  ; 循环结束值11(10+1)
2005: ADD R1, R0     ; 累加当前值n
2006: INC R0         ; 下一个数
2007: CMP R0, R2     ; 比较是否达到11
2008: JRNZ 2005      ; 若未到11,继续累加
; 此时R1中为累加和(0~55)
2009: MVRD R2, 000A  ; 常数10
200A: MVRD R3, 0000  ; 十位计数器清零
; 循环除以10,得到十位和个位
200B: CMP R1, R2     ; 比较累加和与10
200C: JRC 2011       ; 若小于10,跳转到输出部分
200D: SUB R1, R2     ; 减去10
200E: INC R3         ; 十位加1
200F: JMP 200B       ; 继续循环
; 输出十位(如果不为0)
2011: MVRD R0, 0030  ; 字符'0'的ASCII
2012: CMP R3, 0000   ; 检查十位是否为0
2013: JRZ 2016       ; 若为0,跳过输出十位
2014: ADD R0, R3     ; 转换为十位ASCII
2015: OUT 80         ; 输出十位
; 输出个位
2016: MVRD R0, 0030
2017: ADD R0, R1     ; 转换为个位ASCII
2018: OUT 80         ; 输出个位
2019: RET            ; 程序结束

对键入0-9数字并加到10的程序加一个条件,对输入的字符检测是否是0-9的数字,如果是则加和,如果不是则重新等待输入

2000: IN 80          ; 从端口80读入一个ASCII字符到R0
2001: MVRD R1, 0030  ; R1 = '0' (0x30)
2002: CMP R0, R1     ; 比较输入字符与'0'
2003: JRC 2000       ; 若R0 < '0'(进位=1),则跳回2000重新输入
2004: MVRD R2, 003A  ; R2 = ':' (0x3A,即'9'+1)
2005: CMP R0, R2     ; 比较输入字符与':'
2006: JRNC 2000      ; 若R0 >= ':'(进位=0),则不是数字,跳回2000
2007: SUB R0, R1     ; 将ASCII码转换为数值0~9(R0 = R0 - '0')
2008: MVRD R1, 0000  ; 累加和R1初始化为0
2009: MVRD R2, 000B  ; 循环结束值11(10+1)
200A: ADD R1, R0     ; 累加当前值到R1
200B: INC R0         ; 下一个数(R0自增)
200C: CMP R0, R2     ; 比较R0与11
200D: JRNZ 200A      ; 若不相等,继续累加
; 此时R1中为累加和(范围19~55)
200E: MVRD R2, 000A  ; 常数10,用于分解十进制
200F: MVRD R3, 0000  ; 十位计数器清零
2010: CMP R1, R2     ; 比较累加和与10
2011: JRC 2016       ; 若R1 < 10,直接输出个位(此时十位为0)
2012: SUB R1, R2     ; 减去10
2013: INC R3         ; 十位加1
2014: JMP 2010       ; 继续循环
2016: MVRD R0, 0030  ; 准备输出十位(ASCII '0')
2017: ADD R0, R3     ; 转换为十位数字的ASCII
2018: OUT 80         ; 输出十位
2019: MVRD R0, 0030  ; 准备输出个位
201A: ADD R0, R1     ; 转换为个位数字的ASCII
201B: OUT 80         ; 输出个位
201C: RET            ; 程序返回
posted @ 2026-03-09 19:51  弗阴  阅读(1)  评论(0)    收藏  举报