LC-3 机器码编程实验

news/2025/1/11 20:03:49/

一、实验目的

  1. 分析和理解试验指定的需解决问题。
  2. 利用LC-3的机器代码设计实现相关程序。
  3. 通过LC-3仿真器调试和运行相关程序并得到正确的结果。

二、实验内容

利用LC-3的机器代码计算一个16位的字中有多少位是“1”,程序从x3000开始,需计算的字存储在x3100,计算的结果存储在x3101。

三、实验步骤与结果

1. 流程图及思路

在这里插入图片描述

因为输入的数据只有16位,那么计算一个数据中“1”的个数,只需要进行16轮循环。实现16轮循环的具体方法是:令一个寄存器(R2)的值为16,在每一轮循环结束的时候都减1,直到R2 = 0的时候中止循环。用这种方法,可以将循环进行16次,对每一个位都进行检验。这里面遇到了一个问题,5位立即数的范围有限,无法一次性将R2的值加到16。于是我分了两次:先令R2 = 1,然后R2 += 15。

用一个寄存器(R3)保存输入数据,在每一轮循环中,通过判断该数字是否大于等于0,来检测其符号位。如果该数字为非负,则符号位为0;如果该数字为负,则符号位为1。在保存结果的寄存器(R1)中记录每一轮检测的信息。

每一轮循环后,将R3的值左移一位。具体方法是将R3的值乘以2,用加法实现,就是R3 = R3 + R3。这样就可以更新最高位的信息,进行下一轮的检测,直到程序结束。

2. 源代码和注释

0011 000 000000000      ; 设置初始位置,PC = x30000101 001 001 1 00000    ; R1 <- 0 该寄存器用来记录1的个数
0001 010 001 1 00001    ; R2 <- 1 该寄存器用来判断循环次数
0001 010 010 1 01111    ; R2 <- R2 + 15 分两次进行赋值,共16次0010 011 011111100		; R3 <- *(x3100) 将待测数据放进R3;循环
0000 011 000000001		; R3 >= 0 ? 判断R3符号位是否为0,是则跳过下一句
0001 001 001 1 00001	; R1 <- R1 + 1 更新R1的值
0001 010 010 1 11111	; R2 <- R2 - 1 
0000 010 000000010		; R2 == 0 ? 判断是否结束?如果R2为0则结束
0001 011 011 0 00011	; R3 <- R3 << 1
0000 111 111111010		; 向回跳转,循环继续0011 001 011110110		; 将R1的结果存储至x3101

3. 实验过程和结果

首先用LC3 Edit编辑好上述代码,然后生成obj文件,如图所示,没有发现错误。

在这里插入图片描述
用LC3模拟器装载之。
在这里插入图片描述
x3100处写入输入数据,然后执行。最后在x3101处查看结果。在此我使用了四组测试数据测试。

样例1:输入15(x000F)

在这里插入图片描述
结果如图:
在这里插入图片描述
可见输入数据的补码有4个“1”,这是正确的。

样例2:输入642(x0282)

在这里插入图片描述
结果如图:

在这里插入图片描述
可见输入数据的补码有3个“1”,这是正确的。

样例3:输入0(x0000)

在这里插入图片描述
结果如图:
在这里插入图片描述

样例4:输入-100(xFF9C)

在这里插入图片描述
结果如图:
在这里插入图片描述
可见输入数据的补码中有12个“1”,这依然是正确的。


http://www.ppmy.cn/news/80594.html

相关文章

【数据结构】树的认识

一个人的未来不是预测出来的&#xff0c;而是创造出来的。 -- 亚当詹姆斯目录 &#x1f341;前言&#xff1a; &#x1f340;一.什么是树&#xff1f; &#x1f351;二.树有什么用&#xff1f; ❤️1. 数据库 &#x1f9e1;2. 文件系统 &#x1…

分享一些冷门好用的网站和软件

分享一&#xff1a;UZER UZER是一个功能强大的云端应用空间&#xff0c;可以帮助您将所有的文件和应用程序都集中在一个地方&#xff0c;让您随时随地轻松访问。 以下是它的主要特点&#xff1a; 云存储&#xff1a;UZER提供大量的云存储空间&#xff0c;让您可以安全地存储…

【MySQL】- 01 MySQL范式

MySQL系列第一篇 后续大概有20篇左右&#xff0c;包含基础架构、强化、优化原理、进阶等等模块 MySQL范式 Mysql数据库范式第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09;巴斯-科德范式&#xff08;BCNF&#x…

深入解析Linux C/C++ 编程中的内存泄漏问题

深入解析Linux C/C 编程中的内存泄漏问题 I. 前言 (Introduction)1.1 文章目的与内容概述 (Purpose and Overview of the Content)1.2 重要性和实用性的说明 (Significance and Practicality Explanation)1.3 数据结构与内存泄漏的基本概念 (Basic Concepts of Data Structure …

Leetcode 399. 除法求值

Leetcode 399. 除法求值题目 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件&#xff0c;其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每个Ai 或 Bi 是一个表示单个变量的字符串。另有一些以数组 queries 表示的问题&am…

知识积累(1)

&#xff08;1&#xff09; 当您在Git中看到消息 "HEAD is now at 1343ccb FAB-17419 Fix off_chain_data sample error (#146)" 时&#xff0c;这是Git告知您当前所在的分支和最新的提交哈希。 这条消息通常出现在使用Git命令后&#xff0c;如git pull或git check…

Java形参和返回值

8 形参和返回值 8.1 类名作为形参和返回值 类名作为形参,需要的是该类的对象类名作为返回值,返回值的是该类的对象Cat类package ceshi;public class Cat{public void eat() {System.out.println

CFS三层内网靶机渗透

目录 一、靶场框架 靶场搭建&#xff1a; 二、渗透过程 三、总结 靶场介绍&#xff1a; 三层内网靶场&#xff0c;共有三个网段&#xff0c;分别为75网段&#xff08;公网网段&#xff09;、22网段&#xff08;内网&#xff09;、33网段&#xff08;内网&#xff09; 靶…