最近想看计算机方面的经典教材《计算机系统概论》, 但是它上面的实例全部是在 LC3 仿真器环境下编写的。要学习需要首先安装 LC3 simulator 。

安装 lc3 仿真器的方法:
1. 到官网下载 lc3 模拟器和 lc3 编译器(网址:http://highered.mheducation.com/sites/0072467509/student_view0/lc-3_simulator_lab_manual.html)。
下载解压缩后,我将其放在 /home/david/Public/LC3_simulator目录下。下载下来的都是源码文件,我们需要做的就是手动编译下。
2. 命令行切换到 /home/david/Public/LC3_simulator/lc3tools 目录下, 根据README描述,安装模拟器需要gcc、flex、wish这三个组件。其实Ubuntu
自带了 gcc 和 wish, 只需要安装 flex 即可。那么 sudo apt install flex 安装即可。
3. 输入 ./configure
4. 用 gedit 打开 Makefile 文件,找到一句“OS_SIM_LIBS = -lcurses”,把其中的“-lcurses”删掉后保存。
5. 回到终端, 输入 make 编译成功。 终端中输入 ./lc3sim 即可打开模拟器。
6. 模拟器安装完成了,下面就是编译器了。cd ../lcc-1.3 来到编译器的目录。同样是阅读README文件,输入 ./configure 提示权限不足,用 sudo ./configure 还是不行,这时我们需要强制使用sh来运行这个脚本。完整的命令为:sudo sh ./configure。(出现上述问题的原因是那个configure脚本没有加上可执行的权限,所以我们需要sudo sh来强制让它执行。解决办法为:先输入chmod +x configure,然后就可以正常以./configure的方式来执行了。)输入账户密码后便可以了。接下来输入“make”和“make install”来编译源码并安装。
7. 安装结束后,二进制可执行文件会存放在该目录下/install/的文件夹中,其中的lcc便是编译器的主程序。它同样是一个命令行程序,不带参数输入./lcc便可以看到用法说明。
8. 试着把一个 C 程序翻译成LC-3 汇编指令:
用 gedit 编写 C 程序:

int main()
{
printf("Hello, world! \n");
return 0;
}

保存为 test.c 文件。
在终端切换到 install目录下,执行:./lcc test.c, 会在同层目录下自动生成 a.asm 文件,打开之后发现文件居然这么长。。。
以下是自动编译成的 LC-3 汇编指令:

.Orig x3000
INIT_CODE
LEA R6, #-1
ADD R5, R6, #0
ADD R6, R6, R6
ADD R6, R6, R6
ADD R6, R6, R5
ADD R6, R6, #-1
ADD R5, R5, R5
ADD R5, R6, #0
LD R4, GLOBAL_DATA_POINTER
LD R7, GLOBAL_MAIN_POINTER
jsrr R7
HALTGLOBAL_DATA_POINTER .FILL GLOBAL_DATA_START
GLOBAL_MAIN_POINTER .FILL main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;main;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main
ADD R6, R6, #-2
STR R7, R6, #0
ADD R6, R6, #-1
STR R5, R6, #0
ADD R5, R6, #-1ADD R6, R6, #-1
ADD R7, R4, #3
ADD R6, R6, #-1
STR R7, R6, #0
ADD R0, R4, #1
LDR R0, R0, #0
jsrr R0
LDR R7, R6, #0
ADD R6, R6, #1
ADD R7, R4, #2
ldr R7, R7, #0
lc3_L1_/home/david/Desktop/test
STR R7, R5, #3
ADD R6, R5, #1
LDR R5, R6, #0
ADD R6, R6, #1
LDR R7, R6, #0
ADD R6, R6, #1
RET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;    void printf(const char *format, ...)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

PRINTF_PERCENT .FILL -37
PRINTF_C .FILL -99
PRINTF_D .FILL -100
PRINTF_S .FILL -115
PRINTF_B .FILL -98
PRINTF_O .FILL -111
PRINTF_X .FILL -120
PRINTF_ASCII .FILL 48         ;postive ascii value of '0'
.FILL 49
.FILL 50
.FILL 51
.FILL 52
.FILL 53
.FILL 54
.FILL 55
.FILL 56
.FILL 57
.FILL 65        ;A
.FILL 66
.FILL 67
.FILL 68
.FILL 69
.FILL 70
PRINTF_MINUS .FILL 45
PRINTF_BUF .BLKW 18lc3_printf
ADD R6, R6, #-2
STR R7, R6, #0        ;return address
ADD R6, R6, #-1
STR R5, R6, #0
ADD R5, R6, #-1ADD R6, R6, #-1
STR R4, R6, #0ADD R5, R5, #4        ;cheating with the bp (no longer bp)
LDR R4, R5, #0        ;got addr of format string
PRINTF_LOOP    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LDR R0, R4, #0ADD R0, R0, #0        ;End of string? (0x0000)
BRz PRINTF_DONEADD R2, R0, #0
LD R1, PRINTF_PERCENT
ADD R2, R2, R1
BRnp PRINTF_CHAR        ADD R4, R4, #1
LDR R0, R4, #0
;is it %c?
ADD R2, R0, #0
LD R3, PRINTF_C
ADD R2, R2, R3
BRnp PRINTF_CHECKSTR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%c
ADD R5, R5, #1
LDR R0, R5, #0PRINTF_CHAR
OUTADD R4, R4, #1
BRnzp PRINTF_LOOPPRINTF_CHECKSTR
;is it %s?
ADD R2, R0, #0
LD R7, PRINTF_S
ADD R2, R2, R7
BRnp PRINTF_CHECKDEC        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%sADD R5, R5, #1
LDR R0, R5, #0
PUTSADD R4, R4, #1
BRnzp PRINTF_LOOPPRINTF_CHECKDEC
;is it %d?
ADD R2, R0, #0
LD R7, PRINTF_D
ADD R2, R2, R7
;BRnp PRINTF_ERROR
BRnp PRINTF_CHECKHEXAND R2, R2, #0
ADD R2, R2, #-10        ;going to divide by 10 by using sub loop
BRnzp PRINTF_NUMPRINTF_CHECKHEXADD R2, R0, #0
LD R7, PRINTF_X
ADD R2, R2, R7
BRnp PRINTF_CHECKOCTAND R2, R2, #0
ADD R2, R2, #-16        ;going to divide by 10 by using sub loop
BRnzp PRINTF_NUMPRINTF_CHECKOCTADD R2, R0, #0
LD R7, PRINTF_O
ADD R2, R2, R7
BRnp PRINTF_CHECKBINAND R2, R2, #0
ADD R2, R2, #-8        ;going to divide by 10 by using sub loop
BRnzp PRINTF_NUMPRINTF_CHECKBINADD R2, R0, #0
LD R7, PRINTF_B
ADD R2, R2, R7
BRnp PRINTF_ERRORAND R2, R2, #0
ADD R2, R2, #-2        ;going to divide by 10 by using sub loop
;BRnzp PRINTF_NUM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%d
PRINTF_NUMLEA R7, PRINTF_BUF
ADD R7, R7, #15
ADD R7, R7, #1 ;AND R2, R2, #0
;ADD R2, R2, #-10        ;going to divide by 10 by using sub loopADD R5, R5, #1            ;acquire the binary number
LDR R0, R5, #0ADD R0, R0, #0
BRzp PRINTF_DECPOS NOT R0, R0                ;make num positive for sub loop
ADD R0, R0, #1PRINTF_DECPOSAND R3, R3, #0
ADD R3, R3, #-1PRINTF_DIVLOOP
ADD R3, R3, #1            ;num/10
ADD R0, R0, R2            ;R0 = num % 10 - 10
BRzp PRINTF_DIVLOOPADD R3, R3, #0
BRz PRINTF_LASTDIGIT;LD R1, PRINTF_ASCII
;ADD R1, R1, R0
;NOT R2, R2
;ADD R1, R1, R2
;ADD R1, R1, #1
;NOT R2, R2
;;;;;ADD R1, R1, #10
;STR R1, R7, #0
;ADD R7, R7, #-1            ;stored ascii value of one digitLEA R1, PRINTF_ASCII
ADD R1, R1, R0
NOT R2, R2
ADD R1, R1, R2
ADD R1, R1, #1
NOT R2, R2
LDR R1, R1, #0
STR R1, R7, #0
ADD R7, R7, #-1            ;stored ascii value of one digitADD R0, R3, #0            ;num/10

BRnzp PRINTF_DECPOSPRINTF_LASTDIGIT;LD R1, PRINTF_ASCII
;ADD R1, R1, R0
;ADD R1, R1, #10
;STR R1, R7, #0LEA R1, PRINTF_ASCII
ADD R1, R1, R0
NOT R2, R2
ADD R1, R1, R2
ADD R1, R1, #1
NOT R2, R2
LDR R1, R1, #0
STR R1, R7, #0            ;stored ascii value of highest order digit

LDR R0, R5, #0
ADD R0, R0, #0
BRzp PRINTF_DECSTRINGLD R0, PRINTF_MINUS        ;num was negative
ADD R7, R7, #-1
STR R0, R7, #0            ;stored ascii value negative sign

PRINTF_DECSTRING        ;print the calculated string
ADD R0, R7, #0
PUTSADD R4, R4, #1
BRnzp PRINTF_LOOPPRINTF_ERROR
PRINTF_DONELDR R4, R6, #0        ;restore R4
ADD R6, R6, #1LDR R5, R6, #0        ;restore bp
ADD R6, R6, #1LDR R7, R6, #0        ;restore ret addr
ADD R6, R6, #1RETGLOBAL_DATA_START
L1_/home/david/Desktop/test .FILL lc3_L1_/home/david/Desktop/test
printf .FILL lc3_printf
L3_/home/david/Desktop/test .FILL #0
L2_/home/david/Desktop/test .STRINGZ "Hello, world! \n"
.END

转载于:https://www.cnblogs.com/dave-developer/p/6142708.html

LC3 仿真器的安装和使用相关推荐

  1. 【计算机系统1 】1 LC-3仿真器安装和使用

    目录 碎碎念 目的与要求 内容与方法 步骤与过程 结论或体会 碎碎念 比起同学期跳级的计系2和算法,这课真的爽歪歪,没什么太鸡贼的设计.不过真心学完再搞计系2舒服点. 目的与要求 (1)掌握处理器仿真 ...

  2. 【计算机系统】LC-3仿真器安装和使用

    代码:Github仓库地址 实验目的: 掌握处理仿真工具LC-3软件的安装和使用方法. 学会在LC-3仿真环境下编辑程序和转换为可执行目标程序的方法. 学会在LC-3仿真环境下运行和调试程序的方法. ...

  3. 计算机系统 实验一 LC-3仿真器安装和使用

    这里写自定义目录标题 深 圳 大 学 实 验 报 告 课程名称: 计算机系统(1) 实验项目名称: 实验一 LC-3仿真器安装和使用 学院: 计算机与软件学院 专业: 计算机科学与技术 指导教师: 张 ...

  4. JLINK仿真器与ST-LINK仿真器的安装与配置.pdf

    JLINK仿真器与ST-LINK仿真器的安装与配置.pdf 工欲善其事,......stm32的开发环境搭建 观看地址  说到仿真器,首先要了解一下JTAG. JTAG协议 JTAG(Joint Te ...

  5. 华为云计算HCIE之oceanstor仿真器的安装教程

    华为云计算HCIE之oceanstor仿真器的安装教程 一.安装VM虚拟机 1.选择workstation版本 2.选择安装系统版本 3.选择安装位置和虚拟机名称 4.选择cpu内核数量 5.选择内存 ...

  6. CCS6软件及仿真器驱动安装

    1.CCS6软件获取(此文章以CCS6.1.3版本为例) (1)TI的官网:http://www.ti.com/tools-software/ccs.html (2)个人下载链接(CCS6.1.3安装 ...

  7. 51单片机 仿真器驱动安装失败

    在安装一个硬件设备的驱动时提示信息,文件的哈希值不在指定的文件或目录,文件可能已损坏. 安装一个硬件设备的驱动时提示消息身份验证代码 (MAC) 哈希函数通常与数字签名一起用于对数据进行签名,而消息检 ...

  8. 易灵思下载器EFINIX FPGA高速JTAG编程线USB仿真器驱动安装详细使用步骤

    易灵思EFINIX USB下载器驱动安装详细步骤 易灵思EFINX是优秀的国产FPGA公司之一,下面是下载器的驱动安装详细步骤.如果不会使用可以跟着步骤操作即可. 一.驱动安装 当第一次使用时候下载器 ...

  9. rtl仿真器-incisive安装和测试

    需要的文件 安装文件 incisive : http://pan.baidu.com/s/1dFC9KZn 提取码 k3cb path: license: IScape: 安装的图形界面 IScape ...

最新文章

  1. QIIME 2用户文档. 17序列双端合并read-joining(2018.11)
  2. Microsoft Bot Framework 上手
  3. 【LeetCode】455. 分发饼干(图解)
  4. Mac 系统如何实现挂载NTFS文件系统
  5. hdu 1028 Ignatius and the Princess III 母函数入门
  6. k2677场效应管参数引脚_共射极放大电路,场效应管放大电路,运算放大电路
  7. 33.JAVA编程思想——JAVA IO File类
  8. sublime text3常用的一些快捷键
  9. 7649:我家的门牌号
  10. php$_GET的作用,PHP-$_GET和$_POST不起作用
  11. 测试人生 | 三十而已,何需惧怕 年薪40W+涨薪幅度超40%
  12. log4j 和slf4j的比较
  13. 图解深度学习-梯度下降法优化器可视化(SGD, Momentum,Adam, Adagrad and RMSProp)
  14. Oracle-11g数据库安装教程
  15. GitHub 上 10 个顶级开源项目,从基础到源码统统帮你搞定
  16. 我的知识星球 -【达叔与他的朋友们】程序员
  17. DolphinDB Database丨交易回测系列一:技术信号回测
  18. 什么明星有计算机等级证,明星CP名也分等级?朱一龙王一博还好,看到胡一天:太有才了...
  19. 新CSDN文章转成PDF、打印(去空白)
  20. 一个男人的品位在于选择妻子

热门文章

  1. arduino loar_「雕爷学编程」Arduino动手做(15)---手指侦测心跳传感器
  2. 数据库架构设计——数据库选型
  3. MFC中得到2个SYSTEMTIME时间差的函数
  4. 家用空气净化器除甲醛什么品牌好 能除甲醛吗
  5. 周末了,看,首富出门遛狗。
  6. 小白带你学安卓——初识android
  7. HDFS文件系统的基础理论,HDFS工作者和管理者的分配,HDFS文件存储容量的理解
  8. mac录屏如何把声音录进去?
  9. 用Kivy写一个安卓app
  10. 由验证控件引起的IE的超级爆笑BUG