目录
碎碎念
比起同学期跳级的计系2和算法,这课真的爽歪歪,没什么太鸡贼的设计。不过真心学完再搞计系2舒服点。
目的与要求
(1)掌握处理器仿真工具LC-3软件的安装和使用方法。
(2)学会在LC-3仿真环境下编辑程序和转换成可执行目标程序的方法 。
(2)学会在LC-3仿真环境下运行和调试程序的方法 。
内容与方法
利用提供的安装软件包和软件使用说明文档,完成以下试验内容:
(1)安装LC-3仿真器
(2)利用LC3EDIT输入机器代码程序(0/1模式)并创建可执行目标程序。
(3)利用LC3EDIT输入机器代码程序(hex模式)并创建可执行目标程序。
(4)利用LC3EDIT输入汇编代码程序并创建可执行目标程序。
(5)利用仿真器运用对应目标程序。
(6)学习和掌握断点,单步执行等调试方法和手段。
步骤与过程
(2)利用LC3EDIT输入机器代码程序(0/1模式)并创建可执行目标程序。
①打开LC3EDIT编辑器输入代码并保存为后缀.bin的二进制文件(图1)
图表 1 编辑二进制文件并保存
②编译二进制文件(图2)
图表 2 编译二进制文件sample1.bin example1.bin
(3)利用LC3EDIT输入机器代码程序(hex模式)并创建可执行目标程序。
①新建文件并编写保存编译后缀为.hex的16进制文件(图3)
图表 3 新建编写保存编译16进制文件
(4)利用LC3EDIT输入汇编代码程序并创建可执行目标程序。
①汇编代码保存为.asm后缀(图4)
图表 4 汇编代码文件后缀asm
②编译(图5)
图表 5 编译
(5)利用仿真器运用对应目标程序。
1.sample
①打开LC3 Simulator运行软件,导入刚才编译成功的二进制文件(图6)
图表 6 导入可执行文件
②载入后界面,sample1求和10数(图7)
图表 7 载入后界面
③加载数据(十个数字)到内存,跳转至地址x3100设置对应的值(图8)
图表 8 加载数据
④为了方便将10个寄存器的值设置为0-9 (x0000-x0009),程序结果应该为45 (x002D) (图9)
图表 9 将10个数设置为0-9
⑤跳转至程序起始地址并设置断点,运行程序,寄存器R1存求和结果45,答案正确(图10)
图表 10 设置断点,运行程序
2.example1:乘法
①载入程序,设置断点,设值乘数为5和3(图11)
图表 11 example1程序设置
②运行程序结果为20,答案错误(图12)
图表 12 程序结果有误
(6)学习和掌握断点,单步执行等调试方法和手段。
①将R5重新设为3,重新回到程序其实位置x3200(图13)
图表 13
②按逐步调试,PC指向下一条指令x3201,IR存第一条指令x54A0,将R2清零。(图14)
图表 14 逐步调试1
③继续逐步调试,运行指令2,R2存5,正确;逐步调试完一个循环没有错误,直接换设置断点(图15)
图表 15 逐步调试指令2
④设置断点调试,在x3203设置断点,运行至x3203观察到R5变为2,R2变为5,状态(CC)为P(图16)
图表 16 断点调试1
⑤3次循环后,发现此时状态(CC)为Z置1,导致循环会多一次,使结果多加5,20(图17)
图表 17 错误处
⑥x3203处的指令有误,应该把BRZP改为BRP,当且仅当P=1时跳转,即第4条指令改为
0000 001 111111101 ;跳转到 location x3201 如果结果为正值(图18)
图表 18 将Z位置0
⑦保存后重新打开运行,答案正确(图19)
图表 19 修改后
3.example2
①运行程序(图20)
图表 20 example2
②结果有误(图21)
图表 21 结果有误
②是字符与数字的 转换问题,修改汇编程序(新添加的行显示为红体):
.ORIG x3000
LD R6, ASCII
LD R5, NEGASCII
TRAP x23 ;输入
ADD R1,R0,x0 ;将第一个整数传给 R0
ADD R1,R1,R5 ;将第一个 ASCII 数字转换成数值
TRAP x23 ;另一个驶入
ADD R0,R0,R5 ;将另一个 ASCII 数字转换成数值
ADD R2,R0,R1 ;将这两个整数相加
ADD R2,R2,R6 ;将和转换成 ASCII 表示
LEA R0,MESG ;载入字符串的地址
TRAP x22 ;输出字符串
ADD R0,R2,x0 ;结果传给 RO
TRAP x21 ;显示结果
HALT
ASCII .FILL x30 ;mask:转换成 ASCII
NEGASCII .FILL xFFD0 ;mask:-x30
MESG .STRINGZ "The sum of those two numbers is "
.END
④运行结果正确(图22)
图表 22 结果正确
结论或体会
通过本次实验,我学会了如何利用LC3编译和调试二进制、16进制和汇编代码程序。学会通过逐步调试、断点设置、观察寄存器数据变化的方法调试程序。以及初次接触二进制和汇编代码,初步体验利用二进制代码和汇编代码实现一个小程序的具体过程,也确实能体验到虽然机器语言编写逻辑不如高级语言直接,但其操作会更加直接,没有冗余的步骤,直接深入机器层面进行运算,会更加高效,初步了解计算机内部几种简单运算的机器操作。