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
davy.ai
Solución
El problema en el código está en el procedimiento
min
. El registrosi
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 buclelooparray
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 etiquetafound
:Además, es recomendable agregar comentarios para mejorar la legibilidad y mantenibilidad del código. Aquí está el código actualizado con comentarios: