Como deseamos tener una copia del programa en papel
para analizarlo con tranquilidad, debemos tener la posibilidad de imprimir el
programa desensamblado, o almacenarlo en un fichero.
Esta es, pues, la versión de
listado de programa sobre buffer. Básicamente es la misma que la de impresión
de pantalla, con la salvedad de que aquí no se limitará a un número concreto de
instrucciones, sino que realizará el programa completo. Pero ese control lo
llevará el programa padre. Este versión de la instrucción se limita a cambiar
la salida de impresión de la pantalla a un buffer de impresión llamado
bufferprn, sobre el que se generará el listado y que posteriormente será
lanzado sobre la impresora o a un fichero.
PRN_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
include io.mac
include string.mac
.model compact,pascal
public prn_inst
.data
extrn bufferprn:byte
dato dw 0,0
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)
hprn dw 0
numero db 10 dup (0)
nlinea db 13,10,0
mas db "+",0
menos db "-",0
code
extrn interpreta:near
extrn lee:near
prn_inst proc near uses dx cx bx
call interpreta
mov bx,ax
mov al,[bx]
cmp al,0 ;solo codigo instrucc. de 1 byte
jnz decod1
strcat bufferprn,bufferprn,[bx+3]
jmp linea
decod1:
cmp al,1 ;1 codigo inst , 1 byte de dato
jnz decod2
strcat bufferprn,bufferprn,[bx+3]
call lee
inc dx
mov cl,al
mov ch,0
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
jmp linea
decod2:
cmp al,2 ;1codico + 2 byte
jnz decod3
strcat bufferprn,bufferprn,[bx+3]
call lee
inc dx
mov ch,al
call lee
inc dx
mov cl,al
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
jmp linea
decod3:
cmp al,3 ;1 codigo + 1 byte + codigo
jnz decod4
strcat bufferprn,bufferprn,[bx+3]
call lee
inc dx
mov cl,al
mov ch,0
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
inc bx
inc bx
busca1:
inc bx
cmp byte ptr [bx],0
jnz busca1
strcat bufferprn,bufferprn,[bx+1]
jmp linea
decod4: ;1 codigo + 2 byte + codigo
cmp al,4
jnz decod5
strcat bufferprn,bufferprn,[bx+3]
call lee
inc dx
mov cl,al
call lee
inc dx
mov ch,al
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
inc bx
inc bx
busca2:
inc bx
cmp byte ptr [bx],0
jnz busca2
strcat bufferprn,bufferprn,[bx+1]
jmp linea
decod5:
cmp al,5 ;1 codigo + 1 byte relativo + codigo + byte
jz escod5
jmp DECOD6
escod5:
strcat bufferprn,bufferprn,[bx+3]
call lee
inc dx
mov cl,al
mov ch,0
cmp cl,0
jz busc3
test cx,80h
jz positivo1
strcat bufferprn,bufferprn,menos
not cl
inc cx
jmp short negativo1
positivo1:
strcat bufferprn,bufferprn,mas
negativo1:
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
busc3:
inc bx
inc bx
busca3:
inc bx
cmp byte ptr [bx],0
jnz busca3
strcat bufferprn,bufferprn,[bx+1]
call lee
inc dx
mov cl,al
mov ch,0
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
jmp linea
decod6:
cmp al,6 ;SALTO RELATIVO
jnz decod7
strcat bufferprn,bufferprn,[bx+3]
call lee
inc dx
cbw
add ax,dx
mov cx,ax
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
jmp linea
decod7:
cmp al,7 ;1 codigo + 1 byte relativo + codigo
jz ss1
jmp caso8
ss1:
strcat bufferprn,bufferprn,[bx+3]
call lee
inc dx
mov cl,al
mov ch,0
cmp cl,0
jz busc7
test cx,80h
jz positivo
strcat bufferprn,bufferprn,menos
not cl
inc cx
jmp short negativo
positivo:
strcat bufferprn,bufferprn,mas
negativo:
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
busc7:
inc bx
inc bx
busca7:
inc bx
cmp byte ptr [bx],0
jnz busca7
strcat bufferprn,bufferprn,[bx+1]
jmp linea
caso8:
cmp al,8
jz ss2
jmp caso9
ss2:
strcat bufferprn,bufferprn,[bx+3]
call lee
inc dx
mov cl,al
mov ch,0
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
inc bx
inc bx
busca8:
inc bx
cmp byte ptr [bx],0
jnz busca8
strcat bufferprn,bufferprn,[bx+1]
call lee
inc dx
mov cl,al
mov ch,0
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
jmp linea
caso9:
cmp al,9 ;texto + direc 8 bits + texto + dato 8 bits rel
jnz alcaso9
jmp caso10
alcaso9:
strcat bufferprn,bufferprn,[bx+3]
call lee
inc dx
mov cl,al
mov ch,0
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
inc bx
inc bx
busca9:
inc bx
cmp byte ptr [bx],0
jnz busca9
strcat bufferprn,bufferprn,[bx+1]
call lee
inc dx
cbw
add ax,dx
mov dato,AX
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
jmp linea
caso10:
cmp al,10 ;texto + direcc 11 bits
jnz alcaso10
jmp caso11
alcaso10:
strcat bufferprn,bufferprn,[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
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
jmp linea
caso11:
cmp al,11 ;texto + bit
jnz alcaso11
jmp caso12
alcaso11:
strcat bufferprn,bufferprn,[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
strcat bufferprn,bufferprn,[bx+3] ;envia nombre del registro
pop ax
pop bx
directo:
mov cl,al
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
jmp linea
caso12:
cmp al,12 ;texto + bit + texto
jnz alcaso12
jmp caso13
alcaso12:
strcat bufferprn,bufferprn,[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
strcat bufferprn,bufferprn,[bx+si] ;envia nombre del registro
pop ax
pop bx
directo12:
mov cl,al
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
inc bx
inc bx
busca12:
inc bx
cmp byte ptr [bx],0
jnz busca12
strcat bufferprn,bufferprn,[bx+1]
jmp linea
caso13:
cmp al,13 ;texto + bit + texto
jnz alcaso13
jmp linea
alcaso13:
strcat bufferprn,bufferprn,[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
strcat bufferprn,bufferprn,[bx+si] ;envia nombre del registro
pop ax
pop bx
directo13:
mov cl,al
mov dato,cx
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
inc bx
inc bx
busca13:
inc bx
cmp byte ptr [bx],0
jnz busca13
strcat bufferprn,bufferprn,[bx+1]
call lee
inc dx
cbw
add ax,dx
mov dato,AX
itoa numero,dato,@h
strcat bufferprn,bufferprn,numero
jmp linea
linea:
strcat bufferprn,bufferprn,nlinea
ret
prn_inst endp
end prn_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.