Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: farresito en 14 Diciembre 2010, 23:45 pm



Título: Diferencias resultado ensambladores (no, no es la pregunta clásica VS)
Publicado por: farresito en 14 Diciembre 2010, 23:45 pm
Holas a todos,

Llevo unos días pensando en una cosilla que me tiene hasta ahí. La cosa es que por internet hay muchos VS entre tal ensamblador o tal otro. Si bien he leído mucho acerca de ello, mi pregunta es más concreta.

Cuando se ensambla con un ensamblador u otro ¿hay diferencia alguna entre el resultado de cada uno? Es decir, el resultado en binario será el mismo en todo los ensambladores o habrá alguno que difiera un poco.

¿Se puede 'optimizar' un ensamblador? Por ejemplo, supongamos que tenemos éste código, sacado de una web:
Código:
Game Port

;  GAMEPORT.ASM
;

        .MODEL TINY

        .DATA

        yes     DB      13,10,"Game port is installed.",13,10,"$"
        no      DB      13,10,"Game port is not installed.",13,10,"$"

        .CODE
        ORG 100h

start:  mov     al, 1           ;value to write to port
        mov     dx, 201h        ;port number
        out     dx, al          ;write to port
        mov     cx, 0F00h       ;# of loops

port_loop:
        in      al, dx          ;read from port
        and     al, 0Fh         ;if jstick present, then AL should be
        cmp     al, 0Fh         ; 0Fh after ANDing with 0Fh.
        je      jstick_exists
        loop    port_loop
        mov     dx, OFFSET no   ;gameport not installed
        jmp     SHORT done

jstick_exists:                 
        mov     dx, OFFSET yes  ;gameport installed

done:   mov     ah, 9h
        int     21h

        mov     ax, 4c00h
        int     21h

END     start

El resultado en binario será el mismo en cada ensamblador (usando, por supuesto, el mismo linker)?

Es este aspecto el que hace un ensamblador 'mejor' o 'peor' que otro o solo es los formatos que acepta, los macros... etc.

¡Un abrazo! Agradezco de antemano sus respuestas :)


Título: Re: Diferencias resultado ensambladores (no, no es la pregunta clásica VS)
Publicado por: Yurix en 21 Diciembre 2010, 19:52 pm

La respuesta parcial es SI , empezamos >

En el conjunto de instrucciones X86 hay instrucciones que se pueden codificar de varias maneras , incluso manteniendo el mismo tama;o. Se puede incluso identificar el ensamblador o compilador que se uso ,gracias a esto que te acabo de escribir.

Incluso hay un programa que incrusta informacion dentro de los opcodes sin modificar el funcionamiento.

Lee >
http://www.strchr.com/machine_code_redundancy
http://www.crazyboy.com/hydan/

Por ejemplo , un compilador o ensamblador (de calidad) puede usar una instruccion mas larga para que la proxima instruccion este alineada (con las respectivas ganancias en velocidad que esto puede traer si esa instruccion se encuentra dentro de un loop donde sera ejecutada varias veces)

ver alineamiento en >:
http://www.asmcommunity.net/book/Alignment


Saludos
Espero que te sea util.





Título: Re: Diferencias resultado ensambladores (no, no es la pregunta clásica VS)
Publicado por: farresito en 26 Diciembre 2010, 11:26 am
Muchisimas gracias por tu respuesta y por la buena explicacion :)

Todo entendido :)

¡Un abrazo!