Assembly ASCII输出
我在MIPS中有一个半工作的基代码,它接受一个十进制数,必须将其转换为从2到36的基,但它有以下问题: 1-使输出编号按正确顺序显示 2-让它接受负数 3-使其接受0 4-在10个显示ASCII字符后打底数 我被困在第四位,不知道怎么做,所以如果有人能帮我完成这段代码,我会很高兴这里是我做的代码的一部分:Assembly ASCII输出,assembly,ascii,mips,Assembly,Ascii,Mips,我在MIPS中有一个半工作的基代码,它接受一个十进制数,必须将其转换为从2到36的基,但它有以下问题: 1-使输出编号按正确顺序显示 2-让它接受负数 3-使其接受0 4-在10个显示ASCII字符后打底数 我被困在第四位,不知道怎么做,所以如果有人能帮我完成这段代码,我会很高兴这里是我做的代码的一部分: .data buffer: .space 256 str000: .asciiz "Introduzca un número (n) en base 10: " str001
.data
buffer: .space 256
str000: .asciiz "Introduzca un número (n) en base 10: "
str001: .asciiz ": "
str002: .asciiz "n en base "
str003: .asciiz "\n"
.text
# mueve la lÃnea siguiente justo antes de la versión que desees probar
integer_to_string:
integer_to_string_v4:
move $t0, $a2 # char *p = buff
# for (int i = n; i > 0; i = i / base) {
blt $a0, $0, negativo5
move $t1, $a0 # int i = n
volver3:
beqz $t1, B4_9
B4_3: blez $t1, B4_7 # si i <= 0 salta el bucle
div $t1, $a1 # i / base
mflo $t1 # i = i / base
mfhi $t2 # d = i % base
bge $t2, 10, B4_10
addiu $t2, $t2, 48 # d + '0'
sb $t2, 0($t0) # *p = $t2
addiu $t0, $t0, 1 # ++p
j B4_3 # sigue el bucle
# }
B4_10:
addiu $t2, $0, 55
sb $t2, 0($t0)
addiu $t0, $t0, 1
j B4_3
B4_9:
li $v0, 1
syscall
B4_7: blt $a0, $0, negativo6
B4_8: sb $zero, 0($t0) # *p = '\0'
move $t3, $a2
subi $t0,$t0,1
vuelta4:
bge $t3,$t0,fin_bucle4
lb $t7, 0($t3)
lb $t8, 0($t0)
sb $t7, 0($t0)
sb $t8, 0($t3)
addi $t3,$t3,1
subi $t0,$t0,1
j vuelta4
fin_bucle4: jr $ra
negativo5:
abs $t1, $a0
j volver3
negativo6:
addi $t4, $0, '-'
sb $t4, 0($t0)
addiu $t0, $t0, 1
j B4_8
# Imprime el número recibido en base 10 seguido de un salto de linea
test1: # $a0 = n
addiu $sp, $sp, -4
sw $ra, 0($sp)
li $a1, 10
la $a2, buffer
jal integer_to_string # integer_to_string(n, 10, buffer);
la $a0, buffer
jal print_string # print_string(buffer);
la $a0, str003
jal print_string # print_string("\n");
lw $ra, 0($sp)
addiu $sp, $sp, 4
jr $ra
# Imprime el número recibido en todas las bases entre 2 y 36
test2: # $a0 = n
addiu $sp, $sp, -12
sw $ra, 8($sp)
sw $s1, 4($sp)
sw $s0, 0($sp)
move $s0, $a0 # n
# for (int b = 2; b <= 36; ++b) {
li $s1, 2 # b = 2
B6_1: la $a0, str002
jal print_string # print_string("n en base ")
move $a0, $s1
li $a1, 10
la $a2, buffer
jal integer_to_string # integer_to_string(b, 10, buffer)
la $a0, buffer
jal print_string # print_string(buffer)
la $a0, str001
jal print_string # print_string(": ");
move $a0, $s0
move $a1, $s1
la $a2, buffer
jal integer_to_string # integer_to_string(n, b, buffer);
la $a0, buffer
jal print_string # print_string(buffer)
la $a0, str003
jal print_string # print_string("\n")
addiu $s1, $s1, 1 # ++b
li $t0, 36
ble $s1, $t0, B6_1 # sigue el bucle si b <= 36
# }
lw $s0, 0($sp)
lw $s1, 4($sp)
lw $ra, 8($sp)
addiu $sp, $sp, 12
jr $ra
.globl main
main:
addiu $sp, $sp, -8
sw $ra, 4($sp)
sw $s0, 0($sp)
la $a0, str000
jal print_string # print_string("Introduzca un número (n) en base 10: ")
jal read_integer
move $s0, $v0 # int n = read_integer()
move $a0, $s0
jal test1 # test1(n)
move $a0, $s0
jal test2 # test2(n)
li $a0, 0
jal mips_exit # mips_exit(0)
li $v0, 0
lw $s0, 0($sp)
lw $ra, 4($sp)
addiu $sp, $sp, 8
jr $ra
read_integer:
li $v0, 5
syscall
jr $ra
print_string:
li $v0, 4
syscall
jr $ra
mips_exit:
li $v0, 17
syscall
jr $ra
.data
缓冲区:。空间256
str000:.asciiz“第10基础上的mero(n)介绍:
str001:“asciiz”:”
str002:.asciiz“n en base”
str003:.asciiz“\n”
.文本
#这是一个很好的例子
整数到字符串:
整数到字符串4:
移动$t0,$a2#char*p=buff
#对于(int i=n;i>0;i=i/base){
blt$a0、$0、负5
移动$t1,$a0#int i=n
第三卷:
beqz$t1,B4_9
B4_3:blez$t1,B4_7#是的,你明白逻辑吗?只要检查数字是否大于9,如果大于9,调整它以打印适当的字母。注意,这些字母在ascii表格中是连续的,所以你只需要添加一个偏移量。是的,我在除法之后会这样做,我会检查其余的字母是否等于或大于10,然后i go我在分行执行以下B4_10:addiu$t2、$0、65 sb$t2、0($t0)addiu$t0,$t0,1 j B4_3在发布的代码中看不到B4_10
。无论如何,你不应该添加65
,因为那样会将10变成K
而不是A
。你应该添加55
。今天早上我做这件事时有同样的想法,但当我使用55时,我不工作,我在网上的某个地方读到了它的名字添加65,然后静止10,但得到了原因和准确程度。除了在0-9和A-Z上分支外,另一个选项是使用查找表。即,通过索引到“0123456789abcdef”
数组中,在所选基数中获取一个数字。