Duda ASM

Iniciado por Yaldabaot, 26 Febrero 2015, 06:44 AM

0 Miembros y 1 Visitante están viendo este tema.

Yaldabaot

Hola, soy bastante nuevo con esto del ensamblador y se me ha hecho un lio horrendo

Código (asm) [Seleccionar]


;************************************************************

;Realiza un ordenamiento de un array con 20 numeros

************************************************************


.MODEL SMALL                     ; Modelo de memoria para el programa

.DATA                            ; Declaracion de variables



Mensaje1 db 'Array sin ordenar',0Ah,24h ;declaracion de mensajes,0AH,24h es un salto de linea
Mensaje2 db 'Array ordenado',0Ah,24h
Mensaje3 db 'Array con multiplos del 3',0Ah,24h

.CODE

                               
INICIO:                              
                        ; Cuerpo del programa
         
         
   mov dx,OFFSET Mensaje1      ; Direccion de la cadena de texto
   mov ah,9                    ; Funcion para imprimir cadenas
   int 21h                     ; Llamada al sistema operativo
                   

   INICIALIZACION:
   
       
           mov si,offset tabla_o
           mov cx,19
           mov cambio,0
           mov temp, 0
           
           
       ciclo:
       
       mov ah,[si]              ;elemento 1
       mov al,[si+1]            ;elemento 2
       
       cmp al,ah                ;Realiza la comparacion del elemento 1 con el 2
       jg mayor                 ;Salta si es mayor
           
     
      fciclo:
       
       inc si  
       loop ciclo              ;ciclar hasta 20 elementos
       cmp cambio,1
       
       je INICIALIZACION
   
         
         
       salir:
       
               
       mov ah,4ch              ; servicio del DOS para regresar
       int 21h                 ; el control al procesador de comandos msdos                        ; Funcion para imprimir cadenas        
                               ; el control al procesador de comandos msdos
   
   
                                 
       cambio db 0            ; variable de estado 1=mayor 0=menor
       
       tabla_o db 2,9,16,1,4,5,6,32,17,10,60,63,90,12,33,45,99,100,80
     
       temp db 0; Variable temporal
         
   mayor:  
   
           mov cambio,1
                     
           ;T temp = list[i + 1];
   ;                        list[i + 1] = list[i];
   ;                        list[i] = temp;
   ;                        madeChanges = true;
                           
                           
          mov temp, al
          mov [si + 1] ,ah
          mov al, temp
          mov [si],al                    
           
                       
          jmp fciclo  
   

   
END INICIO
CODE ENDS
                           

END




Emulador 8086, x86

Tengo ese codigo, me gustaria imprimir lo que ordeno a la salida del array o lo que mal ordeno (porque ni siquiera se si lo ordene bien, pero bueno la idea es hacerlo yo si tienen alguna guia o algo que me ayude pues seria genial pero es adicional!).

Y es que si utilizo el 21h con el 4ch pues me vuelve a tirar el mensaje de arriba!!.

Me ha costado bastante entenderlo, les agradeceria una guia nada mas, GRACIAS POR LEER.


Nunca me contestan -_-

fary

#1
Depura el programa con un debuger...

¿Qué es lo que sucede cuando ejecutas el programa?

Esto:

Código (asm) [Seleccionar]
mov cambio,0
mov temp, 0


Es incorrecto, debería de ser así:

Código (asm) [Seleccionar]
mov [cambio],0
mov [temp], 0


Para acceder al contenido y no trabajar con el puntero.
 

Y con esto más de lo mismo

Código (asm) [Seleccionar]
mov cambio,1
mov temp, al


Así:

Código (asm) [Seleccionar]
mov [cambio],1
mov byte[temp], al


Hay algún fallo mas de este tipo por ahí...
Un byte a la izquierda.

Yaldabaot

#2
Hola Fary GRACIAS por responder,  sucede que cuando ejecuto una impresión en pantalla (específicamente la segunda) me vuelve a introducir el mismo mensaje que el primero, y dos no se exactamente como ir escribiendo el array conforme lo recorro y presentarlo en pantalla como se va ordenando.




Gracias por indicarme el fallo, verificaré, si sabes de como imprimirlo en pantalla te estaría muy agradecido!.

Lo que pasa es que realmente si lo he probado con la función prt y la del ah,9, cómo reitero soy muy nuevo con esto del ensamblador no se me asemeja mucho al de alto nivel. GRACIAS
Nunca me contestan -_-

fary

Para imprimir un número lo tienes que pasar a cadena. 1 no es lo mismo que '1'. 

saludos!!
Un byte a la izquierda.

Yaldabaot

Y como le paso la cadena, haciendo un offset o cómo?. Podrías darme un pequeño ejemplo?.

Es que lo que me imagino asó

print array;

Me lo imagino así en ensamblador

mov dx, offset tabla_o ; cómo pondría acá que me imprima esto -- tabla_o[si]??
ah,9
int 21h

Cómo lo hago?.

He visto instrucciones con lea y eax pero no lo comprendo bien.


Nunca me contestan -_-

fary

0x0 + 0x30  = 0x30 = '0'
0x1 + 0x30  = 0x31 = '1'
0x2 + 0x30  = 0x32 = '2'
...
0x9 + 0x30  = 0x39 = '9'
Un byte a la izquierda.

Yaldabaot

Nunca me contestan -_-