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.

Cómo guardar el número mínimo en un arreglo? En ensamblador.

Mi objetivo es ordenar los números en el array dado de menor a mayor (minloc, 01, 06, 07, ‘$’). Creo que el problema está en el procedimiento “min”, ya que siempre resulta ser 7 por alguna razón.
Tengo que usar el puntero base y los procedimientos deben mantenerse separados.
Si encuentras la causa principal del error y/o tienes una forma de mejorar mi código, siéntete libre de hacer comentarios.

DATASEG
minloc db ?
array db 6, 7, 1, '$'
CODESEG
proc min
    push bp
    mov bp, sp
    push bx di si
    found:
    mov si, bx ;posiciones de inicio
    mov di, [bx]
    looparray:
    inc bx
    cmp [byte ptr bx], '$'
    je endofarray
    cmp [bx], di ;si [bx] < valor mínimo
    jb found
    jmp looparray
    endofarray:
    mov di, [bp+4]
    mov [di], si
    pop si di bx
    pop bp
    ret 4
endp min

proc swap
    push bp 
    mov bp, sp
    push bx di dx ax
    mov bx, [bp+6]
    mov si, [bp+4]
    mov ax, [bx]
    mov dx, [si]
    mov [bx], dx
    mov [si], ax
    pop ax dx di bx
    pop bp
    ret 6
endp swap

start:
    mov ax, @data
    mov ds, ax
; --------------------------
mov bx, offset array
arrayloop:
push offset min
call min
push [word ptr minloc]; bp+6
push bx ;bp+4
call swap
inc bx
cmp [byte ptr bx], '$'
jne arrayloop
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución

    El problema en el código está en el procedimiento min. El registro si se utiliza para almacenar la posición inicial del valor mínimo en el array, pero no se inicializa, por lo tanto tiene un valor aleatorio. Esto hace que la comparación en el bucle looparray falle y el procedimiento siempre devuelva 7 (que es la posición inicial de $).

    Para solucionarlo, si debe inicializarse a la posición inicial del array antes de comenzar la búsqueda del valor mínimo. Esto se puede hacer agregando el siguiente código antes de la etiqueta found:

    mov si, bx ; inicializar si como posición inicial
    found:
    

    Además, es recomendable agregar comentarios para mejorar la legibilidad y mantenibilidad del código. Aquí está el código actualizado con comentarios:

    DATASEG
    minloc db ?
    array db 6,7,1, '$'
    CODESEG
    
    proc min
        push bp
        mov bp,sp
        push bx di si
    
        ; inicializar si como posición inicial
        mov si, bx
        found:
    
        ; recorrer el array
        mov di , [bx]
        looparray:
            inc bx
            cmp [byte ptr bx], '$'
            je endofarray
            cmp [bx], di
            jb found ; actualizar valor mínimo
            jmp looparray
        endofarray:
    
        ; almacenar el índice del valor mínimo
        mov di, [bp+4]
        mov [di], si
        pop si di bx
        pop bp
        ret 4
    endp min
    
    ; intercambiar dos elementos en el array
    proc swap
        push bp 
        mov bp,sp
        push bx di dx ax
        mov bx, [bp+6]
        mov si, [bp+4]
        mov ax, [bx]
        mov dx, [si]
        mov [bx], dx
        mov [si], ax
        pop ax dx di bx
        pop bp
        ret 6
    endp swap
    
    start:
        mov ax, @data
        mov ds, ax
    
        ; ordenar el array
        mov bx, offset array
    arrayloop:
        push offset min
        call min
        push [word ptr minloc]; bp+6
        push bx ;bp+4
        call swap
        inc bx
        cmp [byte ptr bx], '$'
        jne arrayloop
    

Comments are closed.