Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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 ASCII输出_Assembly_Ascii_Mips - Fatal编程技术网

Assembly 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

我在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: .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”
数组中,在所选基数中获取一个数字。