计组实验
实验一 监控程序与汇编实验
用户区:2000-25FF
监控命令介绍
- R(Register)命令:1无参 查询寄存器的内容 2有参 修改寄存器


- D(Display)命令:查询内存的120个单位

这里解释一下形式,前四位(如2000)是内存的地址,后面的 0000 1880 FFFF 是内容,每两位代表一个字节,最后的符号对应十六进制的ASCII码字符(非可打印字符显示为.) 这里的数值全部都是十六进制的形式,因为四个二进制位可以代表一个十六进制位,所以一个十六进制数占4bit,1个字节占8bit,所以两位一个字节,后面的ASCII码值也是两位的。 - E(Edit)命令:修改内存

- A(Assembly)命令:编写汇编程序


- G(Go)命令:执行汇编程序

- U(Unassembly)命令:反汇编程序 反汇编把内存中的机器码转换成人类可读的汇编指令

汇编指令 基本指令集:




实例:

- 输入一个数,从这个数加到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 ; 程序返回

浙公网安备 33010602011771号