实验——LC-3机器码编程

目录

一.实验目的与要求

二.实验内容与方法

三.实验步骤与过程

(1)无输出版本(用R2存储“1”的个数)

(2) 有输出版本

(3)有输出改良版(能符合所有的十六位字)


一.实验目的与要求

(1)分析和理解实验指定的问题

(2)利用LC-3的机器代码设计实现相关程序

(3)通过LC-3仿真器调试和运行相关程序并得到正确的结果

二.实验内容与方法

利用LC-3的机器代码计算一个16位的字中有多少位是“1”

(1)程序从x3000开始

(2)需计算的字存储在x3100

(3)计算的结果存储在x3101

三.实验步骤与过程

(1)无输出版本(用R2存储“1”的个数)

根据流程图在LC-3中写出对应机器码:(如下图所示)

         首先是初始化操作,x3000的指令负责对R2清零,即将R2与x0000相与;x3001的指令是将x3100的内容装入R1中,在此步前需将十六位的字装入x3100中便于运行时读取;x3002则开始判断R1中的值是否为0,若为0,则表示R1中全为0,直接跳到x3007,否则继续下一步x3003;x3003是对R1进行正负的判断,若R1为正,则表明R1中存放的十六位的字的最高位是0,不满足条件不能对计数器加一,因此跳到x3005,若R2为负数,则表明最高位是1,执行下一步x3004的对R2加1的操作;x3005的指令负责将R1中的数实现左移操作,则原先的判断完的最高位溢为,次高位变为最高位再次循环判断;x3006的指令是BRnzp无条件返回到x3002;直到由x3002判断是否终止循环。终止循环后到操作x3007,将R2的值存入x3101中,最后TRAP x25结束程序。

        在执行时:先Set Value 将十六位的字存入x3100中(若测试数据为xF025 “1111000000100101”),执行后可发现R2和x3101中都存储了“7”,表示“xF025”中有7个“1”。程序执行成功。

(2) 有输出版本

        流程与(1)相同唯一需要注意的是输出部分,需要将R2中的值转化为ASCII码才能输出,因此在x300E处存储了“48”,用R0去读取x300E,再将计数器R2的值加上R0中的48即得到了对应的ASCII码值,将值存入x3101中并调取输出指令“TRAP x21”输出即可。(如下图所示)

 (但这个程序有个弊端,当计数器的值大于十的时候,并不能正确的输出,因为ASCII表示的是一个字符输出,但是此时需要输出一个两位数,因此需考虑两位数的情况)

(3)有输出改良版(能符合所有的十六位字)

         如下图所示,在(2)的基础上,在x3008处对计数器R2减十,接着判断R2是不是两位数(x3009),若结果大于等于零,则表明R2是两位数,先输出一,再跳到x300E,否者直接跳到x300D,将R2加上十回到原先的值,再输出此时R2的值,程序结束。(最开始的结果在x3007时就已经按要求存放在了x3101中)

         运行结果如下图所示,当在x3100中存放(xFF10—“1111111100010000”共13个“1”)时,能输出正确结果,并在x3101中正确储存x000D。

猜你喜欢

转载自blog.csdn.net/Finecsr/article/details/124549428