代码太长,LD和LEA会取不到,注意学习JSR和RET指令!!
JSR我主要用去跳到最后面来LD了
然后就是玩家选行如果错误我直接报错了,没法输后面那个数了,这个没有去处理。
运行结果:
代码思路是:开始先吧三个ABC打出来,之后的o(石头)用循环的方式去打,所以每次减完都记录剩余石头数目; 输入行号和数字时都进行判断是否合法;打印剩余石头界面前先判断三行是否都为零,为零则结束,当前玩家赢。
代码:
.ORIG x3200
;R1读-A和-0,R2读-B,R3读-C;计算结果存到R4;R6存最后面地址的第一个,一会读char和它减就可以得到int;
JSR Tail;BRnzp Tail
BACK1 LDR R1,R6,#0 ;A
NOT R1,R1
ADD R1,R1,#1 ;取反加一
STR R1,R6,#0 ;把-A覆盖原来的A,因为寄存器不够
LDR R2,R6,#1 ;B
NOT R2,R2
ADD R2,R2,#1
LDR R3,R6,#2 ;C
NOT R3,R3
ADD R3,R3,#1
LDR R7,R6,#9 ;Char0
NOT R7,R7
ADD R7,R7,#1
STR R7,R6,#9;-0
;-----------------------------------------------------------
JSR GETRA
PUTS
LDR R0,R6,#8;ENDL;换行
OUT;换行
JSR GETRB
BACK2 PUTS
LDR R0,R6,#8;ENDL
OUT
;下面两句
JSR GETRC
BACK3 PUTS
LDR R0,R6,#8;ENDL
OUT
;以上为游戏界面的初始化状态---------------------------------------
LOOP LEA R0,P1
PUTS
LEA R0,CHOOSE
PUTS
GETC ;玩家一读数,分别与A,B,C相减,计算结果存到R4
OUT
J1 LDR R1,R6,#0 ;把-A读到R1
ADD R4,R0,R1
BRnp J2 ;看是不是A,不是就去J2
GETC ;读数,看移除几个,还要减0
OUT ;直接回显
LDR R1,R6,#9 ;把-0读到R1
ADD R0,R0,R1;char->int 减0
BRn E ;*的处理:如果减的是个负数呢!
NOT R0,R0;先判断是否合法吧,R5存被减数即石头数,计算结果存到R4
ADD R0,R0,#1
LD R5,RAn; R5存被减数即石头数
ADD R4,R5,R0;
BRn E ;如果减完为负数,那么就报错
ST R4,RAn;正数的话就覆盖原来的值
BRnzp PRINT1;
J2 ADD R4,R0,R2
BRnp J3
GETC ;读数,看移除几个,还要减0
OUT ;直接回显
LDR R1,R6,#9 ;把-0读到R1
ADD R0,R0,R1;char->int
BRn E
NOT R0,R0;先判断是否合法吧,R5存被减数即石头数,计算结果存到R4
ADD R0,R0,#1
LD R5,RBn; R5存被减数即石头数
ADD R4,R5,R0;
BRn E ;如果减完为负数,那么就报错
ST R4,RBn;正数的话就存起来
BRnzp PRINT1;
J3 ADD R4,R0,R3
BRnp E ;还不是的话就报错!!!
GETC ;读数,看移除几个,还要减0
OUT ;直接回显
LDR R1,R6,#9 ;把-0读到R1
ADD R0,R0,R1;char->int
BRn E
NOT R0,R0;先判断是否合法吧,R5存被减数即石头数,计算结果存到R4
ADD R0,R0,#1
LD R5,RCn; R5存被减数即石头数
ADD R4,R5,R0;
BRn E ;如果减完为负数,那么就报错
ST R4,RCn;正数的话就存起来
BRnzp PRINT1;
E LD R0,ENDL;换行
OUT;换行
JSR GETER
PUTS
LD R0,ENDL;换行
OUT;换行
BRnzp LOOP;再次进行输入
;打印界面
PRINT1 LDR R0,R6,#8;ENDL;换行
OUT;换行
OUT;先换两行
WIN1 LD R0,RAn
BRp PS1
LD R0,RBn
BRp PS1
LD R0,RCn
BRp PS1
LEA R0,P1
PUTS
JSR GETW
PUTS
BRnzp EXIT
PS1 LEA R0,RAname
PUTS
LD R4,RAn
A1L BRz PAE1
LD R0,o
OUT
ADD R4,R4,#-1
BRp A1L
PAE1 LD R0,ENDL;换行
OUT;换行
LEA R0,RBname
PUTS
LD R4,RBn
B1L BRz PBE1
LD R0,o
OUT
ADD R4,R4,#-1
BRp B1L
PBE1 LD R0,ENDL;换行
OUT;换行
LEA R0,RCname
PUTS
LD R4,RCn
C1L BRz PCE1
LD R0,o
OUT
ADD R4,R4,#-1
BRp C1L
PCE1 LD R0,ENDL;换行
OUT;换行
;P2就是和P1一样的操作
Player2 LEA R0,P2
PUTS
LEA R0,CHOOSE
PUTS
GETC ;玩家一读数,分别与A,B,C相减,计算结果存到R4
OUT
Jn1 LDR R1,R6,#0 ;把-A读到R1
ADD R4,R0,R1
BRnp Jn2;看是不是A,不是就去J2
GETC ;读数,看移除几个,还要减0
OUT ;直接回显
LDR R1,R6,#9 ;把-0读到R1
ADD R0,R0,R1;char->int
BRn E
NOT R0,R0;先判断是否合法吧,R5存被减数即石头数,计算结果存到R4
ADD R0,R0,#1
LD R5,RAn; R5存被减数即石头数
ADD R4,R5,R0;
BRn En ;如果减完为负数,那么就报错
ST R4,RAn;正数的话就覆盖原来的值
BRnzp PRINT2;
Jn2 ADD R4,R0,R2
BRnp Jn3
GETC ;读数,看移除几个,还要减0
OUT ;直接回显
LDR R1,R6,#9 ;把-0读到R1
ADD R0,R0,R1;char->int
BRn E
NOT R0,R0;先判断是否合法吧,R5存被减数即石头数,计算结果存到R4
ADD R0,R0,#1
LD R5,RBn; R5存被减数即石头数
ADD R4,R5,R0;
BRn En ;如果减完为负数,那么就报错
ST R4,RBn;正数的话就存起来
BRnzp PRINT2;
Jn3 ADD R4,R0,R3
BRnp En ;还不是的话就报错!!!
GETC ;读数,看移除几个,还要减0
OUT ;直接回显
LDR R1,R6,#9 ;把-0读到R1
ADD R0,R0,R1;char->int
BRn E
NOT R0,R0;先判断是否合法吧,R5存被减数即石头数,计算结果存到R4
ADD R0,R0,#1
LD R5,RCn; R5存被减数即石头数
ADD R4,R5,R0;
BRn En ;如果减完为负数,那么就报错
ST R4,RCn;正数的话就存起来
BRnzp PRINT2;
En LD R0,ENDL;换行
OUT;换行
LEA R0,ERROR
PUTS
LD R0,ENDL;换行
OUT;换行
BRnzp Player2;再次进行输入
PRINT2 LDR R0,R6,#8;ENDL;换行
OUT;换行
OUT
WIN2 LD R0,RAn
BRp PS2
LD R0,RBn
BRp PS2
LD R0,RCn
BRp PS2
LEA R0,P2
PUTS
LEA R0,W
PUTS
BRnzp EXIT
PS2 LEA R0,RAname
PUTS
LD R4,RAn
A2L BRz PAE2
LD R0,o
OUT
ADD R4,R4,#-1
BRp A2L
PAE2 LD R0,ENDL;换行
OUT;换行
LEA R0,RBname
PUTS
LD R4,RBn
B2L BRz PBE2
LD R0,o
OUT
ADD R4,R4,#-1
BRp B2L
PBE2 LD R0,ENDL;换行
OUT;换行
LEA R0,RCname
PUTS
LD R4,RCn
C2L BRz PCE2
LD R0,o
OUT
ADD R4,R4,#-1
BRp C2L
PCE2 LD R0,ENDL;换行
OUT;换行
BRnzp LOOP
Tail LEA R6,A
RET;BRnzp BACK1
GETRA LEA R0,RA
RET
GETRB LEA R0,RB
RET
GETRC LEA R0,RC
RET
GETER LEA R0,ERROR
RET
GETW LEA R0,W
RET
EXIT HALT
;
A .FILL x41 ;0
B .FILL x42 ;1
C .FILL x43 ;2
RAn .FILL #3 ;3
RBn .FILL #5 ;4
RCn .FILL #8 ;5
o .FILL x6F ;6
ZERO .FILL x0 ;7
ENDL .FILL x0A ;8
Char0 .FILL x30 ;9
P1 .STRINGZ "Player 1" ;
P2 .STRINGZ "Player 2" ;
CHOOSE .STRINGZ ", choose a row and number of rocks: " ; (9
RA .STRINGZ "ROW A: ooo" ; (37
RAname .STRINGZ "ROW A: " ; (7
RB .STRINGZ "ROW B: ooooo" ; (39
RBname .STRINGZ "ROW B: " ; (7
RC .STRINGZ "ROW C: oooooooo" ; (42
RCname .STRINGZ "ROW C: " ; (8
ERROR .STRINGZ "Invalid move. Try again."
W .STRINGZ " Wins."
.END