Escolar Documentos
Profissional Documentos
Cultura Documentos
cb
;------------------------------------------------------------------------------------------------------------------------------------------------------------]
; INTRODUÇÂO:
; Esta é uma rotina construída em linguagem assembly para desassemblar instruções dos processadores INTEL/AMD. Ela deve
; ser introduzida como rotina no programa principal.
; RESUMO:
; Dado um determinado endereço binário apontado por ebx, o programa escreve numa região da memória indicada por es:edi,
; a instrução assembly que representa o código existente no endereço fornecido.
; Códigos "vazio" não marcam carry flag. As instruções terão sempre de 2 bytes
; flags de ch
; #7 0- end #16 1- end#32
; #6 0- op #16 1- op#32
; #5 0- dado byte 1- dado word ou dword
; #4 0-rm,r 1- r,rm
; #3 uso diverso, depende da instrução
; #2,1,0 000- sem prefixo,
; 001- es:,
; 010- cs:,
; 011- ss:,
; 100- ds:,
; 101- fs:,
; 110- gs:,
; 111- não usado
; Condições que geram erro devem posicionar #0[dh]=1 para na saida posicionar cy=1
; Instrução lock marca #2[dh]=1 para ser utilizado pelas demais instruções para verificar a validade das mesmas.
Page: 1
File: C:\PGM\desa_prg32 COMPLETO.cb
; ROTINA PRINCIPAL
align 4
desa_ini:
push edx
and ch, 0xc0 ; só usa os bits #6 e #7 (ver detalhes)
mov dh, ch ; salva ambiente em dh
push esi
Page: 2
File: C:\PGM\desa_prg32 COMPLETO.cb
; ROTINAS AUXILIARES
align 4
opcode_cont dd 0
buffer_opcode rb 0xf
imp_opcodehex : ; Escreve um byte de opcode em memoria
push ebx
movzx ebx, byte [opcode_cont]
mov byte [buffer_opcode+ebx], al ; exige um buffer em memória para composição
inc ebx ; INCREMENTA CONTADOR
mov byte [opcode_cont], bl
pop ebx
ret
align 4
imp_dwOpcodehex :
push ebx
movzx ebx, byte [opcode_cont]
mov byte [buffer_opcode+ebx], al
inc ebx
ror eax, 8
mov byte [buffer_opcode+ebx], al
inc ebx
ror eax, 8
mov byte [opcode_cont],bl
pop ebx
ret
align 4
imp_ddOpcodehex :
push ebx
movzx ebx, byte [opcode_cont]
mov byte [buffer_opcode+ebx], al
inc ebx
ror ax, 8
mov byte [buffer_opcode+ebx], al
inc ebx
ror ax, 8
mov byte [buffer_opcode+ebx], al
inc ebx
ror ax, 8
mov byte [buffer_opcode+ebx], al
inc ebx
ror ax, 8
mov byte [opcode_cont],bl
pop ebx
ret
align 4
Imp_al:
mov [edi], al
inc edi
inc edi
retn
align 4
imp_byhex: ; Imprime um byte em hexadecimal
.a: aam 0x10
cmp ah,0x09
jna .b
add ah,0x07
.b: cmp al,0x09
jna .c
add al,0x07
.c: add ax,0x3030
xchg ah,al
Page: 3
File: C:\PGM\desa_prg32 COMPLETO.cb
call Imp_al
xchg ah,al
call Imp_al
retn
align 4
imp_wohex:
push ecx
mov ecx,2
push edx
mov edx,eax
.c: rol edx,0x08
mov al,dl
call imp_byhex
loop .c
pop edx
pop ecx
.b: retn
align 4
imp_ddhex:
.a: push ecx
mov ecx,4
push edx
mov edx,eax
.c: rol edx,0x08
mov al,dl
call imp_byhex ; Imprime 1 byte
loop .c
pop edx
pop ecx
.b: retn
align 4
imp_stringzGS: ; Imprime string tipo Z na posição indicada por es: edi
.b: mov al,[esi]
or al,al
je .a
inc esi
mov [edi],al
inc edi
inc edi
jmp .b
.a: ret
; ROTINAS FF
align 4
desa01 : ; marca tamanho do operando
add esp, 0x04 ;***
test dh, 0x40
je .a
and ch, 0xbf ; 1011 1111, zera #6
jmp continue
.a: or ch, 0x40 ; seta #6
jmp continue ; continue: busca novo byte de código
ret
align 4
desa02 : ; marca tamanho do endereçamento
add esp, 0x04 ;***
test dh, 0x80
je .a
and ch, 0x7f ; zera #7
jmp continue
.a: or ch, 0x80 ; seta #7
Page: 4
File: C:\PGM\desa_prg32 COMPLETO.cb
align 4
desa03 : ; marca prefixo segmento (es, cs, ss, ds)
add esp, 0x04 ;***
and ch, 0xf8
test cl, 0x10
jne .a
test cl, 0x8
jne .b
or ch, 0x1 ; es
jmp continue
.a: test cl, 0x8
jne .c
or ch, 0x3 ; ss
jmp continue
.b: or ch, 0x2 ; cs
jmp continue
.c: or ch, 0x4 ; ds
jmp continue ; continue: busca novo byte de código
ret
align 4
desa04 : ; Marca prefixo segmento (fs, gs)
add esp, 0x4 ;***
and ch, 0xf8
test cl ,0x1
jne .a
or ch, 0x5 ; fs
jmp continue
.a: or ch, 0x6 ; gs
jmp continue ; continue: busca novo byte de código
ret
align 4
desa05 : ; Opcode de 2 bytes, reentra
mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al ; al=2o opcode (01,02,08 ou 09)
mov esi, eax
shl esi, 2 ;1
add esi, 0x400
add esp, 0x4 ;***
jmp reentra
ret
align 4
desa06 : ; Seleciona e imprime iv ou ib em função de #0[cl]
test cl, 0x1
jne desa09 ; Continua em desa08
align 4
desa09 : ; Seleciona iv ou iw em função de #6[cl]
test ch, 0x40
je desa0a
.a: mov eax, [ebx] ; Imprime id
call imp_ddOpcodehex
add ebx, 0x4
Page: 5
File: C:\PGM\desa_prg32 COMPLETO.cb
align 4
desa0a : ; Rotina imprime word hex
mov ax, [ebx]
call imp_dwOpcodehex
add ebx, 0x2
call imp_wohex ; Imprime iw hex
ret
align 4
desa07 : ; Seleciona e imprime ib, iv em função de #5[ch]
test ch, 0x20
jne desa09 ; #5[ch]=1, imprime word ou dword
jmp desa08 ; #5[ch]=0, imprime byte
ret
align 4
desa23 : ; Imprime endereço direto em função de #7[ch]
test ch,0x80
je desa0a ; Imprime iw
jmp desa09 ; Imprime iv (pode ser iw ou id)
align 4
desa0b : ; seleciona ab ou av em função de #0[cl]
test cl, 0x1
jne desa0f
push esi
mov esi, reg8
.a: call imp_stringzGS ; Imprime rb
pop esi
ret
align 4
desa0f : ; seleciona e imprime ax ou eax
push esi
mov esi, reg32
.b: test ch, 0x40
jne .a
inc esi
.a: call imp_stringzGS ; Imprime rw ou rd
pop esi
ret
align 4
desa15 : ; Imprime D, em função do prefixo 66 test ch, 0x40
je .a
mov al, 'd'
call Imp_al
.a: ret
align 4
desa32 : ; Imprime ib ou cl
test ch, 0x8
je desa06
push esi
mov esi, reg8+0x3
call imp_stringzGS
pop esi
ret
align 4
desa0e : ; Escolhe e imprime rv em função de #6[ch] e #0,1,2[cl]
Page: 6
File: C:\PGM\desa_prg32 COMPLETO.cb
mov al, cl
.a: push esi
mov esi, reg32
and ax, 0x7 ; filtra 8 condições
shl al, 0x2 ; al*4
add esi, eax
.b: test ch, 0x40
jne .c ; eax
inc esi ; ax
.c: call imp_stringzGS
pop esi
ret
align 4
desa10 : ; Escolhe e imprime rb em função de #0,1,2[cl]
mov al, cl
.a: push esi
mov esi, reg8
and eax, 0x7
.b: mov ah, al
shl al, 1 ; al*2+al=al*3
add al, ah
xor ah, ah
add esi, eax
call imp_stringzGS ; Imprime
pop esi
ret
align 4
desa11 : ; Seleciona e imprime condição
push esi
mov esi, cond
mov al, cl
and eax, 0x0f ; filtra 16 condições
mov ah, al ; pode-se usar jmp desa10.b neste ponto
shl al, 1 ;
add al, ah
xor ah, ah
add esi, eax
call imp_stringzGS
pop esi
ret
align 4
desa18 : ; Imprime B, W ou D
mov al, 'b'
test cl, 1
je .a
mov al, 'w'
test ch, 0x40
je .a
mov al, 'd'
.a: call Imp_al
ret
align 4
rmb_rmv : ; Busca byte rm e escolhe rmb / rmv ou rb / rv em função de #0[cl]
test cl, 1
je desa13
or ch, 0x20
desa13 : ; Busca byte rm e escolhe rmb / rmv ou rb / rv (memória ou registrador)
mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
rmv : ; Escolhe rmb / rmv ou rb / rv
xor al, 0xc0 ; verifica se #6,7 = 11 - end. por registrador
Page: 7
File: C:\PGM\desa_prg32 COMPLETO.cb
align 4
aux_busca :
mov esi, [esi] ; busca ponteiro da string
.a: mov al, [esi] ; loop de impressão
inc esi
cmp al, 0xff
je .b
or al, al
je .saida
call Imp_al ; Imprime al (Imp_al)
jmp .a
.b: mov al, [esi] ; busca rotina ff
inc esi
;and eax, 0xff
shl eax, 2
call dword [eax + base_rotinas_ff - 0x4]
xor eax, eax ; GARANTE EAX=0
jmp .a
.saida: ret
align 4
desa3a : ; Imprime rmb ou rmv dependendo de #5[ch] (usada pelas instruções do grupo 4 e 5)
push esi
mov al,cl
call desa16.b ; rb ou mb
pop esi
ret
align 4
desa16 : ; Imprime rmb ou rmv com prefixo de segmento + by, wo ou dw
test cl, 1
je .a
.c: or ch, 0x20
.a: mov al, [ebx]
call imp_opcodehex
inc ebx
.b: mov cl, al
xor al, 0xc0 ; busca rm, inverte #6,7 (qq valor=1 -> busca mem)
test al, 0xc0
je rv ; busca r
call aux16 ; Imprime by, wo ou dw
jmp memv ; busca m
align 4
aux16 :
push esi
Page: 8
File: C:\PGM\desa_prg32 COMPLETO.cb
align 4
desa17 : ; Busca e imprime registrador de segmento como prefixo
mov al, ch
and eax, 0x7
je .a
call aux17
mov al, ':'
call Imp_al
.a: ret
align 4
aux17 : push esi ; Imprime registrador de segmento
mov esi, regseg - 0x3
jmp desa10.b
align 4
desa19 : ; Altera "si" para buscar uma das quatro instruções: "cbw", "cwde", "cwd" ou "cdq"
mov esi, _cbw
test cl, 1
jne .a
test ch, 0x40
je .saida
mov esi, _cwde
jmp .saida
.a: mov esi, _cwd
test ch, 0x40
je .saida
mov esi, _cdq
.saida: ret ; saida geral
align 4
desa1a : ; Imprime endereço relativo curto
movsx eax, byte [ebx]
call imp_ddOpcodehex
inc ebx
.a: add eax, ebx
test ch, 0x40
je near imp_wohex
jmp imp_ddhex
align 4
desa1b : ; Imprime endereço relativo longo
test ch, 0x80
jne .a
movsx eax, word [ebx]
call imp_ddOpcodehex
add ebx, 0x2
jmp desa1a.a
.a: mov eax, [ebx]
call imp_ddOpcodehex
add ebx, 0x4
jmp desa1a.a
align 4
desa1c : ; Imprime es, cs, ss ou ds (OK 30/01/01 15:43)
push esi
Page: 9
File: C:\PGM\desa_prg32 COMPLETO.cb
align 4
desa1d : ; Imprime fs ou gs
push esi
mov esi, regseg + 0x0C
test cl, 0x8
je .a
add esi, 0x3
.a: call imp_stringzGS
pop esi
ret
align 4
desa1e : ; Imprime ecx ou cx
push esi
mov esi, reg32 + 0x4
test ch, 0x40
jne .a
inc esi
.a: call imp_stringzGS
pop esi
ret
align 4
desa1f : ; Imprime ne ou e em função de #0[cl]
push esi
mov esi, cond + 0x0f
test cl, 1
je .a
inc esi
.a: call imp_stringzGS
pop esi
ret
align 4
desa20 : ; Escolhe um dos nomes adc, or, add...cmp em função de #3,4,5[cl]
mov al, cl ; OK 30/03/01 20:29
test al, 0x2
je .a
or ch, 0x10
.a: push esi
mov esi, grupo1 ; adc, or, add....cmp
.b: shr al, 1
and eax, 0x1c
add esi, eax
call imp_stringzGS
pop esi
ret
align 4
desa21: ; Busca byte rm e imprime "rv,rmv/rmv,rv" ou "rb,rmb/rmb,rb"
test ch, 0x10 ; (vale todo intervalo para byte rm)
je .a
test cl, 1
je .b
.c: or ch, 0x20
.b: mov al, [ebx]
Page: 10
File: C:\PGM\desa_prg32 COMPLETO.cb
call imp_opcodehex
inc ebx
mov cl, al
.d: call R_reg ; imprime r'
.e: mov al, ','
call Imp_al
mov al, cl
jmp rmv ; imprime m ou r
.a: call rmb_rmv ; Imprime m ou r
mov al, ','
call Imp_al ; continua em R_reg
R_reg: ; Imprime rb ou rv em função de #4,5,6[cl]
mov al, cl
shr al, 0x3
test ch, 0x20
jne near desa0e.a ; Imprime rv
jmp desa10.a ; Imprime rb
align 4
desa22 : ; Imprime "mov" setando #5[ch] se #0[cl]=1 e #4[ch] se #1[cl]=1
push esi
mov esi, _mov
test cl, 0x1
je .a
or ch, 0x20
.a: test cl, 0x2
je near desa1d.a
or ch, 0x10
call imp_stringzGS
pop esi
ret
align 4
desa24: ; Busca byte rm e seleciona um dos nomes do grupo1 em função #3,4,5[byte rm]
test cl, 1
je .a
or ch, 0x20
.a: mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
call desa20.a ; busca nome da instrução em função #3,4,5[byte rm]
.b: mov al, ' '
call Imp_al ; Imprime espaço
mov al, cl
jmp desa16.b ; busca end à memória em função #1,2,3[byte rm]
align 4
desa25: ; Busca byte rm e seleciona um dos nomes do grupo 2....
test cl, 0x1
je .a
or ch, 0x20
.a: mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
call aux25 ; busca nome do grupo 2 em função #3,4,5[byte rm]
jmp desa24.b ; repete rotina de endereçamento à memória
align 4
aux25 : ; Busca nome das instruções do grupo 2
push esi
mov esi, grupo2
jmp desa20.b
align 4
desa26 : ; Imprime aviso3 (para ser usada somente internamente à rotina aux_busca (ver grupo3))
Page: 11
File: C:\PGM\desa_prg32 COMPLETO.cb
push esi ; aux27, mas deve ser indexada por isso recebeu o nome desa26
mov esi, aviso3
call imp_stringzGS
add esp, 0x0c
pop esi
or dh, 0x01
add esp, 0x4
ret
align 4
desa27 : ; Busca byte rm e escolhe nome do grupo 3...
test cl, 1
je .a
or ch, 0x20
.a: mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
push esi
mov esi, grupo3
shr al, 0x3
and eax, 0x7
je .b ; instrução test m,i
mov ah, al ; rotina para as demais instruções (NOT...NEG...)
shl al, 0x2 ; x4
add al, ah ; x5
and eax, 0x3f ; filtra
add esi, eax ; ajusta ponteiro
call aux_busca.a ; se a rotina 0xff26 for encontrada, imprime aviso3 e sai
pop esi
mov al, ' '
call Imp_al ; Imprime espaço
mov al, cl
jmp desa16.b
.b: ; test rmv,iv
call aux_busca.a ; rotina específica para test rmv,iv
mov al, ' '
call Imp_al ; Imprime espaço
mov al, cl
call desa16.b ; busca rmv
mov al, ','
call Imp_al ; Imprime ','
pop esi
jmp desa07
align 4
desa28 : ; Busca endereço far imediato
test ch, 0x40
je .a
push dword [ebx]
add ebx, 0x4
call desa0a
mov al, ':'
call Imp_al
pop eax
call imp_ddhex
retn
.a: push word [ebx]
add ebx, 0x2
call desa0a
mov al, ':'
call Imp_al
pop eax
call imp_wohex
ret
align 4
Page: 12
File: C:\PGM\desa_prg32 COMPLETO.cb
align 4
desa2a: ; Executa rotina 21 com #5[ch]=1.
or ch, 0x10 ; Referencia incondicional à memoria tipo rv,rmv
jmp desa21.c
align 4
desa2b : ; Busca byte rm e busca endereçamento à memoria (rv,m).
or ch, 0x20 ; marca para rv, para usar a rotina 21
mov al, [ebx] ; Referencia a registrador imprime instrução inválida
call imp_opcodehex
inc ebx
mov cl, al
xor al, 0xc0
test al, 0xc0
jne near desa21.d
push esi ; instrução inválida se referenciar um registrador
Page: 13
File: C:\PGM\desa_prg32 COMPLETO.cb
align 4
desa2c: ; Executa rotina 21 com #6[ch]=0. usada pela instrução "arpl"
and ch, 0xbf
jmp desa21.a
align 4
desa2d : ; Busca byte rm especifica para referencia a registradores de segmento (rseg,mem ou mem,rseg)
or ch, 0x20
and ch, 0xbf ; fixa registradores sempre do tipo word
test cl, 2
je .a
mov al, [ebx] ; ordem rseg, mem
call imp_opcodehex
inc ebx
mov cl, al
or ch, 0x8 ; fixa o modo de uso da rotina aux2d
call aux2d
jmp desa21.e
.a: call desa13 ; ordem mem, rseg
mov al, ','
call Imp_al
aux2d: push esi
mov esi, regseg
mov al, cl
and eax, 0x38
test ch, 0x8
je .a
cmp al, 0x8
je .b
.a: mov ah, al
shl al, 1
add al, ah
shr al, 3
cmp al, 0xf
ja .b
xor ah, ah
add esi, eax
jmp .c
.b: mov esi, aviso2
or dh, 0x1 ; posiciona erro
.c: call imp_stringzGS
pop esi
ret
align 4
desa2e : ; Rotina especifica para prefixos "rep", "repe" e "repne"
mov al,[ebx]
call imp_opcodehex
inc ebx
push eax
xor al, 0xa6
test al, 0xa6
jne .a ; pula se for "rep"
call desa1f ; Imprime "e" ou "ne"
.a: mov al, ' '
call Imp_al
pop eax
mov cl, al
mov esi, eax
Page: 14
File: C:\PGM\desa_prg32 COMPLETO.cb
; antiga rotina 2f
; sem_uso mov al, [ebx]
; call imp_opcodehex
; inc ebx
; mov cl, al
; mov si, ax
; shl si, 1
; jmp aux_busca
align 4
desa30 : ; Rotina especifica para as instruções movsx e movzx
test cl, 1
je .a
or ch, 0x20
.a: mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
test ch, 0x20
je .b
or ch, 0x40
call R_reg
and ch, 0xbf
.c: mov al, ','
call Imp_al
mov al, cl
jmp desa16.b
.b: ;or ch, 0x01
call R_reg
and ch, 0x9f
jmp .c
ret
align 4
desa31 : ; Busca byte rm para endereçamento tipo rmv,rv. marca #3[ch]=1 se #0[byte anterior]=1
test cl, 1
je .a
or ch, 0x08
.a: call desa16.c ; busca byte rm e imprime m ou r
mov al, ','
call Imp_al
jmp R_reg ; Imprime r'
align 4
desa33 : ; Escolhe e imprime uma das letras: "s", "r" ou "c"
mov al, cl
sub al, 0xa3
je .a
shr al, 0x1
push esi
mov esi, src - 0x2
add esi, eax
call imp_stringzGS
pop esi
.a: ret
align 4
desa34 : ; Escolhe e imprime uma das letras: "s", "r" ou "c", específica para grupo 8
mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
and eax, 0x38
Page: 15
File: C:\PGM\desa_prg32 COMPLETO.cb
shr al, 1
or ch, 0x8
cmp al, 0x8
je .a
push esi
jb .b
mov esi, src - 0xa
add esi, eax
.c: call imp_stringzGS
pop esi
.a: retn
.b: mov al, 'x' ; instrução inválida se fora do intervalo válido
call Imp_al ; #3,4,5[byte rm] < 4
mov esi, aviso5
or dh, 0x01
jmp .c
align 4
desa35 : ; Escolhe uma das funções do grupo 0f00 ("ldtr", "str"....etc), em função de #3,4,5[byte rm]
push esi
mov esi, grupo6
.a: mov al, [ebx] ; busca byte rm
call imp_opcodehex
inc ebx
mov cl, al
and eax, 0x38
xor ah, ah
shr al, 1 ; desloca 8 por 1(/2) para calcular o endereço dentro do bloco
grupo6
add esi, eax
call aux_busca.a
pop esi
ret
align 4
desa36 : ; Busca endereçamento rmw em função de #0,1,2[cl]
and ch, 0xbf ; zera #6, seta #5
or ch, 0x20 ; fixa variavel em word
mov al, cl
jmp desa16.b ; busca modo de endereçamento
align 4
desa37 : ; Busca endereçamento m em função de #0,1,2[cl].
mov al, cl ; O tamanho do operando depende da instrução
xor al, 0xc0
test al, 0xc0
je desa38 ; mostra aviso de instrução inválida se o endereço referenciar
registrador
jmp rmv ; busca modo de endereçamento
align 4
desa38 : ; Imprime "Instrução inválida"
push esi
mov esi, aviso1
call imp_stringzGS
pop esi
or dh, 0x01 ; posiciona marca para erro
ret
align 4
desa39 : ; Escolhe uma das funções do grupo 0f01, em função de #3,4,5 [byte rm]
push esi
mov esi, grupo7
jmp desa35.a
align 4
desa3b : ; Busca byte rm e escolhe uma das instruções do grupo 5
Page: 16
File: C:\PGM\desa_prg32 COMPLETO.cb
or ch, 0x20
mov esi, grupo5
mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
jmp aux4d
align 4
desa3c : ; Imprime rmv (usada pela instrução push rmv do grupo 5)
or ch, 0x20
jmp desa16.b
align 4
desa44 : ; Busca proximo byte e imprime "mov" posicionando #6[ch]=1,
mov al, [ebx] ; (usada nas instruções tipo mov cr0, rd)
call imp_opcodehex
inc ebx
mov cl, al
or ch, 0x40 ; continua na rotina 3d
align 4
desa3e : ; Imprime 'pop'
push esi
mov esi, _pop
call imp_stringzGS
pop esi
ret
align 4
desa3f : ; Imprime 'push'
push esi
mov esi, _push
call imp_stringzGS
pop esi
ret
align 4
desa0c : ; Diferencia [endereçamento direto] de [bp+deslocamento]
test cl, 0xc0
je .a ; se #6,7[cl]=0 buscar .a ou .b (end dir)
push esi
mov esi,0xabcd
mov esi, insbp
call aux_busca.a
pop esi
retn
.a: ; Busca endereçcamento direto word
test ch, 0x80
jne .b
mov ax, [ebx] ; pode-se substituir por jmp desa0a
call imp_dwOpcodehex
add ebx, 0x2
call imp_wohex
retn
.b: ; Busca endereçcamento direto dword
mov eax, [ebx] ; pode-se substituir por desa09.a
call imp_ddOpcodehex ; Imprime opcode
add ebx, 0x4
call imp_ddhex
Page: 17
File: C:\PGM\desa_prg32 COMPLETO.cb
ret
align 4
desa0d : ; Diferencia [endereçamento direto] de [ebp+deslocamento]
test cl, 0xc0
je desa0c.a
push esi
mov esi, insebp
call aux_busca.a
pop esi
ret
align 4
desa40 : ; Busca byte rm para instruções mpu (rotina principal)
push esi
mov al, cl
and eax, 0x7
mov dl, al
mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
xor al, 0xc0
test al, 0xc0
je .a
mov esi, R_d8 ; base do bloco com referencia à memória
and eax, 0x38
shr al, 1
add esi, eax
mov al, dl
shl al, 4
add esi, eax
call aux_busca
mov al, cl
call memv
pop esi
retn
.a: mov esi, R_d8.c0 ; base do bloco com referencia aos registradores
shl ax, 2 ;
add esi, eax
mov al, dl
shl ax, 7
add esi, eax
xor eax, eax
call aux_busca
pop esi
ret
align 4
desa41 : ; Imprime "st0,stx" em função de #0,1,2[cl]
push esi
mov esi, _st
call imp_stringzGS
mov al, ','
call Imp_al
mov al, cl
and eax, 0x7
shl al, 0x2
mov esi, _st
add esi,eax
call imp_stringzGS
pop esi
ret
align 4
desa42 : ; Imprime "stx,st0" em função de #0,1,2[cl]
push esi
Page: 18
File: C:\PGM\desa_prg32 COMPLETO.cb
align 4
desa43 : ; Imprime stx em função de #0,1,2[cl]
mov al, cl
and eax, 0x7
push esi
mov esi, _st
shl al, 0x2
add esi, eax
call imp_stringzGS
pop esi
R_ret: ret
align 4
desa45 : ;.Marca erro posicionando #1[dh]=1
or dh, 0x1
ret
align 4
desa46 : ; Marca #2[dh]=1 e continua. Rotina especifica para instrução lock
or dh, 0x2
add esp, 0x4
jmp continue
align 4
desa47 : ; Busca byte rm para instruções dos grupos 12, 13 e 14
mov al, cl
and eax, 3
je .a
dec al
shl al, 0x4
mov esi, grupo12
add esi, eax
mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
xor al, 0xc0
test al, 0xc0
jne near desa38 ; referencia à memoria deve buscar outro ponteiro
and eax, 0x38 ; ou indicar inst. inválida
shr al, 0x2 ;
add si, ax ; só altera si para busca do ponteiro
mov esi, [esi] ; busca novo ponteiro
ret
.a: mov esi, livre
ret
align 4
desa2f : ; Imprime #3,4,5[byte rm] como um numero entre 0 e 7
mov al, cl
and eax, 0x38
shr al, 0x3
add al, 0x30
call Imp_al
Page: 19
File: C:\PGM\desa_prg32 COMPLETO.cb
ret
; sem_uso2 ; Imprime D, em função do pref. 67 ( semelhante à desa15, mas sensivel ao bit #7[ch]
; test ch, 0x80
; je .a
; mov al, 'd'
; call Imp_al
;.a ret
align 4
desa14 : ; Busca byte sib
mov dl, [ebx]
inc ebx
mov al, dl
push esi
mov esi, reg32
and ax, 0x7
shl al, 0x2
add esi, eax
call imp_stringzGS
mov al, '+'
call Imp_al
mov al, dl
call imp_opcodehex ;*
shr al, 0x3
mov esi, reg32
and eax, 0x7
shl al, 0x2
add esi, eax
call imp_stringzGS
pop esi
push ecx
mov cl, dl
shr cl , 6
je .a
mov al , '*'
call Imp_al
mov al, 1
shl al, cl
add al, 0x30
call Imp_al
.a: pop ecx
jmp desa29
align 4
desa12 : ; Escolhe e imprime rd em função de #0,1,2[cl]
push esi
mov esi, reg32
and ax, 0x7
shl al, 0x2
add esi, eax
call imp_stringzGS
pop esi
ret
align 4
desa48 : ; Busca byte rm e escolhe umas das instruções do grupo 4
mov esi, grupo4
mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
jmp aux4d
align 4
desa49 : ; Busca byte rm para instruções mmx (rmmx, rmmx/m64)
mov al, [ebx]
Page: 20
File: C:\PGM\desa_prg32 COMPLETO.cb
call imp_opcodehex
inc ebx
mov cl, al
shr al, 3
call rmmx
mov al, ','
call Imp_al
mov al, cl
aux4a: xor al,0xc0
test al,0xc0
je near memv ; Escolhe memória
rmmx: push esi ; Imprime rmmx, se não for memória
mov esi, _xmm + 1
and eax, 0x7
shl eax, 2
add esi, eax
call imp_stringzGS
pop esi
ret
align 4
desa4a : ; Busca byte rm para instruções mmx reversas (rmmx/m64, rmmx)
mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
call aux4a
mov al, ','
call Imp_al
mov al, cl
shr al, 3
jmp rmmx
align 4
desa4b : ; Busca byte rm para instrução movd (rmmx,r/m32)
mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
shr al, 3
call rmmx
mov al, ','
call Imp_al
mov al, cl
or ch, 0x60 ; seta rd
jmp rmv
align 4
desa4c : ; Busca byte rm para instrução movdr (r/m32,rmmx)
mov al, [ebx]
call imp_opcodehex
inc ebx
mov cl, al
or ch, 0x60
call rmv
mov al, ','
call Imp_al
mov al, cl
shr al, 3
jmp rmmx
align 4
desa4d : ; Busca ponteiro para instruções do grupo 12
mov esi, grupo12
aux4d:
and eax, 0x38
shr al, 1
Page: 21
File: C:\PGM\desa_prg32 COMPLETO.cb
align 4
desa4e : ; Busca ponteiro para instruções do grupo 13
mov esi, grupo13
jmp aux4d
align 4
desa4f : ; Busca ponteiro para instruções do grupo 14
mov esi, grupo14
jmp aux4d
align 4
desa50 : ; Rotina usada pelas instruções dos blocos 12, 13 e 14
mov al,cl ; byte rm deve já estar em cl.
call rmmx ; Imprime reg mmx, ref. à memória devem buscar...
mov al, ','
call Imp_al
mov al, [ebx] ; busca dado imediato
call imp_opcodehex
inc ebx
call imp_byhex ; Imprime ib
ret
; DADOS CONSTANTES
; db 'desa1.3 jan01'
; Tabela de ponteiros das rotinas FF
align 4
base_rotinas_ff:
dd desa01 ; Marca prefixo de tamanho de operando
dd desa02 ; Marca prefixo de tamanho de endereço
dd desa03 ; Marca prefixo de segmento es, cs, ss ou ds
dd desa04 ; Marca prefixo de segmento fs ou gs
dd desa05 ; Marca instrução com dois bytes, busca opcode na tabela seguinte
dd desa06 ; Escolhe e imprime ib ou iv em função de #0[cl]
dd desa07 ; Seleciona e imprime ib, iv em função de #5[ch]
dd desa08 ; Imprime ib
dd desa09 ; Escolhe e imprime iw ou id em função de #6[ch]
dd desa0a ; Imprime iw
dd desa0b ; Escolhe e imprime al ou axv em função de #0[cl]
dd desa0c ; Diferencia [endereçamento direto] de [bp+deslocamento]
dd desa0d ; Diferencia [endereçamento direto] de [ebp+deslocamento]
dd desa0e ; Escolhe e imprime rv em função de #6[ch] e #0,1,2[cl]
dd desa0f ; Escolhe e imprime ax ou eax
dd desa10 ; Escolhe e imprime rb em função de #0,1,2[cl]
dd desa11 ; Escolhe e imprime condição
dd desa12 ; Imprime rd em função de #0,1,2[cl] (similar a desa0e, insensível ao pref. 66)
dd desa13 ; Busca byte rm e escolhe rmb / rmv ou rb / rv (memória ou registrador)
dd desa14 ; Busca byte sib
dd desa15 ; Imprime D, em função do prefixo 66
dd desa16 ; Imprime rmb ou rmv com prefixo de segmento + by, wo ou dd
dd desa17 ; Imprime prefixo de segmento em função #0,1,2[ch]
dd desa18 ; Imprime b, w ou d
dd desa19 ; Altera "si" para buscar uma das quatro : "cbw", "cwde", "cwd" ou "cdq"
dd desa1a ; Imprime endereço relativo curto
dd desa1b ; Imprime endereço relativo longo variável
dd desa1c ; Imprime es, cs, ss ou ds
dd desa1d ; Imprime fs ou gs
dd desa1e ; Imprime cx ou ecx
dd desa1f ; Imprime ne ou e
dd desa20 ; Imprime add, or, adc, sbb, and, sub, xor, cmp em função #3,4,5[cl]
dd desa21 ; Escolhe rv,rmv/rmv,rv ou rb,rmb/rmb,rb
dd desa22 ; Imprime 'mov' setando #5[ch] se #0[cl]=1
Page: 22
File: C:\PGM\desa_prg32 COMPLETO.cb
modo16:
dd m16.0
dd m16.1
dd m16.2
dd m16.3
dd m16.4
dd m16.5
dd m16.6
dd m16.7
modo32:
dd m32.0
dd m32.1
dd m32.2
dd m32.3
dd m32.4
dd m32.5
dd m32.6
dd m32.7
Page: 23
File: C:\PGM\desa_prg32 COMPLETO.cb
grupo4 dd _incx
dd _decx
dd livre
dd livre
dd livre
dd livre
dd livre
grupo4.7 dd livre
grupo5 dd _incx
dd _decx
dd _callx
dd _callfarx
dd _jmpx
dd _jmpfarx
dd _pusx
grupo5.7 dd livre
grupo13 dd livre
dd livre
dd _psrldi
dd livre
dd _psradi
dd livre
dd _pslldi
dd livre
grupo14 dd livre
dd livre
dd _psrlqi
dd livre
dd livre
dd livre
dd _psllqi
dd livre
; times 0x180 - ( _ - __ ) db 0
;-----------------------------------------------------------------------------------------------------------------------------------------------------------
Page: 24
File: C:\PGM\desa_prg32 COMPLETO.cb
Page: 25
File: C:\PGM\desa_prg32 COMPLETO.cb
Page: 26
File: C:\PGM\desa_prg32 COMPLETO.cb
Page: 27
File: C:\PGM\desa_prg32 COMPLETO.cb
Page: 28
File: C:\PGM\desa_prg32 COMPLETO.cb
Page: 29
File: C:\PGM\desa_prg32 COMPLETO.cb
dd aviso4 ; 0f 70-
dd _gr121314 ; 0f 71- grupo 12 -
dd _gr121314 ; 0f 72- grupo 13 -
dd _gr121314 ; 0f 73- grupo 14 - instruções de shift
dd _pcmpeqb ; 0f 74- pcmpeqb mmxreg,r/m64 (p5, mmx)
dd _pcmpeqw ; 0f 75- pcmpeqw mmxreg,r/m64 (p5, mmx)
dd _pcmpeqd ; 0f 76- pcmpeqd mmxreg,r/m64 (p5, mmx)
dd _emms ; 0f 77- emms (p5, mmx)
dd aviso4 ; 0f 78-
dd aviso4 ; 0f 79-
dd aviso4 ; 0f 7a-
dd aviso4 ; 0f 7b-
dd aviso4 ; 0f 7c-
dd aviso4 ; 0f 7d-
dd _movdr ; 0f 7e- movd r/m32,mmxreg (p5, mmx)
dd _movqr ; 0f 7f- movq r/m64,mmxreg (p5, mmx)
Page: 30
File: C:\PGM\desa_prg32 COMPLETO.cb
Page: 31
File: C:\PGM\desa_prg32 COMPLETO.cb
dd aviso4 ; 0f c5-
dd aviso4 ; 0f c6-
dd aviso4 ; 0f c7- grupo 9 - cmpxchgg8b mem (p5)
dd _bswap ; 0f c8- bswap eax (486)
dd _bswap ; 0f c9- bswap ecx (486)
dd _bswap ; 0f ca- bswap edx (486)
dd _bswap ; 0f cb- bswap ebx (486)
dd _bswap ; 0f cc- bswap esp (486)
dd _bswap ; 0f cd- bswap ebp (486)
dd _bswap ; 0f ce- bswap esi (486)
dd _bswap ; 0f cf- bswap edi (486)
dd livre ; 0f d0- *
dd _psrlw ; 0f d1- psrlw mmxreg,r/m64 (p5, mmx)
dd _psrld ; 0f d2- psrld mmxreg,r/m64 (p5, mmx)
dd _psrlq ; 0f d3- psrlq mmxreg,r/m64 (p5, mmx)
dd livre ; 0f d4- *
dd _pmullw ; 0f d5- pmullw mmxreg,r/m64 (p5, mmx)
dd livre ; 0f d6- *
dd aviso4 ; 0f d7-
dd _psubusb ; 0f d8- psubusb mmxreg,r/m64 (p5, mmx)
dd _psubusw ; 0f d9- psubusw mmxreg,r/m64 (p5, mmx)
dd aviso4 ; 0f da-
dd _pand ; 0f db- pand mmxreg,r/m64 (p5, mmx)
dd _paddusb ; 0f dc- paddusb mmxreg,r/m64 (p5, mmx)
dd _paddusw ; 0f dd- paddusw mmxreg,r/m64 (p5, mmx)
dd aviso4 ; 0f de-
dd _pandn ; 0f df- pandn mmxreg,r/m64 (p5, mmx)
dd aviso4 ; 0f e0-
dd _psraw ; 0f e1- psraw mmxreg,r/m64 (p5, mmx)
dd _psrad ; 0f e2- psrad mmxreg,r/m64 (p5, mmx)
dd aviso4 ; 0f e3-
dd aviso4 ; 0f e4-
dd _pmulhw ; 0f e5- pmulhw mmxreg,r/m64 (p5, mmx)
dd livre ; 0f e6- *
dd aviso4 ; 0f e7-
dd _psubsb ; 0f e8- psubsb mmxreg,r/m64 (p5, mmx)
dd _psubsw ; 0f e9- psubsw mmxreg,r/m64 (p5, mmx)
dd aviso4 ; 0f ea-
dd _por ; 0f eb- por mmxreg,r/m64 (p5, mmx)
dd _paddsb ; 0f ec- paddsb mmxreg,r/m64 (p5, mmx)
dd _paddsw ; 0f ed- paddsw mmxreg,r/m64 (p5, mmx)
dd aviso4 ; 0f ee-
dd _pxor ; 0f ef- pxor mmxreg,r/m64 (p5, mmx)
dd livre ; 0f f0- *
dd _psllw ; 0f f1- psllw mmxreg,r/m64 (p5, mmx)
dd _pslld ; 0f f2- pslld mmxreg,r/m64 (p5, mmx)
dd _psllq ; 0f f3- psllq mmxreg,r/m64 (p5, mmx)
dd livre ; 0f f4- *
dd _pmadddd ; 0f f5- pmadddd mmxreg,r/m64 (p5, mmx)
dd aviso4 ; 0f f6-
dd aviso4 ; 0f f7-
dd _psubb ; 0f f8- psubb mmxreg,r/m64 (p5, mmx)
dd _psubw ; 0f f9- psubw mmxreg,r/m64 (p5, mmx)
dd _psubd ; 0f fa- psubd mmxreg,r/m64 (p5, mmx)
dd livre ; 0f fb- *
dd _paddb ; 0f bc- paddb mmxreg,r/m64 (p5, mmx)
dd _paddd ; 0f fd- paddd mmxreg,r/m64 (p5, mmx)
dd _paddd ; 0f fe- paddd mmxreg,r/m64 (p5, mmx)
dd livre ; 0f ff- *
Page: 32
File: C:\PGM\desa_prg32 COMPLETO.cb
dd _fmul_single_real
dd _fcom_single_real
dd _fcomp_single_real
dd _fsub_single_real
dd _fsubr_single_real
dd _fdiv_single_real
dd _fdivr_single_real
R_d9 dd _fld_single_real
dd vazio
dd _fst_single_real
dd _fstp_single_real
dd _fldenv
dd _fldcw_2bytes
dd _fstenv
dd _fstcw_2bytes
R_da dd _fiadd_dd_Int
dd _fimul_dd_Int
dd _ficom_dd_Int
dd _ficomp_dd_Int
dd fisub_dd_Int
dd fisubr_dd_Int
dd fidiv_dd_Int
dd fidivr_dd_Int
R_db dd fild_dd_Int
dd vazio
dd fist_dd_Int
dd fistp_dd_Int
dd vazio
dd fld_ext_real
dd vazio
dd fstp_ext_real
R_dc dd _fadd_doble_real
dd _fmul_doble_real
dd _fcom_doble_real
dd _fcomp_doble_real
dd _fsub_doble_real
dd _fsubr_doble_real
dd _fdiv_doble_real
dd _fdivr_doble_real
R_dd dd _fld_doble_real
dd vazio
dd _fst_doble_real
dd _fstp_doble_real
dd _frstor
dd vazio
dd _fsave
dd _fstsw
R_de dd _fiadd_wo_Int
dd _fimul_wo_Int
dd _ficom_wo_Int
dd _ficomp_wo_Int
dd _fisub_wo_Int
dd _fisubr_wo_Int
dd _fidiv_wo_Int
dd _fidivr_wo_Int
R_df dd _fild_wo_Int
dd vazio
dd _fist_wo_Int
dd _fistp_wo_Int
dd _fbld_pack_bcd
Page: 33
File: C:\PGM\desa_prg32 COMPLETO.cb
dd _fild_qw_Int
dd _fbstp_pack_bcd
dd _fistp_qw_Int
R_d8.c8 dd _fmul_sti
dd _fmul_sti
dd _fmul_sti
dd _fmul_sti
dd _fmul_sti
dd _fmul_sti
dd _fmul_sti
dd _fmul_sti
R_d8.d0 dd _fcom_sti
dd _fcom_sti
dd _fcom_sti
dd _fcom_sti
dd _fcom_sti
dd _fcom_sti
dd _fcom_sti
dd _fcom_sti
R_d8.d8 dd _fcomp_sti
dd _fcomp_sti
dd _fcomp_sti
dd _fcomp_sti
dd _fcomp_sti
dd _fcomp_sti
dd _fcomp_sti
dd _fcomp_sti
R_d8.e0 dd _fsub_sti
dd _fsub_sti
dd _fsub_sti
dd _fsub_sti
dd _fsub_sti
dd _fsub_sti
dd _fsub_sti
dd _fsub_sti
R_d8.e8 dd _fsubr_sti
dd _fsubr_sti
dd _fsubr_sti
dd _fsubr_sti
dd _fsubr_sti
dd _fsubr_sti
dd _fsubr_sti
dd _fsubr_sti
R_d8.f0 dd _fdiv_sti
dd _fdiv_sti
dd _fdiv_sti
dd _fdiv_sti
dd _fdiv_sti
dd _fdiv_sti
dd _fdiv_sti
dd _fdiv_sti
Page: 34
File: C:\PGM\desa_prg32 COMPLETO.cb
R_d8.f8 dd _fdivr_sti
dd _fdivr_sti
dd _fdivr_sti
dd _fdivr_sti
dd _fdivr_sti
dd _fdivr_sti
dd _fdivr_sti
dd _fdivr_sti
_d9.c0 dd _fld_sti
dd _fld_sti
dd _fld_sti
dd _fld_sti
dd _fld_sti
dd _fld_sti
dd _fld_sti
dd _fld_sti
_d9.c8 dd _fxch_sti
dd _fxch_sti
dd _fxch_sti
dd _fxch_sti
dd _fxch_sti
dd _fxch_sti
dd _fxch_sti
dd _fxch_sti
_d9.d0 dd _fnop
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_d9.d8 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_d9.e0 dd _fchs
dd _fabs
dd vazio
dd vazio
dd _ftst
dd _fxam
dd vazio
dd vazio
_d9.e8 dd _fld1
dd _fldl2t
dd _fldl2e
dd _fldpi
dd _fldlg2
dd _fldln2
dd _fldz
dd vazio
_d9.f0 dd _f2xm1
dd _fyl2x
dd _fptan
Page: 35
File: C:\PGM\desa_prg32 COMPLETO.cb
dd _fpatan
dd _fxtract
dd _fprem1
dd _fdecstp
dd _fincstp
_d9.f8 dd _fprem
dd _fyl2xp1
dd _fsqrt
dd _fsincos
dd _frndint
dd _scale
dd _fsin
dd _fcos
_da.c0 dd _fcmovb_sti
dd _fcmovb_sti
dd _fcmovb_sti
dd _fcmovb_sti
dd _fcmovb_sti
dd _fcmovb_sti
dd _fcmovb_sti
dd _fcmovb_sti
_da.c8 dd _fcmove_sti
dd _fcmove_sti
dd _fcmove_sti
dd _fcmove_sti
dd _fcmove_sti
dd _fcmove_sti
dd _fcmove_sti
dd _fcmove_sti
_da.d0 dd _fcmovbe_sti
dd _fcmovbe_sti
dd _fcmovbe_sti
dd _fcmovbe_sti
dd _fcmovbe_sti
dd _fcmovbe_sti
dd _fcmovbe_sti
dd _fcmovbe_sti
_da.d8 dd _fcmovu_sti
dd _fcmovu_sti
dd _fcmovu_sti
dd _fcmovu_sti
dd _fcmovu_sti
dd _fcmovu_sti
dd _fcmovu_sti
dd _fcmovu_sti
_da.e0 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_da.e8 dd _fucompp
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
Page: 36
File: C:\PGM\desa_prg32 COMPLETO.cb
dd vazio
_da.f0 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_da.f8 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_db.c0 dd _fcmovnb_sti
dd _fcmovnb_sti
dd _fcmovnb_sti
dd _fcmovnb_sti
dd _fcmovnb_sti
dd _fcmovnb_sti
dd _fcmovnb_sti
dd _fcmovnb_sti
_db.c8 dd _fcmovne_sti
dd _fcmovne_sti
dd _fcmovne_sti
dd _fcmovne_sti
dd _fcmovne_sti
dd _fcmovne_sti
dd _fcmovne_sti
dd _fcmovne_sti
_db.d0 dd _fcmovnbe_sti
dd _fcmovnbe_sti
dd _fcmovnbe_sti
dd _fcmovnbe_sti
dd _fcmovnbe_sti
dd _fcmovnbe_sti
dd _fcmovnbe_sti
dd _fcmovnbe_sti
_db.d8 dd _fcmovnu_sti
dd _fcmovnu_sti
dd _fcmovnu_sti
dd _fcmovnu_sti
dd _fcmovnu_sti
dd _fcmovnu_sti
dd _fcmovnu_sti
dd _fcmovnu_sti
_db.e0 dd vazio
dd vazio
dd _fclex
dd _finit
dd vazio
dd vazio
dd vazio
dd vazio
_db.e8 dd _fucomi_sti
dd _fucomi_sti
Page: 37
File: C:\PGM\desa_prg32 COMPLETO.cb
dd _fucomi_sti
dd _fucomi_sti
dd _fucomi_sti
dd _fucomi_sti
dd _fucomi_sti
dd _fucomi_sti
_db.f0 dd _fcomi_sti
dd _fcomi_sti
dd _fcomi_sti
dd _fcomi_sti
dd _fcomi_sti
dd _fcomi_sti
dd _fcomi_sti
dd _fcomi_sti
_db.f8 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_dc.c0 dd _fadd_st0
dd _fadd_st0
dd _fadd_st0
dd _fadd_st0
dd _fadd_st0
dd _fadd_st0
dd _fadd_st0
dd _fadd_st0
_dc.c8 dd _fmul_st0
dd _fmul_st0
dd _fmul_st0
dd _fmul_st0
dd _fmul_st0
dd _fmul_st0
dd _fmul_st0
dd _fmul_st0
_dc.d0 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_dc.d8 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_dc.e0 dd _fsubr_st0
dd _fsubr_st0
dd _fsubr_st0
dd _fsubr_st0
dd _fsubr_st0
dd _fsubr_st0
Page: 38
File: C:\PGM\desa_prg32 COMPLETO.cb
dd _fsubr_st0
dd _fsubr_st0
_dc.e8 dd _fsub_st0
dd _fsub_st0
dd _fsub_st0
dd _fsub_st0
dd _fsub_st0
dd _fsub_st0
dd _fsub_st0
dd _fsub_st0
_dc.f0 dd _fdivr_st0
dd _fdivr_st0
dd _fdivr_st0
dd _fdivr_st0
dd _fdivr_st0
dd _fdivr_st0
dd _fdivr_st0
dd _fdivr_st0
_dc.f8 dd _fdiv_st0
dd _fdiv_st0
dd _fdiv_st0
dd _fdiv_st0
dd _fdiv_st0
dd _fdiv_st0
dd _fdiv_st0
dd _fdiv_st0
_dd.c0 dd _ffree_sti
dd _ffree_sti
dd _ffree_sti
dd _ffree_sti
dd _ffree_sti
dd _ffree_sti
dd _ffree_sti
dd _ffree_sti
_dd.c8 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_dd.d0 dd _fst_sti
dd _fst_sti
dd _fst_sti
dd _fst_sti
dd _fst_sti
dd _fst_sti
dd _fst_sti
dd _fst_sti
_dd.d8 dd _fstp_sti
dd _fstp_sti
dd _fstp_sti
dd _fstp_sti
dd _fstp_sti
dd _fstp_sti
dd _fstp_sti
dd _fstp_sti
_dd.e0 dd _fucom_st0
Page: 39
File: C:\PGM\desa_prg32 COMPLETO.cb
dd _fucom_st0
dd _fucom_st0
dd _fucom_st0
dd _fucom_st0
dd _fucom_st0
dd _fucom_st0
dd _fucom_st0
_dd.e8 dd _fucomp_sti
dd _fucomp_sti
dd _fucomp_sti
dd _fucomp_sti
dd _fucomp_sti
dd _fucomp_sti
dd _fucomp_sti
dd _fucomp_sti
_dd.f0 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_dd.f8 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_de.c0 dd _faddp_st0
dd _faddp_st0
dd _faddp_st0
dd _faddp_st0
dd _faddp_st0
dd _faddp_st0
dd _faddp_st0
dd _faddp_st0
_de.c8 dd _fmulp_st0
dd _fmulp_st0
dd _fmulp_st0
dd _fmulp_st0
dd _fmulp_st0
dd _fmulp_st0
dd _fmulp_st0
dd _fmulp_st0
_de.d0 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_de.d8 dd _fcompp
dd vazio
dd vazio
dd vazio
dd vazio
Page: 40
File: C:\PGM\desa_prg32 COMPLETO.cb
dd vazio
dd vazio
dd vazio
_de.e0 dd _fsubrp_st0
dd _fsubrp_st0
dd _fsubrp_st0
dd _fsubrp_st0
dd _fsubrp_st0
dd _fsubrp_st0
dd _fsubrp_st0
dd _fsubrp_st0
_de.e8 dd _fsubp_st0
dd _fsubp_st0
dd _fsubp_st0
dd _fsubp_st0
dd _fsubp_st0
dd _fsubp_st0
dd _fsubp_st0
dd _fsubp_st0
_de.f0 dd _fdivrp_st0
dd _fdivrp_st0
dd _fdivrp_st0
dd _fdivrp_st0
dd _fdivrp_st0
dd _fdivrp_st0
dd _fdivrp_st0
dd _fdivrp_st0
_de.f8 dd _fdivp_st0
dd _fdivp_st0
dd _fdivp_st0
dd _fdivp_st0
dd _fdivp_st0
dd _fdivp_st0
dd _fdivp_st0
dd _fdivp_st0
_df.c0 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_df.c8 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_df.d0 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
Page: 41
File: C:\PGM\desa_prg32 COMPLETO.cb
_df.d8 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_df.e0 dd _fstsw_ax
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
_df.e8 dd _fucomip_sti
dd _fucomip_sti
dd _fucomip_sti
dd _fucomip_sti
dd _fucomip_sti
dd _fucomip_sti
dd _fucomip_sti
dd _fucomip_sti
_df.f0 dd _fcomip_sti
dd _fcomip_sti
dd _fcomip_sti
dd _fcomip_sti
dd _fcomip_sti
dd _fcomip_sti
dd _fcomip_sti
dd _fcomip_sti
_df.f8 dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
dd vazio
; times 0x580+0x480 - ( _ - __ ) db 0
; tabela de strings
b_pref db 0x26,0x2e,0x36,0x3e,0x64,0x65,0x66,0x67,0xf0,0xf1 ; 0 final nao é necessario
reg8 db 'al',0,'cl',0,'dl',0,'bl',0,'ah',0,'ch',0,'dh',0,'bh',0
reg32 db 'eax',0,'ecx',0,'edx',0,'ebx',0,'esp',0,'ebp',0,'esi',0,'edi',0
regseg db 'es',0,'cs',0,'ss',0,'ds',0,'fs',0,'gs',0
cond db 'o',0,0,'no',0,'b',0,0,'ae',0,'e',0,0,'ne',0,'be',0,'a',0,0,'s',0,0,'ns',0,'pe',0,'po',0,'l',0,0,'ge',0,'le',0,'g',0
tipo db 'by ',0,'wo ',0,'dd ',0
grupo1 db 'add',0,'or',0,0,'adc',0,'sbb',0,'and',0,'sub',0,'xor',0,'cmp',0
grupo2 db 'rol',0,'ror',0,'rcl',0,'rcr',0,'shl',0,'shr',0,'sal',0,'sar',0
grupo3 db 'test',0,0xff,0x26,'@@',0,'not',0,0,'neg',0,0,'mul',0,0,'imul',0,'div',0,0,'idiv',0
aviso1 db 'instrução inválida',0
aviso2 db 'registrador de segmento inválido',0
aviso3 db 'codigo de instrução não usado',0
; (para instr não implementadas neste programa)
aviso4 db 'código de instrução indisponivel',0
aviso5 db 'inválida. (gera Int 06 ao ser executada)'
livre db 'esc',0xff,0x45,0
src db 's',0,'r',0,'c',0
_xmm db 'xmm0',0,'xmm1',0,'xmm2',0,'mm3',0,'xmm4',0,'xmm5',0,'xmm6',0,'xmm7',0
_st db 'st0',0,'st1',0,'st2',0,'st3',0,'st4',0,'st5',0,'st6',0,'st7',0
Page: 42
File: C:\PGM\desa_prg32 COMPLETO.cb
m16.0 db '[bx+si',0xff,0x29,']',0
m16.1 db '[bx+di',0xff,0x29,']',0
m16.2 db '[bp+si',0xff,0x29,']',0
m16.3 db '[bp+di',0xff,0x29,']',0
m16.4 db '[si',0xff,0x29,']',0
m16.5 db '[di',0xff,0x29,']',0
m16.6 db '[',0xff,0x0c,']',0
m16.7 db '[bx',0xff,0x29,']',0
insbp db 'bp',0xff,0x29,0
m32.0 db '[eax',0xff,0x29,']',0
m32.1 db '[ecx',0xff,0x29,']',0
m32.2 db '[edx',0xff,0x29,']',0
m32.3 db '[ebx',0xff,0x29,']',0
m32.4 db '[',0xff,0x14,']',0
m32.5 db '[',0xff,0x0d,']',0
m32.6 db '[esi',0xff,0x29,']',0
m32.7 db '[edi',0xff,0x29,']',0
Page: 43
File: C:\PGM\desa_prg32 COMPLETO.cb
Page: 44
File: C:\PGM\desa_prg32 COMPLETO.cb
; (todas as expressões devem ter a mesma extensão em bytes, exceto o último (8 ao todo)
; usa _0f00 para buscar o grupo todo
grupo6 db 'sldt ',0xff,0x36,0 ;8
db 'str ',0xff,0x36,0,0 ;8
db 'lldt ',0xff,0x36,0 ;8
db 'ltr ',0xff,0x36,0,0 ;8
db 'verr ',0xff,0x36,0 ;8
db 'verw ',0xff,0x36,0 ;8
db 0xff,0x38,0,'@@' ; imprime instrução inválida @=bytes livres
_i0f00 db 0xff,0x35,0 ; ocupa os dois bytes subtraidos da expressão anterior, para
economizer espaço
db 'inv pg486',0 ;a
; (todas as expressões devem ter a mesma extensão em bytes, exceto o último (8 ao todo)
; usa _0f01 para buscar o grupo todo
grupo7 db 'sgdt ',0xff,0x37,0
db 'sidt ',0xff,0x37,0
db 'lgdt ',0xff,0x37,0
db 'lidt ',0xff,0x37,0
db 'smsw ',0xff,0x36,0
db 0xff,0x38,0,'@@' ; @= bytes livres
_i0f01 db 0xff,0x39,0 ; ocupa os dois bytes subtraidos da expressão anterior, para
economizer espaço
db 'lmsw ',0xff,0x36,0
db 0xff,0x38,0
Page: 45
File: C:\PGM\desa_prg32 COMPLETO.cb
; instruções 486
_wbinvd db 'wbinvd',0
_invd db 'invd',0
_bswap db 'bswap ',0xff,0x12,0
_xadd db 'xadd ',0xff,0x21,0
_cmpxchg486 db 'cmpxchg ',0xff,0x21,0
; instruções fpu
_fadd_single_real db 'fadd dd ',0
_fmul_single_real db 'fmul dd ',0
_fcom_single_real db 'fcom dd ',0
_fcomp_single_real db 'fcomp dd ',0
_fsub_single_real db 'fsubr dd ',0
_fsubr_single_real db 'fsubr dd ',0
_fdiv_single_real db 'fdiv dd ',0
_fdivr_single_real db 'fdivr dd',0
_fld_single_real db 'fld dd ',0
_fst_single_real db 'fst dd ',0
_fstp_single_real db 'fstp dd ',0
Page: 46
File: C:\PGM\desa_prg32 COMPLETO.cb
vazio db 'esc',0
_fcompp db 'fcompp',0
_fucompp db 'fucompp',0
_fstsw_ax db 'fstsw ax',0
_fnop db 'fnop',0
_fchs db 'fchs',0
_fabs db 'fabs',0
_ftst db 'ftst',0
_fxam db 'fxam',0
_f2xm1 db 'f2xm1',0
Page: 47
File: C:\PGM\desa_prg32 COMPLETO.cb
_fyl2x db 'fyl2x',0
_fptan db 'fptan',0
_fpatan db 'fpatan',0
_fxtract db 'fxtract',0
_fprem1 db 'fprem1',0
_fdecstp db 'fdecstp',0
_fincstp db 'fincstp',0
_fld1 db 'fld 1',0
_fldl2t db 'fld L2T',0
_fldl2e db 'fld L2e',0
_fldpi db 'fld pi',0
_fldlg2 db 'fld Lg2',0
_fldln2 db 'fld ln2',0
_fldz db 'fld 0',0
_fprem db 'fprem',0
_fyl2xp1 db 'fyl2xp1',0
_fsqrt db 'fsqrt',0
_fsincos db 'fsincos',0
_frndint db 'frndint',0
_scale db 'fscale',0
_fsin db 'fsin',0
_fcos db 'fcos',0
_fclex db 'fclex',0
_finit db 'finit',0
; Instruções p5
_cpuid db 'cpuid',0
_emms db 'emms',0
_rdmsr db 'rdmsr',0
_rdtsc db 'rdtsc',0
_rsm db 'rsm',0
_wrmsr db 'wrmsr',0
_cmpxchg db 'cmpxchg ',0xff,0x21,0
; instruções mmx
_psubb db 'psubb ',0xff,0x49,0
_psubw db 'psubw ',0xff,0x49,0
_psubd db 'psubd ',0xff,0x49,0
_psubsb db 'psubsb ',0xff,0x49,0
_psubsw db 'psubsw ',0xff,0x49,0
_psubusb db 'psubusb ',0xff,0x49,0
_psubusw db 'psubusw ',0xff,0x49,0
Page: 48
File: C:\PGM\desa_prg32 COMPLETO.cb
; instruções p6
_int1 db 'int1',0
_rdpmc db 'rdpmc',0
_cmov db 'cmov ',0xff,0x11,' ', 0xff,0x2a,0
Page: 49