计算机系统(1)实验四 点与盒子游戏

前言 

这个实验确实难度不小,但是还是比四子棋简单一点点。先用了C++写了这个游戏的.cpp文件,后面按照C++的一步步写的。

里面比较难的就是string[][]的实现了,费了不少时间,不过代码整体确实是比直接写要来的整洁。

还有就是香风智乃天下第一)

下面是实验报告:

实验报告

实验目的与要求

用LC-3的汇编指令,编写点与盒子游戏的LC-3版本。

点和盒子是一个双人游戏,在一个可变的点网格上玩。对于这个游戏,游戏板是一个4×4的点网格,两个玩家用两个符号表示:1和2。

相关规则如下: 玩家1总是先开始的。 每个玩家轮流在两个相邻的点之间画一条水平或垂直的线。 玩家不能在两个已经用一条线连接起来的点之间画出一条线。 如果一个玩家通过画一个盒子的第四边来完成一个盒子),玩家在盒子里写下他的数字(1或2),就可以画另一条线。

当所有相邻的点都用水平或垂直线连接时,游戏结束。 在游戏结束时拥有最多盒子的玩家获胜。 游戏板 游戏板是一个4×4的点网格,由ASCII字符“*”(星号,ASCII代码x002A)表示。垂直线由ASCII字符“|”表示(管道,ASCII代码x007C)表示,水平线用ASCII字符‘-表示。

需要通过汇编指令判断具体需完成的内容(连线、围成盒子),并判断二者的具体得分和是否推出。

实验内容

用LC-3编写游戏程序。

游戏板的初始数据结构使用伪指令存储在内存中。通过伪指令每一行一个字符串。在程序执行过程中,通过修改这些内存位置的内容,以反映每个玩家的移动,并判断具体的情况并执行具体的内容(如围成盒子并写下自己的玩家编号),直到玩家输入Q前无限在二人间循环询问。

实验步骤与过程

思路

  1. 无限循环,则编写一个大循环板块,使得其在接受到退出指令‘Q’前无条件循环,编写正常输出板块在循环开始时输出展示目前游戏板
  2. 需要玩家进行输入,编写输入和判断输入板块,判断指‘Q’并判断玩家输出是否合法
  3. 为不合法的输出变成错误输出板块,并在板块结束后重新回到大循环开始,同时
  4. 如果输入合法,为对对应字符进行判断,编写转化数字板块将输入的ASCLL字母和数字转化为具体的数字(也即str[i][j]中的i与j),再通过转化地址板块获取到该输入所对应字符的地址
  5. 判读字符所在处是否正确(盒子内部无法被输入),编写判断字符所在处是否正确板块,如果所在处正确,需判断字符所在处是否已经被占用(如‘*’、‘|’‘-’)等,编写判断字符是否占用板块。判断输入失败即进入错误输入板块
  6. 如果以上判断都正确,则需通过当前具体位置确定要用‘-’或‘|’,并更改字符。编写更改字符板块。
  7. 最后遍历各大盒子,如盒子未被占用且满足条件则更改盒子地址所在字符为当前玩家并记录双方分数,编写判断盒子形成、填写与计分板块。
  8. 最后通过使用JSR、RET指令以及辅助其运转的ST R7 TEMPSTONER7、LD R7 TEMPSTONER7、ST R7 TEMPSTONER71、LD R7 TEMPSTONER71指令连接各个子程序
  9. 进行调试,观察各板块及其连接是否正常,完成实验。

代码主体

.ORIG x3000
LOOP
    AND R0,R0,0;
    AND R2,R2,0;
    AND R4,R4,0;
    AND R5,R5,0;
    AND R6,R6,0;
    AND R7,R7,0;
    JSR OUTPUT
    ST R0,TEMPSTONER0
    IN
    ;R1作为char a R2作为char b
    ;R4作为anum R5作为bnum
    ADD R1,R0,0;输入a
    LD R3,Q
    NOT R3,R3;
    ADD R3,R3,1;
    ADD R3,R1,R3;判断Q
    BRZ EN
    LD R3,A
    NOT R3,R3;
    ADD R3,R3,1;
    ADD R3,R1,R3;判断>=A
    BRN WRONGOUTPUT
    LD R3,G
    NOT R3,R3;
    ADD R3,R3,1;
    ADD R3,R1,R3;判断<=G
    BRP WRONGOUTPUT
    JSR ANUMSUB
    ST R4 ANUM ;存结果ANUM
    IN
    ADD R2,R0,0;输入 b
    LD R3,ASCLL0
    NOT R3,R3;
    ADD R3,R3,1;
    ADD R3,R2,R3;判断>=0
    BRN WRONGOUTPUT
    LD R3,ASCLL6
    NOT R3,R3;
    ADD R3,R3,1;
    ADD R3,R2,R3;判断<=6
    BRP WRONGOUTPUT
    JSR BNUMSUB
    ST R5,BNUM ;存结果BNUM
    JSR JUDGE ;判断是否符合输入情况并更改
    JSR JUDGESCORE ;判断四个小格子并更改其内容
    ;JSR OUTPUT
    LD R0,TEMPSTONER0
    LD R3,PLAYWHO ;更改输入玩家
    ADD R3,R3,-1;
    BRZ CHANGTO2
    AND R3,R3,0;
    ADD R3,R3,1;
    ST R3,PLAYWHO
    BRNZP LOOP
CHANGTO2
    ADD R3,R3,0;
    ADD R3,R3,2;
    ST R3,PLAYWHO
    BRNZP LOOP
ANUMSUB
    ST R7,TEMPSTONER7
    ST R3,TEMPSTONER3
    LD R3,A
    NOT R3,R3;
    ADD R3,R3,1;
    ADD R4,R1,R3;
    LD R3,TEMPSTONER3
    LD R7,TEMPSTONER7
    RET
BNUMSUB
    ST R7,TEMPSTONER7
    ST R3,TEMPSTONER3
    LD R3,ASCLL0
    NOT R3,R3;
    ADD R3,R3,1;
    ADD R5,R2,R3;
    LD R3,TEMPSTONER3
    LD R7,TEMPSTONER7
    RET
JUDGE
    ST R7,TEMPSTONER71
    LD R0,ANUM ;
    LD R1,BNUM ;
    LEA R2,STRINGS0 ;
    ADD R2,R2,-9
LOOPADD
    ADD R2,R2,9;
    ADD R1,R1,-1;
    BRZP LOOPADD
    ADD R2,R2,R0;
    ;R2变为具体的str[bnum][anum]
    AND R1,R1,0;
    LDR R0,R2,0;
    JSR HAVEBEUSE
    LD R0,ANUM ;
    AND R0,R0,1;
    BRZ NOWRONGPOS
    LD R0,BNUM ;
    AND R0,R0,1;
    BRZ NOWRONGPOS
    BRNZP WRONGOUTPUT
NOWRONGPOS
    LD R0,ANUM
    AND R0,R0,1;
    BRP CHANGESUB
    LD R0,BNUM
    AND R0,R0,1;
    BRP CHANGEVER
CHANGEVER
    LD R4,ASCLLVER
    STR R4,R2,0;
    BRNZP CHANGEEND
CHANGESUB
    LD R4,ASCLLSUB ;
    STR R4,R2,0;
CHANGEEND
    LD R7,TEMPSTONER71
    RET
JUDGESCORE
    ST R0,TEMPSTONER0
    ST R1,TEMPSTONER1
    ST R2,TEMPSTONER2
    ST R3,TEMPSTONER3
    ST R4,TEMPSTONER4
    ST R7,TEMPSTONER71
    AND R0,R0,0;
    AND R1,R1,0;
    AND R2,R2,0;
    AND R3,R3,0;
    AND R4,R4,0;
    ADD R0,R0,-1 ;i
    ADD R1,R1,-1 ;j
SCROELOOPOUT
    AND R1,R1,0;
    ADD R1,R1,-1;
    ADD R0,R0,2;
    AND R4,R4,0;
    ADD R4,R4,6;
    NOT R4,R4;
    ADD R4,R4,1;
    ADD R4,R4,R0;
    BRZP SCROEEND
SCROELOOPIN
    ADD R1,R1,2;
    AND R4,R4,0;
    ADD R4,R4,6;
    NOT R4,R4;
    ADD R4,R4,1;
    ADD R4,R4,R1;R4为临时的6存储
    BRZP SCROELOOPOUT
    LEA R2,STRINGS0 ;
    JSR LOOPADDS ;
    LD R4,ASCLLSPACE ;
    NOT R4,R4;
    ADD R4,R4,1;
    LDR R3,R2,0;
    ADD R4,R3,R4;if(str[i][j]==' ')
    BRNP SCROELOOPIN
    ;if(str[i-1][j]=='-'&&str[i+1][j]=='-'&&str[i][j-1]=='|'&&str[i][j+1]=='|')
    LDR R3,R2,1;
    LD R4,ASCLLVER ;
    NOT R4,R4;
    ADD R4,R4,1;
    ADD R4,R4,R3;
    BRNP SCROELOOPIN
    LDR R3,R2,-1;
    LD R4,ASCLLVER ;
    NOT R4,R4;
    ADD R4,R4,1;
    ADD R4,R4,R3;
    BRNP SCROELOOPIN
    LDR R3,R2,9;
    LD R4,ASCLLSUB ;
    NOT R4,R4;
    ADD R4,R4,1;
    ADD R4,R4,R3;
    BRNP SCROELOOPIN
    LDR R3,R2,-9;
    LD R4,ASCLLSUB ;
    NOT R4,R4;
    ADD R4,R4,1;
    ADD R4,R4,R3;
    BRNP SCROELOOPIN
    LD R3,PLAYWHO ;
    LD R4,ASCLL0 ;
    ADD R3,R3,R4;
    STR R3,R2,0;
    LD R3,PLAYWHO
    AND R3,R3,1;
    BRNZ PLAY2SCOREADD
    LD R5,ASCLL0
    ADD R3,R3,R5;
    STR R3,R2,0;
    LD R4,PLAY1SCORE ;
    ADD R4,R4,1;
    ST R4,PLAY1SCORE
    BRNZP SCROELOOPIN
PLAY2SCOREADD
    LD R5,ASCLL0
    ADD R5,R5,2;
    ADD R3,R3,R5;
    STR R5,R2,0;
    LD R4,PLAY2SCORE ;
    ADD R4,R4,1;
    ST R4,PLAY2SCORE ;
    BRNZP SCROELOOPIN
SCROEEND
    LD R7,TEMPSTONER71
    RET
LOOPADDS
    ST R7,TEMPSTONER7
    ST R1,TEMPSTONER1
    ADD R6,R0,0;
AGAIN
    ADD R2,R2,9;
    ADD R6,R6,-1;
    BRP AGAIN
    ADD R2,R2,R1;
    LD R7,TEMPSTONER7
    LD R1,TEMPSTONER1
    RET
HAVEBEUSE
    ST R7,TEMPSTONER7
    ST R3,TEMPSTONER3
    LD R3,ASCLLSTAR
    NOT R3,R3;
    ADD R3,R3,1;
    ADD R3,R0,R3;
    BRZ WRONGOUTPUT
    LD R3,ASCLLSUB
    NOT R3,R3;
    ADD R3,R3,1;
    ADD R3,R0,R3;
    BRZ WRONGOUTPUT
    LD R3,ASCLLVER
    NOT R3,R3;
    ADD R3,R3,1;
    ADD R3,R0,R3;
    BRZ WRONGOUTPUT
    LD R3,TEMPSTONER3
    LD R7,TEMPSTONER7
    RET
OUTPUT
    ST R0,TEMPSTONER0
    ST R7,TEMPSTONER7
    LEA R0,STRINGS0
    PUTS
    LEA R0,STRINGS1
    PUTS
    LEA R0,STRINGS2
    PUTS
    LEA R0,STRINGS3
    PUTS
    LEA R0,STRINGS4
    PUTS
    LEA R0,STRINGS5
    PUTS
    LEA R0,STRINGS6
    PUTS 
    LD R0,TEMPSTONER0
    LD R7,TEMPSTONER7
    RET    
WRONGOUTPUT
    ST R0,TEMPSTONER0
    LEA R0,WRONGOUT1
    PUTS
    LD R0,PLAYWHO
    ADD R3,R0,0;
    LD R1,ASCLL0
    ADD R0,R0,R1;
    OUT
    ST R3,PLAYWHO
    LEA R0,WRONGOUT2
    PUTS
    LD R0,TEMPSTONER0
    BRNZP LOOP
EN
    HALT
PLAYWHO .FILL X0001;
Q .FILL x0051
A .FILL X0041
G .FILL X0047;
TEMPSTONER0 .FILL X0000;
TEMPSTONER1 .FILL X0000;
TEMPSTONER2 .FILL X0000;
TEMPSTONER3 .FILL X0000;
TEMPSTONER4 .FILL X0000;
CHARA .FILL X0000;
CHARB .FILL X0000;
ANUM .FILL X0000;
BNUM .FILL X0000;
PLAY1SCORE .FILL X0000;
PLAY2SCORE .FILL X0000;
TEMPSTONER7 .FILL X0000;
TEMPSTONER71 .FILL X0000;
ASCLLSTAR .FILL X002A
ASCLLSUB .FILL X002D
ASCLLVER .FILL X007C
ASCLL0 .FILL X0030
ASCLL6 .FILL X0036
ASCLLSPACE .FILL X0020
WRONGOUT1 .STRINGZ "player"
WRONGOUT2 .STRINGZ " input are wrong! please input again\n"
STRINGS0 .STRINGZ "* * * *\n";
STRINGS1 .STRINGZ "       \n";
STRINGS2 .STRINGZ "* * * *\n";
STRINGS3 .STRINGZ "       \n";
STRINGS4 .STRINGZ "* * * *\n";
STRINGS5 .STRINGZ "       \n";
STRINGS6 .STRINGZ "* * * *\n";
.END

程序调试

1.在实验中出现地址值读取的错误,将读取地址的指令由LD改为LEA解决

2.在实验中使用转换地址板块时出现问题,通过编写备用情况地址板块解决

3.在实验中出现在A1、A3处等替换为‘-’的情况,通过更换替换字符解决。

4.在实验中出现输出的错误提示有错误,通过修改LD至LEA解决

5.在实验中出现无法判断盒子形成的情况,通过更改寻址寄存器、修改盒子判断方法解决

6.在实验中出现目前人员更改错误、填入盒子中的数与实际的操作员对不上,通过更改LOOP循环中的更改人员部分和判断盒子处更改来源(‘0’—>‘0’+player)。解决

7.在实验中出现RET指令跳转到子程序内部造成死循环的情况,通过调试程序得知是在子程序中二次或多次进入程序时会再次更改R7的值,从而使得在倒数第二个子程序的最后一个子程序后RET指令的目标地址为该子程序的内部,从而造成反复跳转至最后一个子程序入口地址的下一个地址造成死循环。通过使用多个存储地址存储各个子程序的R7值(也即RET返回的值)解决。

最后完成实验。

实验结论或体会

一、成功使用LC-3编写该游戏,代码文件已附。进一步学习了子程序和JSR、RET、TRAP的使用和其了解,也会使用LD与ST指令来在子程序中保存原先寄存器的内容和返回值等,也进一步了解了LEA的使用和类似char[][]的数组在LC-3中的寻址模式,对于LC-3的汇编语言有了更深刻的了解。

二、在汇编语言编译过程中前所未有的出现了相对偏移寻址超出了指令范围的情况,由于代码数目相对较少,故通过调配内存占量较大的字符串存储到程序末尾,避免了超出指令范围的情况。 ​

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇