Assembly 为什么我的MIPS base转换器在当前值之后打印出上一个循环中的值?
我对MIPS非常陌生,这让我完全困惑。我制作了一个转换基址的程序,它第一次就可以正常工作,但是当它循环时,它会显示循环之前迭代中其他寄存器的值。输出如下。我已经尝试了我能想到的一切,但我没有主意了Assembly 为什么我的MIPS base转换器在当前值之后打印出上一个循环中的值?,assembly,mips,Assembly,Mips,我对MIPS非常陌生,这让我完全困惑。我制作了一个转换基址的程序,它第一次就可以正常工作,但是当它循环时,它会显示循环之前迭代中其他寄存器的值。输出如下。我已经尝试了我能想到的一切,但我没有主意了 Enter a decimal number: 10 The number in base 2 is 00000000000000000000000000001010 The number in base 4 is 0000000000000022 The number in base 16 is 0
Enter a decimal number: 10
The number in base 2 is 00000000000000000000000000001010
The number in base 4 is 0000000000000022
The number in base 16 is 0000000A
The number in base 8 is 0000000012
您想输入另一个号码吗?一,
Enter a decimal number: 11
The number in base 2 is 0000000000000000000000000000101100000000000000220000000A0000000012
The number in base 4 is 00000000000000230000000A0000000012
The number in base 16 is 0000000B0000000012
The number in base 8 is 0000000013
您想输入另一个号码吗
.text
.globl __start
__start:
la $a0, prompt # Prompt for a base10 integer
li $v0, 4
syscall
li $v0, 5
syscall
move $a0, $v0
jal bin
jal base4
jal hex
jal base8
la $a0, endl
li $v0, 4
syscall
la $a0, repeat
li $v0, 4
syscall
li $v0, 5
syscall
beqz $v0, eop
la $a0, endl
li $v0, 4
syscall
j __start
eop:
li $v0,10 # End Of Program
syscall
##########################################################
#
# BASE 16
#
##########################################################
hex:
sub $sp, $sp, 24 # Push register onto stack
sw $a0, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
sw $s3, 16($sp)
sw $s4, 20($sp)
move $s2, $a0 # Move a0 to s2
la $a0, ans3 # Display string before hex answer
li $v0, 4
syscall
li $s0, 8 # 8 digits for hex word
la $s3, hexresult # Hex string set up here
hexloop:
rol $s2, $s2, 4 # Start with leftmost digit
and $s1, $s2, 0xf # Mask 15 digits in s2 and place results in s1
ble $s1, 9, hexprint # If s1 <= 9, go to print
add $s1, $s1, 7 # Else s1 = s1 + 7 (to get A-F)
hexprint:
add $s1, $s1, 48 # Add 48 (30 hex) to get ascii code
sb $s1,($s3) # Store byte in result. s3 -> result
add $s3, $s3, 1 # s3 = s3 + 1
add $s0, $s0, -1 # s0 = s0 - 1
bnez $s0, hexloop # If s0 != 0, go to hexloop
la $a0, hexresult # display result
li $v0, 4
syscall
jr $ra # Return
##########################################################
#
# BASE 2
#
#########################################################
bin:
sub $sp, $sp, 24 # Push register onto stack
sw $a0, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
sw $s3, 16($sp)
sw $s4, 20($sp)
move $s2, $a0 # Move a0 to s2
la $a0, ans1 # Display string before bin answer
li $v0, 4
syscall
li $s0, 32 # 32 digits for base4 word
la $s3, binresult # Bin string set up here
binloop:
rol $s2, $s2, 1 # Start with leftmost digit
and $s1, $s2, 1 # Mask one digit in s2 and place results in s1
binprint:
add $s1, $s1, 48 # Add 48 (30 hex) to get ascii code
sb $s1,($s3) # Store byte in result. s3 -> result
add $s3, $s3, 1 # s3 = s3 + 1
add $s0, $s0, -1 # s0 = s0 - 1
bnez $s0, binloop # If s0 != 0, go to binloop
la $a0, binresult # display result
li $v0, 4
syscall
la $a0, endl
li $v0, 4
syscall
jr $ra # Return
##########################################################
#
# BASE 4
#
#########################################################
base4:
sub $sp, $sp, 24 # Push register onto stack
sw $a0, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
sw $s3, 16($sp)
sw $ra, 20($sp)
move $s2, $a0 # Move a0 to s2
la $a0, ans2 # Display string before BASE 4 answer
li $v0, 4
syscall
li $s0, 16 # 16 digits for base4 word
la $s3, base4result # Bin string set up here
base4loop:
rol $s2, $s2, 2 # Start with leftmost digit
and $s1, $s2, 3 # Mask one digit in s2 and place results in s1
fourprint:
add $s1, $s1, 48 # Add 48 (30 hex) to get ascii code
sb $s1,($s3) # Store byte in result. s3 -> result
add $s3, $s3, 1 # s3 = s3 + 1
add $s0, $s0, -1 # s0 = s0 - 1
bnez $s0, base4loop # If s0 != 0, go to binloop
la $a0, base4result # display result
li $v0, 4
syscall
la $a0, endl
li $v0, 4
syscall
jr $ra # Return
##########################################################
#
# BASE 8
#
#########################################################
base8:
sub $sp, $sp, 24 # Push register onto stack
sw $a0, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
sw $s3, 16($sp)
sw $ra, 20($sp)
move $s2, $a0 # Move a3 to s2
la $a0, endl
li $v0, 4
syscall
la $a0, ans4 # Display string before bin answer
li $v0, 4
syscall
li $s0, 10 # digits for octal word
la $s3, octresult # Bin string set up here
rol $s2, $s2, 2 # Start with leftmost digit
and $s1, $s2, 0x7 # Mask 7 digits in s2 and place results in s1
base8loop:
rol $s2, $s2, 3 # Start with leftmost digit
and $s1, $s2, 0x7 # Mask 7 digits in s2 and place results in s1
base8print:
add $s1, $s1, 48 # Add 48 (30 hex) to get ascii code
sb $s1,($s3) # Store byte in result. s3 -> result
add $s3, $s3, 1 # s3 = s3 + 1
add $s0, $s0, -1 # s0 = s0 - 1
bnez $s0, base8loop # If s0 != 0, go to binloop
la $a0, octresult # display result
li $v0, 4
syscall
jr $ra # Return
.data
binresult: .space 32
base4result:.space 16
hexresult: .space 8
octresult: .space 10
endl: .asciiz "\n"
prompt: .asciiz "Enter a decimal number: "
ans1: .asciiz "The number in base 2 is "
ans2: .asciiz "The number in base 4 is "
ans3: .asciiz "The number in base 16 is "
ans4: .asciiz "The number in base 8 is "
repeat: .asciiz "Would you like to input another number? "
.text
.globl\u开始
__开始:
la$a0,提示#提示输入base10整数
李$v0,4
系统调用
李$v0,5
系统调用
移动$a0,$v0
日本航空公司
日航基地4
日航六角
日航8号基地
洛杉矶$a0,完
李$v0,4
系统调用
la$a0,重复
李$v0,4
系统调用
李$v0,5
系统调用
beqz$v0,eop
洛杉矶$a0,完
李$v0,4
系统调用
j____开始
eop:
li$v0,10#项目结束
系统调用
##########################################################
#
#基数16
#
##########################################################
十六进制:
sub$sp,$sp,24#将寄存器推送到堆栈上
sw$a0,0($sp)
sw$s0,4($sp)
sw$s1,8($sp)
sw$s2,12($sp)
sw$s3,16($sp)
sw$s4,20($sp)
移动$s2,$a0#移动a0到s2
la$a0,ans3#十六进制应答前显示字符串
李$v0,4
系统调用
li$s0,8#8位十六进制字
la$s3,hexresult#这里设置了十六进制字符串
六角环:
rol$s2,$s2,4#从最左边的数字开始
和$s1、$s2、0xf#在s2中屏蔽15位数字,并将结果放入s1
ble$s1,9,六角打印#如果s1结果
加上$s3,$s3,1#s3=s3+1
加上$s0,$s0,-1#s0=s0-1
bnez$s0,hexloop#如果s0!=0,转到hexloop
la$a0,hexresult#显示结果
李$v0,4
系统调用
jr$ra#回报
##########################################################
#
#基地2
#
#########################################################
箱子:
sub$sp,$sp,24#将寄存器推送到堆栈上
sw$a0,0($sp)
sw$s0,4($sp)
sw$s1,8($sp)
sw$s2,12($sp)
sw$s3,16($sp)
sw$s4,20($sp)
移动$s2,$a0#移动a0到s2
la$a0,ans1#在bin应答前显示字符串
李$v0,4
系统调用
li$s0,32#32位表示基本4字
la$s3,binresult#在此处设置Bin字符串
binloop:
rol$s2,$s2,1#从最左边的数字开始
和$s1、$s2、1#在s2中屏蔽一个数字,并将结果放入s1
binprint:
添加$s1、$s1、48#添加48(30十六进制)以获得ascii码
sb$s1,($s3)#在结果中存储字节。s3->结果
加上$s3,$s3,1#s3=s3+1
加上$s0,$s0,-1#s0=s0-1
bnez$s0,binloop#如果s0!=0,转到binloop
la$a0,binresult#显示结果
李$v0,4
系统调用
洛杉矶$a0,完
李$v0,4
系统调用
jr$ra#回报
##########################################################
#
#基地4
#
#########################################################
基础4:
sub$sp,$sp,24#将寄存器推送到堆栈上
sw$a0,0($sp)
sw$s0,4($sp)
sw$s1,8($sp)
sw$s2,12($sp)
sw$s3,16($sp)
西南$ra,20($sp)
移动$s2,$a0#移动a0到s2
la$a0,ans2#在基数为4的答案前显示字符串
李$v0,4
系统调用
li$s0,16位数字表示基本4字
la$s3,base4result#Bin字符串设置在这里
base4loop:
rol$s2,$s2,2#从最左边的数字开始
和$s1、$s2、3#在s2中屏蔽一个数字,并将结果放入s1
四联:
添加$s1、$s1、48#添加48(30十六进制)以获得ascii码
sb$s1,($s3)#在结果中存储字节。s3->结果
加上$s3,$s3,1#s3=s3+1
加上$s0,$s0,-1#s0=s0-1
bnez$s0,base4loop#如果s0!=0,转到binloop
la$a0,base4result#显示结果
李$v0,4
系统调用
洛杉矶$a0,完
李$v0,4
系统调用
jr$ra#回报
##########################################################
#
#基数8
#
#########################################################
基准8:
sub$sp,$sp,24#将寄存器推送到堆栈上
sw$a0,0($sp)
sw$s0,4($sp)
sw$s1,8($sp)
sw$s2,12($sp)
sw$s3,16($sp)
西南$ra,20($sp)
移动$s2,$a0#移动a3到s2
洛杉矶$a0,完
李$v0,4
系统调用
la$a0,ans4#在bin应答前显示字符串
李$v0,4
系统调用
li$s0,八进制字为10位
la$s3,octresult#Bin字符串设置在这里
rol$s2,$s2,2#从最左边的数字开始
和$s1、$s2、0x7#在s2中屏蔽7个数字,并将结果放入s1
base8loop:
rol$s2,$s2,3#从最左边的数字开始
和$s1、$s2、0x7#在s2中屏蔽7个数字,并将结果放入s1
Base8打印:
添加$s1、$s1、48#添加48(30十六进制)以获得ascii码
sb$s1,($s3)#在结果中存储字节。s3->结果
加上$s3,$s3,1#s3=s3+1
加上$s0,$s0,-1#s0=s0-1
bnez$s0,base8loop#如果s0!=0,转到binloop
la$a0,八进制结果#显示结果
李$v0,4
系统调用
jr$ra#回报
.数据
binresult:。空间32
base4result:。空间16
结果:
.text
.globl main
main:
la $a0,prompt # Prompt for a base10 integer
li $v0,4
syscall
# get the value
li $v0,5
syscall
move $s7,$v0
###jal bin
###jal base4
jal hex
jal oct
la $a0,endl
li $v0,4
syscall
la $a0,repeat
li $v0,4
syscall
li $v0,5
syscall
beqz $v0,eop
la $a0,endl
li $v0,4
syscall
j main
eop:
li $v0,10 # End Of Program
syscall
# BASE 16
hex:
la $a0,hexmsg # Display string before hex answer
li $a1,0x0F # mask for hex digit
li $a2,28 # initial right shift amount
li $a3,4 # right shift decrement
j numdump
# BASE 8
oct:
la $a0,octmsg # Display string before hex answer
li $a1,0x07 # mask for octal digit
li $a2,30 # right shift amount
li $a3,3 # right shift decrement
j numdump
# numdump -- dump out a number in an alternate base
#
# arguments:
# a0 -- pointer to string for prefix
# a1 -- mask for digit
# a2 -- initial right shift amount
# a3 -- amount to decrement shift by
# s7 -- number value
numdump:
li $v0,4
syscall
la $t3,result # output string set up here
numloop:
srlv $t0,$s7,$a2 # slide the digit right
and $t0,$t0,$a1 # mask the digit
lb $t0,digits($t0) # get the ascii value
sb $t0,0($t3) # store into result buffer
addi $t3,$t3,1 # advance result pointer
sub $a2,$a2,$a3 # reduce shift amount -- more to do?
bgez $a2,numloop # yes, loop
sb $zero,0($t3) # store end of string
la $a0,result # display result
li $v0,4
syscall
la $a0,endl
syscall
jr $ra # Return
.data
result: .space 40
digits: .asciiz "0123456789ABCDEF"
endl: .asciiz "\n"
prompt: .asciiz "Enter a decimal number: "
b2msg: .asciiz "The number in base 2 is "
b4msg: .asciiz "The number in base 4 is "
hexmsg: .asciiz "The number in base 16 is "
octmsg: .asciiz "The number in base 8 is "
repeat: .asciiz "Would you like to input another number? "
.text
.globl main
main:
la $a0,prompt # Prompt for a base10 integer
li $v0,4
syscall
# get the value
li $v0,5
syscall
move $s7,$v0
###jal bin
###jal base4
jal hex
jal oct
la $a0,endl
li $v0,4
syscall
la $a0,repeat
li $v0,4
syscall
li $v0,5
syscall
beqz $v0,eop
la $a0,endl
li $v0,4
syscall
j main
eop:
li $v0,10 # End Of Program
syscall
# BASE 16
hex:
la $a0,hexmsg # Display string before hex answer
li $a1,4 # number of bits in a digit
li $a2,28 # initial right shift amount
j numdump
# BASE 8
oct:
la $a0,octmsg # Display string before hex answer
li $a1,3 # number of bits in a digit
li $a2,30 # right shift amount
j numdump
# numdump -- dump out a number in an alternate base
#
# arguments:
# a0 -- pointer to string for prefix
# a1 -- number of bits in a digit
# a2 -- initial right shift amount
# s7 -- number value
#
# registers:
# a3 -- digit mask
numdump:
li $v0,4
syscall
la $t3,result # output string set up here
# create digit mask from number of bits in a digit
li $a3,1 # mask = 1
sllv $a3,$a3,$a1 # mask <<= digit width (for hex, 0x10)
subiu $a3,$a3,1 # bump down for mask (for hex, 0x0F)
numloop:
srlv $t0,$s7,$a2 # slide the digit right
and $t0,$t0,$a3 # mask the digit
lb $t0,digits($t0) # get the ascii value
sb $t0,0($t3) # store into result buffer
addi $t3,$t3,1 # advance result pointer
sub $a2,$a2,$a1 # reduce shift amount -- more to do?
bgez $a2,numloop # yes, loop
sb $zero,0($t3) # store end of string
la $a0,result # display result
li $v0,4
syscall
la $a0,endl
syscall
jr $ra # Return
.data
result: .space 40
digits: .asciiz "0123456789ABCDEF"
endl: .asciiz "\n"
prompt: .asciiz "Enter a decimal number: "
b2msg: .asciiz "The number in base 2 is "
b4msg: .asciiz "The number in base 4 is "
hexmsg: .asciiz "The number in base 16 is "
octmsg: .asciiz "The number in base 8 is "
repeat: .asciiz "Would you like to input another number? "