MIPS ASCII输出

时间:2016-04-06 16:58:37

标签: assembly ascii mips

我在MIPS中有一个基本代码是半工作,它接受一个十进制数,并且必须将它转换为2到36的基数,但它有以下问题:

1-使输出编号以正确的顺序显示 2-让它接受负数 3-接受0 4-在10个显示ASCII字符后生成基础

我坚持第4号不知道如何制作它,所以如果有人可以帮我处理这段代码,我会很高兴这是我所做的代码的一部分:

        .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

0 个答案:

没有答案