Vistas de página en total

viernes, 24 de enero de 2014

EMULADOR 8051 (4/12) (DESENSAMBLADOR)

   Esta rutina será el nivel superior al interprete colocado dos entradas atrás. Apoyándose en el intérprete, esta función compondrá el texto completo de la instrucción en ensamblador, con los datos correspondiente de la instrucción.
  Para conseguirlo llamará con el código máquina de la instrucción al Intérprete, el cual le devolverá un puntero a la estructura de la instrucción. Según esta estructura, el desensamblador irá imprimiendo los textos que representan el código de instrucción e irá leyendo el resto de los datos para presentarlos posteriormente.


   Por todo esto la instrucción la llamé "presenta instrucción", dado que la hice de forma que directamente presentaba en pantalla la instrucción. Para usarla, simplemente, el programa que genera el listado de instrucciones irá situando en pantalla el puntero e irá llamando a esta función pasando en dx el offset de la instrucción en código máquina correspondiente.

PRES_INST.ASM
; Copyright (C) 2013  José Ángel Moneo Fernández

;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;   (at your option) any later version.

;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.

;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/

include main.mac
include stdio.mac
.model compact,pascal
         public pres_inst
         
.data
dato dw 0,0
;lista de registros para colocar en su lugar durante la interpretación de la instrucción
registro db "P0.",5 DUP (0)
         db "TCON.",3 DUP (0)
         db "P1.",5 DUP (0)
         db "SCON.",3 DUP (0)
         db "P2.",5 DUP (0)
         db "IE.",5 DUP (0)
         db "P3.",5 DUP (0)
         db "IP.",5 DUP (0)
         db "PSW.",4 DUP (0)
         db "ACC.",4 DUP (0)
         db "B.",6 DUP (0)


.code
       
        extrn interpreta:near
        extrn lee:near
pres_inst proc uses cx bx
      ;en dx se le psasrá la direccción del código a interpretar
        call interpreta     ;llama a la interpretación indicando la dirección en dx
        mov bx,ax
        mov al,[bx]
        cmp al,0                        ;solo codigo instrucc. de 1 byte
        jnz decod1
        printf byte ptr [bx+3]
        jmp linea
decod1:
        cmp al,1                 ;1 codigo inst , 1 byte de dato
        jnz decod2
        printf byte ptr [bx+3]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        mov dato,cx
        printf dato,@h
        jmp linea
decod2:
        cmp al,2                ;1codico + 2 byte
        jnz decod3
        printf byte ptr [bx+3]
        call lee
        inc dx
        mov ch,al
        call lee
        inc dx
        mov cl,al
        mov  dato,cx
        printf dato,@h
        jmp linea

decod3:
        cmp al,3                ;1 codigo + 1 byte + codigo
        jnz decod4
        printf byte ptr [bx+3]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        mov dato,cx
        printf dato,@h
        inc bx
        inc bx
busca1:
        inc bx
        cmp byte ptr [bx],0
        jnz busca1
        printf byte ptr [bx+1]
        jmp linea

decod4:                         ;1 codigo + 2 byte + codigo
        cmp al,4
        jnz decod5
        printf byte ptr [bx+3]
        call lee
        inc dx
        mov cl,al
        call lee
        inc dx
        mov ch,al
        mov dato,cx
        printf dato,@h
        inc bx
        inc bx
busca2:
        inc bx
        cmp byte ptr [bx],0
        jnz busca2
        printf byte ptr [bx+1]
        jmp linea
decod5:
        cmp al,5                ;1 codigo + 1 byte relativo + codigo + byte
        jz escod5
        jmp DECOD6
escod5:
        printf byte ptr [bx+3]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        cmp cl,0
        jz busc3
        test cx,80h
        jz positivo1
        putchar '-'
        not cl
        inc cx
        jmp short negativo1
positivo1:
        putchar '+'
negativo1:
        mov dato,cx
        printf dato,@h
busc3:
        inc bx
        inc bx
busca3:
        inc bx
        cmp byte ptr [bx],0
        jnz busca3
        printf byte ptr [bx+1]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        mov dato,cx
        printf dato,@h
        jmp linea

decod6:
        cmp al,6                        ;SALTO RELATIVO
        jnz decod7
        printf byte ptr [bx+3]
        call lee
        inc dx
        cbw
        add ax,dx
        mov dato,AX
        printf dato,@h
        jmp linea

decod7:
        cmp al,7                ;1 codigo + 1 byte relativo + codigo
        jnz caso8
        printf byte ptr [bx+3]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        cmp cl,0
        jz busc7
        test cx,80h
        jz positivo
        putchar '-'
        not cl
        inc cx
        jmp short negativo
positivo:
        putchar '+'
negativo:
        mov dato,cx
        printf dato,@h
busc7:
        inc bx
        inc bx
busca7:
        inc bx
        cmp byte ptr [bx],0
        jnz busca7
        printf byte ptr [bx+1]
        jmp linea

caso8:
        cmp al,8                ;texto + direc 8 bits + texto + dato 8 bits
        jnz caso9
        printf byte ptr [bx+3]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        mov dato,cx
        printf dato,@h
        inc bx
        inc bx
busca8:
        inc bx
        cmp byte ptr [bx],0
        jnz busca8
        printf byte ptr [bx+1]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        mov dato,cx
        printf dato,@h
        jmp linea

caso9:
        cmp al,9                ;texto + direc 8 bits + texto + dato 8 bits rel
        jnz caso10
        printf byte ptr [bx+3]
        call lee
        inc dx
        mov cl,al
        mov ch,0
        mov dato,cx
        printf dato,@h
        inc bx
        inc bx
busca9:
        inc bx
        cmp byte ptr [bx],0
        jnz busca9
        printf byte ptr [bx+1]
        call lee
        inc dx
        cbw
        add ax,dx
        mov dato,AX
        printf dato,@h
        jmp linea

caso10:
        cmp al,10                ;texto + direcc 11 bits
        jnz caso11
        printf byte ptr [bx+3]
        dec dx      ;releeo el codigo para obtener la parte alta de la direccion
        call lee
        inc dx
        mov cl,5
        shr al,cl
        mov ch,al
        call lee
        inc dx
        mov cl,al
        mov  dato,cx
        printf dato,@h
        jmp linea
caso11:
        cmp al,11                ;texto + bit
        jnz caso12
        printf byte ptr [bx+3]
        call lee
        inc dx
        cmp al,7fh
        jbe directo
        push bx
        sub al,80h
        mov ah,al
        and al,07h
        push ax
        and ah,0f8h
        mov bl,ah
        xor bh,bh
        mov si,offset registro
        printf byte ptr [bx+si]   ;envia nombre del registro
        pop ax
        pop bx
directo:
        mov cl,al
        mov  dato,cx
        printf dato,@h
        jmp linea
caso12:
        cmp al,12                ;texto + bit + texto
        jnz caso13
        printf byte ptr [bx+3]
        call lee
        inc dx
        cmp al,7fh
        jbe directo12
        push bx
        sub al,80h
        mov ah,al
        and al,07h
        push ax
        and ah,0f8h
        mov bl,ah
        xor bh,bh
        mov si,offset registro
        printf byte ptr [bx+si]   ;envia nombre del registro
        pop ax
        pop bx
directo12:
        mov cl,al
        mov  dato,cx
        printf dato,@h
        inc bx
        inc bx
busca12:
        inc bx
        cmp byte ptr [bx],0
        jnz busca12
        printf byte ptr [bx+1]
        jmp linea
caso13:
        cmp al,13                ;texto + bit + texto + dato 8bits
        jz acaso13
        jmp linea
acaso13:
        printf byte ptr [bx+3]
        call lee
        inc dx
        cmp al,7fh
        jbe directo13
        push bx
        sub al,80h
        mov ah,al
        and al,07h
        push ax
        and ah,0f8h
        mov bl,ah
        xor bh,bh
        mov si,offset registro
        printf byte ptr [bx+si]   ;envia nombre del registro
        pop ax
        pop bx
directo13:
        mov cl,al
        mov  dato,cx
        printf dato,@h

        inc bx
        inc bx
busca13:
        inc bx
        cmp byte ptr [bx],0
        jnz busca13
        printf byte ptr [bx+1]
        call lee
        inc dx
        cbw
        add ax,dx
        mov dato,AX
        printf dato,@h
        jmp linea

linea:
        ret
pres_inst endp

end pres_inst

No hay comentarios:

Publicar un comentario

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.