es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Traducción al español: array[i]%2 y valor del usuario en ensamblador

Necesito escribir este código en ensamblador MIPS:

int i, size, result = 0;
int * array;
...
//size obtiene un valor del usuario
//array se asigna según este valor
...
for ( i=0;i<size;i++ )="" {="" if="" (array[i]="" %2="=0)" si="" array[i]="" es="" par="" result="" +="array[i];" agregarlo="" al="" resultado="" }="" ```="" y="" los="" registros="" utilizados="" son="" $s1="" para="" i,="" $s2="" para="" size,="" $s3="" para="" la="" dirección="" inicial="" del="" array,="" y="" $s4="" para="" el="" resultado.="" he="" escrito:="" ```="" ori="" $s1,$0,0="" int="" i="" ori="" $s3,array="" int="" array="" *="" add="" $s4,$zero,$zero="" int="" result="0;" l1:="" bge="" $s1,$s2,done="" for="" loop=""></size;i++><size ...="" lw="" $5,="" 0($s3)="" $5="array[I]" addu="" $s4,$s4,$s5="" result="" +="array[I]" j="" update="" update:="" addi="" $s1,="" $s1,="" 1="" i++="" addi="" $s4,="" $s4,="" 4="" mover="" puntero="" de="" array="" j="" l1="" ir="" a="" l1="" done:="" nop="" ```="" no="" sé="" cómo="" escribir="" 2="" cosas:="" 1.="" if="" (array[i]="" %2="=0)" 2.="" size="" obtiene="" un="" valor="" del="" usuario="" por="" favor,="" ayúdeme="" con="" esas="" cosas.="" gracias.="" entonces="" ahora="" escribí:="" ```="" ori="" $s1,$0,0="" int="" i="" li="" $v0,="" 5="" escanea="" un="" entero="" del="" usuario="" la="" $s3,array="" int="" array="" *="" add="" $s4,$zero,$zero="" int="" result="0;" l1:="" bge="" $s1,$s2,done="" for="" loop=""></size><size
lw $s5, 0($s3) // $s5 = array[i]
add $s6,$zero,$s5 // $s6 = $s5
mov $s6, 31 
and $s7,$s6,1
bne $s7, $zero, adding
j update

adding:
addu $s4,$s4,$s5 // result += array[i]
j update

update:
addi $s1, $s1, 1 // i++
addi $s4, $s4, 4 // mover puntero de array
j l1 // ir a l1

done:
nop

nota: en el código corregido, la línea ori $s3,array // int array * se cambió a la $s3,array // int array * para cargar la dirección del array en el registro $s3. lw=”” $s5,=”” 0($s3)=”” $s5=”array[I]” add=”” $s6,$zero,$s5=”” $s6=”$s5″ mov=”” $s6,=”” 31=”” and=”” $s7,$s6,1=”” bne=”” $s7,=”” $zero,=”” adding=”” j=”” update=”” adding:=”” addu=”” $s4,$s4,$s5=”” result=”” +=”array[I]” j=”” update=”” update:=”” addi=”” $s1,=”” $s1,=”” 1=”” i++=”” addi=”” $s4,=”” $s4,=”” 4=”” mover=”” puntero=”” de=”” array=”” j=”” l1=”” ir=”” a=”” l1=”” done:=”” nop=”” “`=”” nota:=”” en=”” el=”” código=”” corregido,=”” la=”” línea=”” ori="" $s3,array="" int="" array="" *=”” se=”” cambió=”” a=”” la="" $s3,array="" int="" array="" *=”” para=”” cargar=”” la=”” dirección=”” del=”” array=”” en=”” el=”” registro=””></size
lw $s5, 0($s3) // $s5 = array[i]
add $s6,$zero,$s5 // $s6 = $s5
mov $s6, 31
and $s7,$s6,1
bne $s7, $zero, adding
j update

adding:
addu $s4,$s4,$s5 // result += array[i]
j update

update:
addi $s1, $s1, 1 // i++
addi $s4, $s4, 4 // mover puntero de array
j l1 // ir a l1

done:
nop
“`

nota: en el código corregido, la línea ori $s3,array // int array * se cambió a la $s3,array // int array * para cargar la dirección del array en el registro $s3.>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    ¡Buen trabajo! Solo hay un par de cosas que necesitan ser corregidas:

    1. Para verificar si array[i] es par, puedes usar la instrucción de AND a nivel de bits (andi). Si el resultado de la operación AND a nivel de bits entre array[i] y 1 es cero, entonces significa que array[i] es par. Así es como puedes modificar tu código para verificar la paridad:
    andi $s6, $s5, 1  # AND a nivel de bits entre array[i] y 1
    bne $s6, $zero, ODD  # si no es par, ir al bucle UPDATE
    
    1. Para obtener el tamaño del array del usuario, necesitas usar las instrucciones li y syscall para leer un entero del usuario. Así es como puedes modificar tu código para leer el tamaño del usuario:
    li $v0, 5       # establecer $v0 en 5 para indicar que queremos leer un entero
    syscall         # invocar la llamada de sistema para leer un entero
    move $s2, $v0   # mover el entero leído del usuario a $s2 (la variable de tamaño)
    

    Con esas modificaciones, tu código se verá así:

    ori $s1, $0, 0        # int i
    la $s3, array        # int array *
    add $s4, $zero, $zero # int result = 0;
    
    li $v0, 5            # leer entero del usuario
    syscall
    move $s2, $v0        # establecer tamaño del array (a partir de la entrada del usuario)
    
    l1:
        bge $s1, $s2, Done # bucle para i<size
        lw $s5, 0($s3)   # $s5 = array[i]
    
        andi $s6, $s5, 1 # verificar si array[i] es par
        bne $s6, $zero, update # si no es par, ir al bucle update
    
        addu $s4, $s4, $s5 # agregar array[i] a result
        j update
    
    update:
        addi $s1, $s1, 1 # i++
        addi $s3, $s3, 4 # incrementar apuntador de array
        j l1
    
    done:
        nop
    

    ¡bien hecho! tu código ahora debería funcionar como se espera. lw=”” $s5,=”” 0($s3)=”” #=”” $s5=”array[I]” andi=”” $s6,=”” $s5,=”” 1=”” #=”” verificar=”” si=”” array[i]=”” es=”” par=”” bne=”” $s6,=”” $zero,=”” update=”” #=”” si=”” no=”” es=”” par,=”” ir=”” al=”” bucle=”” update=”” addu=”” $s4,=”” $s4,=”” $s5=”” #=”” agregar=”” array[i]=”” a=”” result=”” j=”” update=”” update:=”” addi=”” $s1,=”” $s1,=”” 1=”” #=”” i++=”” addi=”” $s3,=”” $s3,=”” 4=”” #=”” incrementar=”” apuntador=”” de=”” array=”” j=”” l1=”” done:=”” nop=”” “`=”” ¡bien=”” hecho!=”” tu=”” código=”” ahora=”” debería=”” funcionar=”” como=”” se=””></size
    lw $s5, 0($s3) # $s5 = array[i]

    andi $s6, $s5, 1 # verificar si array[i] es par
    bne $s6, $zero, update # si no es par, ir al bucle update
    
    addu $s4, $s4, $s5 # agregar array[i] a result
    j update
    

    update:
    addi $s1, $s1, 1 # i++
    addi $s3, $s3, 4 # incrementar apuntador de array
    j l1

    done:
    nop
    “`

    ¡bien hecho! tu código ahora debería funcionar como se espera.>

Comments are closed.