Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Yaldabaot en 26 Febrero 2015, 06:44 am



Título: Duda ASM
Publicado por: Yaldabaot en 26 Febrero 2015, 06:44 am
Hola, soy bastante nuevo con esto del ensamblador y se me ha hecho un lio horrendo

Código
  1.  
  2. ;************************************************************
  3.  
  4. ;Realiza un ordenamiento de un array con 20 numeros
  5.  
  6. ************************************************************
  7.  
  8.  
  9. .MODEL SMALL                     ; Modelo de memoria para el programa
  10.  
  11. .DATA                            ; Declaracion de variables
  12.  
  13.  
  14.  
  15. Mensaje1 db 'Array sin ordenar',0Ah,24h ;declaracion de mensajes,0AH,24h es un salto de linea
  16. Mensaje2 db 'Array ordenado',0Ah,24h
  17. Mensaje3 db 'Array con multiplos del 3',0Ah,24h
  18.  
  19. .CODE
  20.  
  21.  
  22. INICIO:                              
  23.                         ; Cuerpo del programa
  24.  
  25.  
  26.    mov dx,OFFSET Mensaje1      ; Direccion de la cadena de texto
  27.    mov ah,9                    ; Funcion para imprimir cadenas
  28.    int 21h                     ; Llamada al sistema operativo
  29.  
  30.  
  31.    INICIALIZACION:
  32.  
  33.  
  34.            mov si,offset tabla_o
  35.            mov cx,19
  36.            mov cambio,0
  37.            mov temp, 0
  38.  
  39.  
  40.        ciclo:
  41.  
  42.        mov ah,[si]              ;elemento 1
  43.        mov al,[si+1]            ;elemento 2
  44.  
  45.        cmp al,ah                ;Realiza la comparacion del elemento 1 con el 2
  46.        jg mayor                 ;Salta si es mayor
  47.  
  48.  
  49.       fciclo:
  50.  
  51.        inc si  
  52.        loop ciclo              ;ciclar hasta 20 elementos
  53.        cmp cambio,1
  54.  
  55.        je INICIALIZACION
  56.  
  57.  
  58.  
  59.        salir:
  60.  
  61.  
  62.        mov ah,4ch              ; servicio del DOS para regresar
  63.        int 21h                 ; el control al procesador de comandos msdos                        ; Funcion para imprimir cadenas        
  64.                                ; el control al procesador de comandos msdos
  65.  
  66.  
  67.  
  68.        cambio db 0            ; variable de estado 1=mayor 0=menor
  69.  
  70.        tabla_o db 2,9,16,1,4,5,6,32,17,10,60,63,90,12,33,45,99,100,80
  71.  
  72.        temp db 0; Variable temporal
  73.  
  74.    mayor:  
  75.  
  76.            mov cambio,1
  77.  
  78.            ;T temp = list[i + 1];
  79.    ;                        list[i + 1] = list[i];
  80.    ;                        list[i] = temp;
  81.    ;                        madeChanges = true;
  82.  
  83.  
  84.           mov temp, al
  85.           mov [si + 1] ,ah
  86.           mov al, temp
  87.           mov [si],al                    
  88.  
  89.  
  90.           jmp fciclo  
  91.  
  92.  
  93.  
  94. END INICIO
  95. CODE ENDS
  96.  
  97.  
  98. END
  99.  
  100.  
  101.  

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.




Título: Re: Duda ASM
Publicado por: fary en 26 Febrero 2015, 23:09 pm
Depura el programa con un debuger...

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

Esto:

Código
  1. mov cambio,0
  2. mov temp, 0

Es incorrecto, debería de ser así:

Código
  1. mov [cambio],0
  2. mov [temp], 0

Para acceder al contenido y no trabajar con el puntero.
  

Y con esto más de lo mismo

Código
  1. mov cambio,1
  2. mov temp, al

Así:

Código
  1. mov [cambio],1
  2. mov byte[temp], al

Hay algún fallo mas de este tipo por ahí...


Título: Re: Duda ASM
Publicado por: Yaldabaot en 26 Febrero 2015, 23:20 pm
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


Título: Re: Duda ASM
Publicado por: fary en 28 Febrero 2015, 10:24 am
Para imprimir un número lo tienes que pasar a cadena. 1 no es lo mismo que '1'. 

saludos!!


Título: Re: Duda ASM
Publicado por: Yaldabaot en 1 Marzo 2015, 00:39 am
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.




Título: Re: Duda ASM
Publicado por: fary en 12 Marzo 2015, 17:45 pm
0x0 + 0x30  = 0x30 = '0'
0x1 + 0x30  = 0x31 = '1'
0x2 + 0x30  = 0x32 = '2'
...
0x9 + 0x30  = 0x39 = '9'


Título: Re: Duda ASM
Publicado por: Yaldabaot en 13 Marzo 2015, 23:55 pm
Gracias