Assembly 为什么我需要在这个组装游戏中转换数字
我需要用汇编语言做一个猜谜游戏 游戏要求玩家输入一个数字并与之进行比较 另一个数字集,然后告诉玩家他们的猜测是否正确 过高或过低,允许玩家不断猜测,直到他们 把号码设置好 这项工作的一个问题是: 为什么需要数字转换以及如何转换–使用网格方法- ASCII H之间的转换从十六进制转换为二进制 为什么我需要进行转换 游戏代码Assembly 为什么我需要在这个组装游戏中转换数字,assembly,mips,Assembly,Mips,我需要用汇编语言做一个猜谜游戏 游戏要求玩家输入一个数字并与之进行比较 另一个数字集,然后告诉玩家他们的猜测是否正确 过高或过低,允许玩家不断猜测,直到他们 把号码设置好 这项工作的一个问题是: 为什么需要数字转换以及如何转换–使用网格方法- ASCII H之间的转换从十六进制转换为二进制 为什么我需要进行转换 游戏代码 .data #storing data startmsg: .asciiz "I am thinking of a random number between 1 an
.data #storing data
startmsg: .asciiz "I am thinking of a random number between 1 and 100\n\n"
guessmsg: .asciiz "Enter your guess\n"
tooHigh: .asciiz "Your guess is too high.\n"
tooLow: .asciiz "\n\nYour guess is too low.\n"
wingame: .asciiz "You have guessed the number. Well done!\n\n"
.text #start of program
start:
jal random
add $t0, $zero, $a0 # store random number $a0 in $t0
li $v0, 4 # print string
la $a0, startmsg
syscall
#######################################
# Main game loop for guessing
guessing:
la $a0, guessmsg
li $v0, 4 # print string guessmsg
syscall
li $v0, 5 #read int from user
syscall
move $t1, $v0 # store input in t1
#addi $t2, $zero, 1 #t2 = 1 (guess min)
beq $t0, $t1, win # if stored int = user input, user won
addi $s0, $s0, -1 # guess used, subtract
blt $t0, $t1, goLower # if stored int < user input, guess is too high
# otherwise, guess is too low
la $a0, tooLow
li $v0, 4 # print string tooLow
syscall
# loop guessing
j guessing
#######################################
# goLower: Procedure if the user guess too high
goLower:
la $a0, tooHigh
li $v0, 4 # print tooHigh
syscall
# loop back to get another guess
j guessing
#######################################
# User won, print win and restart
win:
la $a0, wingame
li $v0, 4 #print string wingame
syscall
j start
#############################################
# LEAF PROCEDURE
# random: generate a rand number between 0 - 100
random:
li $v0, 42 # SERVICE 41 for a rand int
#addi $a0, $zero, 0 # random number >= 0
addi $a1, $zero, 100 #random number < 100
#xor $a0, $a0, $a0 # Select random generator 0
syscall # Generate random int (returns in $a0)
jr $ra
.data#存储数据
startmsg:.asciiz“我想的是一个介于1和100之间的随机数\n\n”
guessmsg:.asciiz“输入您的猜测\n”
过高:.asciiz“您的猜测过高。\n”
tooLow:.asciiz“\n\n您的猜测太低。\n”
wingame:.asciiz“您已经猜到了号码。干得好!\n\n”
.text#节目开始
开始:
日航随机
添加$t0、$0、$a0#将随机数$a0存储在$t0中
li$v0,4#打印字符串
洛杉矶$a0,开始
系统调用
#######################################
#用于猜测的主游戏循环
猜测:
洛杉矶$a0,猜猜看
li$v0,4#打印字符串
系统调用
li$v0,5#从用户处读取整数
系统调用
移动$t1,$v0#在t1中存储输入
#加上$t2,$0,1#t2=1(猜测最小值)
beq$t0,$t1,赢#如果存储int=用户输入,则用户赢
addi$s0,$s0,-1#使用猜测,减去
blt$t0,$t1,goLower#如果存储的int<用户输入,猜测值太高
#否则,猜测就太低了
洛杉矶$a0,图洛
li$v0,4#打印字符串工具
系统调用
#循环猜测
猜测
#######################################
#goLower:如果用户猜测过高,则执行此过程
戈洛尔:
洛杉矶$a0,太高了
li$v0,4#打印太高
系统调用
#回过头来再猜一猜
猜测
#######################################
#用户赢了,打印赢了,重新启动
赢:
洛杉矶$a0,温加梅
li$v0,4#打印字符串wingame
系统调用
j开始
#############################################
#叶程序
#随机:生成一个介于0到100之间的随机数
随机:
li$v0,42#服务41兰特整数
#addi$a0,$0,0#随机数>=0
addi$a1,$0,100#随机数<100
#异或$a0、$a0、$a0#选择随机生成器0
系统调用#生成随机整数(以$a0为单位返回)
jr$ra
现在的代码正在使用服务read_int(系统调用代码5),方法是使用
li $v0, 5 #read int from user
syscall
现在,如果您想读取ASCII字符,则应使用服务读取字符串(系统调用代码8),该字符串将读取缓冲区存储在$a0
中,其长度存储在$a1
中
li $v0, 8 # Note the only change is 8 instead of 5
syscall
现在,要将输入数字与代码中的数字进行比较,您有两个选项:
- 编写代码,使代码生成的数字集为ASCII格式,并比较两个ASCII值
- 将用户输入的ASCII字符转换为十进制并比较数字
$s1
中,$t0
包含10
,而$s2
包含0
:
lp:
lbu $t1, ($s1) #load unsigned char from array into t1
beq $t1, $0, FIN #NULL terminator found
blt $t1, 48, error #check if char is not a digit (ascii<'0')
bgt $t1, 57, error #check if char is not a digit (ascii>'9')
addi $t1, $t1, -48 #converts t1's ascii value to dec value
mul $s2, $s2, $t0 #sum *= 10
add $s2, $s2, $t1 #sum += array[s1]-'0'
addi $s1, $s1, 1 #increment array address
j lp #jump to start of loop
lp:
lbu$t1,($s1)#将无符号字符从数组加载到t1中
beq$t1,$0,FIN#找到空终止符
blt$t1,48,错误#检查字符是否不是数字(ascii'9')
addi$t1,$t1,-48#将t1的ascii值转换为dec值
mul$s2,$s2,$t0#总和*=10
添加$s2、$s2、$t1#sum+=数组[s1]-“0”
addi$s1,$s1,1#增量数组地址
j lp#跳转到循环起点
现在的代码正在使用服务read_int(系统调用代码5),方法是使用
li $v0, 5 #read int from user
syscall
现在,如果您想读取ASCII字符,则应使用服务读取字符串(系统调用代码8),该字符串将读取缓冲区存储在$a0
中,其长度存储在$a1
中
li $v0, 8 # Note the only change is 8 instead of 5
syscall
现在,要将输入数字与代码中的数字进行比较,您有两个选项:
- 编写代码,使代码生成的数字集为ASCII格式,并比较两个ASCII值
- 将用户输入的ASCII字符转换为十进制并比较数字
$s1
中,$t0
包含10
,而$s2
包含0
:
lp:
lbu $t1, ($s1) #load unsigned char from array into t1
beq $t1, $0, FIN #NULL terminator found
blt $t1, 48, error #check if char is not a digit (ascii<'0')
bgt $t1, 57, error #check if char is not a digit (ascii>'9')
addi $t1, $t1, -48 #converts t1's ascii value to dec value
mul $s2, $s2, $t0 #sum *= 10
add $s2, $s2, $t1 #sum += array[s1]-'0'
addi $s1, $s1, 1 #increment array address
j lp #jump to start of loop
lp:
lbu$t1,($s1)#将无符号字符从数组加载到t1中
beq$t1,$0,FIN#找到空终止符
blt$t1,48,错误#检查字符是否不是数字(ascii'9')
addi$t1,$t1,-48#将t1的ascii值转换为dec值
mul$s2,$s2,$t0#总和*=10
添加$s2、$s2、$t1#sum+=数组[s1]-“0”
addi$s1,$s1,1#增量数组地址
j lp#跳转到循环起点
如果以文本格式实现比较,则不需要这样做。@Jester以文本格式您是指字符串I/O?是的,请记住所有输入(您读取的所有内容)都将是ASCII字符(即使这些字符是数字)。如果可以比较字符输入以进行所需的任何确定,则可以避免从字符到整数值的转换。如果输入是单个ASCII数字,那么不进行更多的直接比较就很简单了。否则,您必须遍历输入,直到其中一个数字大于/小于th