Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么我需要在这个组装游戏中转换数字_Assembly_Mips - Fatal编程技术网

Assembly 为什么我需要在这个组装游戏中转换数字

Assembly 为什么我需要在这个组装游戏中转换数字,assembly,mips,Assembly,Mips,我需要用汇编语言做一个猜谜游戏 游戏要求玩家输入一个数字并与之进行比较 另一个数字集,然后告诉玩家他们的猜测是否正确 过高或过低,允许玩家不断猜测,直到他们 把号码设置好 这项工作的一个问题是: 为什么需要数字转换以及如何转换–使用网格方法- ASCII H之间的转换从十六进制转换为二进制 为什么我需要进行转换 游戏代码 .data #storing data startmsg: .asciiz "I am thinking of a random number between 1 an

我需要用汇编语言做一个猜谜游戏

游戏要求玩家输入一个数字并与之进行比较 另一个数字集,然后告诉玩家他们的猜测是否正确 过高或过低,允许玩家不断猜测,直到他们 把号码设置好

这项工作的一个问题是:

为什么需要数字转换以及如何转换–使用网格方法- ASCII H之间的转换从十六进制转换为二进制

为什么我需要进行转换

游戏代码

.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字符转换为十进制并比较数字
对于第一个,您需要将数字拆分为数字,将48添加到数字中,并将结果串联成字符串

对于第二种解决方案,您需要迭代缓冲区并对每个ASCII字符减去48

这是将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字符转换为十进制并比较数字
对于第一个,您需要将数字拆分为数字,将48添加到数字中,并将结果串联成字符串

对于第二种解决方案,您需要迭代缓冲区并对每个ASCII字符减去48

这是将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