domingo, 20 de novembro de 2011

masm32




Estes são alguns programas elementares em assembly 32 bits, para o MASM32. Foram resultados de pesquisas realizadas na internet e em forums do gênero pois, não consegui encontrar um "manual completo do MASM32" ou algo similar, sendo que o help não abrange as funções do windows. São exemplos principais, como caixa de mensagens, teclado, temporizações, conteúdo de diretório, leitura e escrita de arquivos, janela gráfica com memória gráfica manipulável, som de arquivos e em memória, gravação e reprodução de som pcm e cálculos em ponto flutuante com a FPU. Ainda não consegui um exemplo que utiliza a webcam, os poucos exemplos que encontrei são incompletos ou não funcionam, se alguém tiver e postar um link agradeço....  Ao final tem um resumo de programação como estrutura de um programa, sintaxes , declarações de variáveis, etc. 





########################################################################################

MESSAGEBOX:
Cria uma caixa de mensagens, com titulo e o texto


.586 ;codigo 32 bits
.model flat, stdcall ;segmento de memoria 32 bits
option casemap: none ;difere maiuscula e minuscula



include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib



.data

texto1 db "1234",0
texto2 db "5678",0



.code



start:



;MessageBox manipulador, texto, titulo, botao

push 0 ;botao ok
push offset texto1 ;titulo
push offset texto2 ;texto
push 0 ;sem manipulador
call MessageBox ;abre caixa de mensagem (user32.inc)





push 0
call ExitProcess ;fim (kernel32.inc)


end start






##########################################################################################3

TECLADO:
Verifica se determinada tecla está solta ou pressionada




include \masm32\include\masm32rt.inc



.data
pressionada db "tecla A pressionada",0
solta db "tecla A solta",0
titulo db "titulo",0
mensagem db "clique ok e tecle A",0


.data?
texto dd ?



.code



start:




;mensagem

;MessageBox manipulador, texto, titulo, botao
push 0 ;botao ok
push offset titulo ;titulo
push offset mensagem ;mensagem
push 0 ;sem manipulador
call MessageBox ;abre caixa de mensagem (user32.inc)





;aguarda tempo p/ pressionar tecla

mov eax, 050000000h

temporizando:
dec eax
jnz temporizando






push 041h ;041h = tecla A (teclas_codigos.txt)
call GetAsyncKeyState ;retorna al: 0 = tecla solta, 1 = tecla pressionada




cmp al, 1 ;compara 1
je tecla_pressionada
jmp tecla_solta


tecla_solta:
mov texto, offset solta ;copia endere�o da mensagem solta
jmp tecla_fim

tecla_pressionada:
mov texto, offset pressionada ;copia endere�o da mensagem pressionada

tecla_fim:





;Mostra mensagem

;MessageBox manipulador, texto, titulo, botao
push 0 ;botao ok
push offset titulo ;titulo
push texto ;mensagem
push 0 ;sem manipulador
call MessageBox ;abre caixa de mensagem (user32.inc)





push 0
call ExitProcess ;fim (kernel32.inc)


end start






#####################################################################################

TEMPORIZADOR:
Temporizador do sistema, em milisegundos.



include \masm32\include\masm32rt.inc



.data
pronto db "temporizar 5 segundos",0
fim db "fim",0
titulo db "titulo",0


.data?
inicio dd ?
atual dd ?



.code



start:




;mensagem inicial

;MessageBox manipulador, texto, titulo, botao
push 0 ;botao ok
push offset titulo ;titulo
push offset pronto ;mensagem
push 0 ;sem manipulador
call MessageBox ;abre caixa de mensagem (user32.inc)








call GetTickCount ;Contador de milisegundos, retorno em eax
mov inicio, eax ;guarda milisegundos iniciais







aguardando:

call GetTickCount ;milisegundos atuais


sub eax,inicio ;subtrai atual do inicial e compara
cmp eax,5000 ;5000 milisegundos = 5 segundos
jb aguardando ;se diferen�a menor, continua temporizando









;mensagem final

;MessageBox manipulador, texto, titulo, botao
push 0 ;botao ok
push offset titulo ;titulo
push offset fim ;mensagem
push 0 ;sem manipulador
call MessageBox ;abre caixa de mensagem (user32.inc)





push 0
call ExitProcess ;fim (kernel32.inc)


end start




#######################################################################################

ARQUIVOS_DIRETORIO:
Lista o conteúdo do diretorio


.586 ;codigo 32 bits
.model flat, stdcall ;segmento de memoria 32 bits
option casemap: none ;difere maiuscula e minuscula


include \masm32\include\masm32rt.inc

include \masm32\include\windows.inc

include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib





.data

texto1 db "titulo",0
memoria dd 0
memoria_ponteiro dd 0


estrutura WIN32_FIND_DATA {?}
filtro db "*.*",0


manip_busca dd 0

endereco_fonte dd 0

contador dd 0




.code








;adiciona nome do arquivo na memoria


copianome proc


mov esi, offset estrutura.cFileName ;copia endere�o apontando nome do arquivo
mov eax, 0 ;ponteiro em 0, inicio do nome

mov edi, memoria ;copia endere�o da memoria alocada
mov ebx, memoria_ponteiro ;copia ponteiro da memoria

copianome_retorna:

mov dl, byte ptr [esi][eax] ;copia byte do nome em dl
mov byte ptr [edi][ebx],dl ;copia o byte na memoria alocada

add eax, 1 ;incrementa ponteiros em 1 byte
add ebx, 1

cmp dl, 0 ;se o byte � 0, finalizou nome do arquivo
je copianome_fim

jmp copianome_retorna ;copia proximo caractere do nome


copianome_fim:
sub ebx,1 ;retorna ponteiro do 0 escrito
mov byte ptr [edi][ebx],020h ;sobreescreve espa�o
add ebx,1 ;avan�a ponteiro
mov byte ptr [edi][ebx],0 ;escreve 0 finalizando nome

mov memoria_ponteiro, ebx ;salva ponteiro p/ proximo nome

ret
copianome endp












start:



;aloca memoria p/ escrita na caixa de mensagens

push 10000 ;bytes alocados
call Alloc ;(masm32.inc) aloca memoria, endere�o retornado em eax
mov memoria,eax







;procura primeiro arquivo

push offset estrutura ;estrutura que receber� o nome do arquivo encontrado
push offset filtro ;filtro na busca
call FindFirstFile ;procura primeiro arquivo
mov manip_busca, eax ;salva manipulador p/ proximas buscas




call copianome ;adiciona nome do arquivo encontrado na memoria




copiando:



;procura demais arquivos

push offset estrutura ;estrutura que receber� o nome do arquivo encontrado
push manip_busca ;filtro na busca
call FindNextFile ;procura proximo arquivo
cmp eax, 0 ;se retornou 0, nao encontrou mais arquivos
je nomefim


call copianome ;adiciona nome do arquivo encontrado na memoria




jmp copiando






nomefim:


;memoria com nomes dos arquivos numa caixa de mensagens


;MessageBox manipulador, texto, titulo, botao
push 0 ;botao ok
push offset texto1 ;titulo
push memoria
push 0 ;sem manipulador
call MessageBox ;abre caixa de mensagem (user32.inc)




push 0
call ExitProcess ;fim (kernel32.inc)


end start




########################################################################################3

LE E ESCREVE ARQUIVO:
Abre arquivo binario e escreve cópia.



include \masm32\include\masm32rt.inc



.data
titulo db "titulo",0
nomearquivo db "arquivo",0




.data?

manip dd ?
tamanho dd ?
endereco dd ?

manip2 dd ?




.code




start:




;(masm32rt.inc)(macro.asm)

mov eax, offset nomearquivo
mov manip, fopen(eax) ;abre arquivo BINARIO
mov tamanho, fsize(manip) ;tamanho do arquivo
mov endereco, alloc(tamanho) ;aloca memoria com tamanho do arquivo
mov eax, fread(manip,endereco,tamanho) ;copia arquivo na memoria
; retorno em eax descartado


mov manip2, fcreate("copia") ;cria novo arquivo
mov eax, fwrite(manip2,endereco,tamanho) ;escreve memoria no arquivo (copia)
; retorno em eax descartado








;mostra memoria numa caixa de mensagens

;MessageBox manipulador, texto, titulo, botao
push 0 ;botao ok
push offset titulo ;titulo
push endereco ;arquivo
push 0 ;sem manipulador
call MessageBox ;abre caixa de mensagem (user32.inc)





push 0
call ExitProcess ;fim (kernel32.inc)


end start




#######################################################################################

CREATEWINDOWEX
Cria uma janela gráfica, disponibilizando a memória gráfica p/ manipulação




.586 ;codigo 32 bits
.model flat, stdcall ;segmento de memoria 32 bits
option casemap: none ;difere maiuscula e minuscula


include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\windows.inc
include \masm32\include\gdi32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib





.data
nome_menu db "titulo",0
nome_classe db "aguarda",0

largura dd 300
altura dd 150

posicaox dd 100 ;superior esquerda
posicaoy dd 50

ponteiro dd 0
pixel dd 00000ff00h


.DATA?
classe WNDCLASSEX {?}
manip dd ?

mg_manip dd ?
mg_ponteiro dd ?
dib_manip dd ?

classe_mg BITMAPINFOHEADER {?}

janela_manip dd ?

area RECT {?}

inicio dd ?


manip1 dd ?

manip_create dd ?

ps PAINTSTRUCT {?}

dc_manip    dd  ?



.code







;rotina de procedimento da janela

janela proc manip_local:HWND, mensagem:UINT, wParam:WPARAM, lParam:LPARAM

push manip_local ;guarda manipulador da janela
pop janela_manip


cmp mensagem, WM_CREATE ;cria memoria se mensagem=WM_CREATE
je janela_cria

cmp mensagem, WM_PAINT ;cria memoria se mensagem=WM_CREATE
je janela_pinta



jmp semprocesso



janela_cria:
call criamemoria
ret

janela_pinta:
call pintajanela
ret

semprocesso:

;sem processamento da mensagem, procedimento padr�o
;DefWindowProc manipulador, mensagem, parametro w, parametro l


push lParam
push wParam
push mensagem
push janela_manip
call DefWindowProc ;padrao p/ todas mensagens (user32.inc)
;sem processo


ret

janela endp












criamemoria proc


;cria memoria grafica

push 0 ;cria memoria, 0 = compativel com atual
call CreateCompatibleDC ;(gdi32.inc)
mov mg_manip, eax ;guarda manip




;copia coordenadas da janela na classe RECT area

;GetClientRect manipulador, ponteiro p/ coordenadas
push offset area
push janela_manip
call GetClientRect ;(user32.inc)






;cria uma classe BITMAPINFOHEADER p/ fun��o CreateDIBSection

mov classe_mg.biSize, sizeof BITMAPINFOHEADER ;numero de bytes da estrutura

mov eax,area.right ;classe largura
mov classe_mg.biWidth, eax ;largura do bitmap em pixels

mov eax,area.bottom ;classe altura
mov classe_mg.biHeight, eax ;altura do bitmap em pixels

mov classe_mg.biPlanes, 1 ;numero de planos
mov classe_mg.biBitCount, 32 ;32 bits = 4 bytes: xrgb (cada pixel)
mov classe_mg.biCompression, BI_RGB ;rgb sem compressao
mov classe_mg.biSizeImage, 0 ;tamanho da imagem em bytes (0 p/ rgb)
mov classe_mg.biXPelsPerMeter, 0 ;resolu��o horizontal (pixel/metro)
mov classe_mg.biYPelsPerMeter, 0 ;resolu��o vertical
mov classe_mg.biClrUsed, 0 ;numero de cores (0 = biBitCount)
mov classe_mg.biClrImportant, 0 ;requerimento de cores (0 = todas)




;cria bmp manipulavel com retorno de endere�o

;CreateDIBSection manipulador, ponteiro parametros, tipo de dado, ponteiro DIB,
; manip arquivo DIB, offset arquivo DIB

push 0 ;sem endere�o - memoria alocada
push 0 ;sem endere�o - memoria alocada
push offset mg_ponteiro ;ponteiro do ponteiro da memoria bmp
push DIB_RGB_COLORS ;tipo rgb
push offset classe_mg ;ponteiro da classe da memoria
push mg_manip

call CreateDIBSection ;(gdi32.inc)
mov dib_manip, eax



ret
criamemoria endp













pintajanela proc



;copia bmp na memoria grafica

;SelectObject manipulador memoria, manipulador DIB
push dib_manip
push mg_manip
call SelectObject ;(gdi32.inc)



;BitBlt manip-destino, x, y, largura, altura, manip-origem, x origem, y origem, modo

push SRCCOPY ;copia direta
push 0 ;y origem = 0
push 0 ;x origem = 0
push mg_manip ;manip memoria grafica
push altura ;altura
push largura ;largura
push 0 ;coordenada y
push 0 ;coordenada x
push dc_manip ;manip janela

call BitBlt ;copia bmp na janela(gdi32.inc)






ret
pintajanela endp










start:




;gera manipulador

push 0
call GetModuleHandle ;(kernel32.inc)

mov manip,eax



;cria uma classe de janela WNDCLASSEX (windows.inc)

mov classe.cbSize, sizeof WNDCLASSEX ;tamanho em bytes da estrutura
mov classe.style, 0 ;estilo da classe
mov classe.lpfnWndProc, offset janela ;endere�o da rotina da janela
mov classe.cbClsExtra, 0 ;bytes extra apos a estrutura
mov classe.cbWndExtra, 0 ;bytes extra apos a instancia

mov eax, manip

mov classe.hInstance, eax ;instancia = manipulador
mov classe.hIcon, 0 ;icone padrao
mov classe.hCursor, 0 ;sem cursor
mov classe.hbrBackground, 1 ;cor de fundo cinza
mov classe.lpszMenuName, offset nome_menu ;titulo
mov classe.lpszClassName, offset nome_classe ;nome da classe p/ registro *
mov classe.hIconSm, 0 ;icone de classe padrao





;registra a classe *

push offset classe
call RegisterClassEx ;(user32.inc)






;cria janela

;CreateWindowEx estiloestendido, nome classe, titulo, estilo, x, y, largura, altura,
; manip-janela, manip-menu, manip-instancia, ponteiro de parametros





push 0 ;sem estrutura de parametros
push manip ;manipulador
push 0 ;sem manip-menu
push 0 ;sem manip-janela
push altura ;altura
push largura ;largura
push posicaoy ;posicao y
push posicaox ;posicao x

mov eax, 0
or eax, WS_POPUP
or eax, WS_SIZEBOX

push eax ;estilo
push offset nome_menu ;titulo
push offset nome_classe ;nome da classe registrada
push 0 ;estilo estendido padrao

call CreateWindowEx ;cria janela (user32.inc)
mov manip_create,eax


push manip_create
call GetDC ;manip em eax (user32.inc)
mov  dc_manip,eax


;mostra janela
;ShowWindow manipulador, modo

push 1 ;normal
push manip_create ;manip retornado do CreateWindowEx
call ShowWindow ;mostra janela (user32.inc)







retorna:




mov eax,ponteiro
cmp eax, 160000
jb continua
mov ponteiro,0

mov ebx, pixel
cmp ebx, 0
je zeromuda
mov pixel,0

jmp zerofim
zeromuda:
mov pixel, 00000ff00h
zerofim:



continua:
mov ecx,20
continua2:
mov eax,ponteiro
mov ebx,pixel
mov edi,mg_ponteiro ;inicio da memoria grafica

mov dword ptr [edi][eax],ebx ;copia pixel = 4 bytes -> xrgb = azul no maximo
add eax,4 ;proximo pixel = +4 bytes
mov ponteiro,eax
dec ecx
jnz continua2






push manip_create ;manda um WM_PAINT, atualizando a janela
call UpdateWindow









push 01bh ;041h = tecla A (teclas_codigos.txt)
call GetAsyncKeyState ;retorna al: 0 = tecla solta, 1 = tecla pressionada

cmp al, 1
je fim






jmp teste


call GetTickCount ;Contador de milisegundos, retorno em eax
mov inicio, eax ;guarda milisegundos iniciais
aguarda:
call GetTickCount ;milisegundos atuais

sub eax,inicio ;subtrai atual do inicial e compara
cmp eax,33 ;5000 milisegundos = 5 segundos
jb aguarda


teste:






jmp retorna





fim:
push 0
call ExitProcess ;fim (kernel32.inc)


end start



##################################################################################

SOM ARQUIVO
Toca o som de arquivo wav



include \masm32\include\masm32rt.inc

include \masm32\include\winmm.inc

includelib \masm32\lib\winmm.lib




.data
arquivo db "teste.wav",0




.data?
manip dd ?




.code





start:




;gera manipulador
push 0
call GetModuleHandle ;(kernel32.inc)
mov manip,eax





;PlaySound ponteiro do som, manipulador, modo

push SND_FILENAME ;modo som em arquivo
push manip ;manipulador
push offset arquivo ;endere�o do nome do arquivo
call PlaySound ;toca som (winmm.inc)






push 0
call ExitProcess
end start




##################################################################################

SOM MEMORIA
Copia arquivo wav na memoria e toca





include \masm32\include\masm32rt.inc

include \masm32\include\winmm.inc

includelib \masm32\lib\winmm.lib




.data
arquivo db "teste.wav",0




.data?
manip dd ?
tamanho dd ?
endereco dd ?




.code





start:




;copia arquivo de som na memoria alocada


;(masm32rt.inc)(macro.asm)

mov eax, offset arquivo
mov manip, fopen(eax) ;abre arquivo BINARIO
mov tamanho, fsize(manip) ;tamanho do arquivo
mov endereco, alloc(tamanho) ;aloca memoria com tamanho do arquivo
mov eax, fread(manip,endereco,tamanho) ;copia arquivo na memoria
; retorno em eax descartado






;toca som da memoria

;PlaySound ponteiro do som, manipulador, modo

push SND_MEMORY ;modo som na memoria
push 0 ;sem manipulador
push endereco ;endere�o da memoria
call PlaySound ;toca som (winmm.inc)






push 0
call ExitProcess
end start



#######################################################################################

SOM MEMORIA LOOP
Toca som em loop com processamento liberado p/ outras funções



include \masm32\include\masm32rt.inc

include \masm32\include\winmm.inc

includelib \masm32\lib\winmm.lib




.data
arquivo db "teste.wav",0




.data?
manip dd ?
tamanho dd ?
endereco dd ?

inicio dd ?




.code





start:




;copia arquivo de som na memoria alocada


;(masm32rt.inc)(macro.asm)

mov eax, offset arquivo
mov manip, fopen(eax) ;abre arquivo BINARIO
mov tamanho, fsize(manip) ;tamanho do arquivo
mov endereco, alloc(tamanho) ;aloca memoria com tamanho do arquivo
mov eax, fread(manip,endereco,tamanho) ;copia arquivo na memoria
; retorno em eax descartado







;toca som da memoria


;configura modo setando os flags
mov eax, 0

or eax, SND_MEMORY ;arquivo de som na memoria

or eax, SND_LOOP ;repete de forma cont�nua sem interrup��o
; (precisa de SND_ASYNC)

or eax, SND_ASYNC ;fun��o retorna imediatamente apos
; inicio da reprodu��o



;PlaySound ponteiro do som, manipulador, modo

push eax ;modo
push 0 ;sem manipulador
push endereco ;endere�o da memoria
call PlaySound ;toca som (winmm.inc)












;Aguarda com o som tocando


call GetTickCount ;Contador de milisegundos, retorno em eax
mov inicio, eax ;guarda milisegundos iniciais

aguardando:

call GetTickCount ;milisegundos atuais
sub eax,inicio ;subtrai atual do inicial e compara
cmp eax,5000 ;5000 milisegundos = 5 segundos
jb aguardando ;se diferen�a menor, continua temporizando







push 0
call ExitProcess
end start



###############################################################################

SOM PCM
Grava/reproduz memoria wave formato PCM




include \masm32\include\masm32rt.inc

include \masm32\include\winmm.inc

includelib \masm32\lib\winmm.lib




.data
texto1 db "titulo",0
texto2 db "OK = grava/reproduz 5 segundos 1 = reproduz 2 = grava/reproduz esc = sai",0





.data?
estr WAVEFORMATEX {?}
estr2 WAVEHDR {?}
endereco dd ?
tamanho dd ?
manip dd ?
manip2 dd ?
inicio dd ?




.code





start:





;aloca memoria

mov tamanho, 441000 ;bytes por segundo * 5 segundos
push tamanho ;bytes alocados
call Alloc ;(masm32.inc) aloca memoria, endere�o retornado em eax
mov endereco,eax






;estrutura WAVEFORMATEX especifica formato

mov estr.wFormatTag, WAVE_FORMAT_PCM ;formato PCM
mov estr.nChannels, 1 ;numero de canais
mov estr.nSamplesPerSec, 44100 ;amostras por segundo
mov estr.nAvgBytesPerSec, 88200 ;bytes por segundo = amostras * bytes por segundo
mov estr.nBlockAlign, 2 ;bytes por amostra = canais * bits por amostra /8
mov estr.wBitsPerSample, 16 ;bits por amostra
mov estr.cbSize, 0 ;sem informa��o extra






;estrutura WAVEHDR especifica memoria

mov eax, endereco
mov estr2.lpData, eax ;endere�o da memoria

mov eax, tamanho
mov estr2.dwBufferLength, eax ;tamanho em bytes da memoria

mov estr2.dwBytesRecorded, 0 ;bytes gravados
mov estr2.dwUser, 0 ;dados
mov estr2.dwFlags, 0 ;modo
mov estr2.dwLoops, 0 ;numero de loops de reprodu��o
;mov estr2.lpNext, ;reservado
;mov estr2.reserved, ;reservado









;mensagem inicio

;MessageBox manipulador, texto, titulo, botao
push 0 ;botao ok
push offset texto1 ;titulo
push offset texto2 ;texto
push 0 ;sem manipulador
call MessageBox ;abre caixa de mensagem (user32.inc)





;-----------------------------------------------------------------------------------------





;abre o dispositivo de grava��o

push CALLBACK_NULL ;modo
push 0 ;instancia
push 0 ;sem fun��o de procedimento
push offset estr ;endere�o da estrutura WAVEFORMATEX
push WAVE_MAPPER ;seleciona o dispositivo
push offset manip ;endere�o do manipulador
call waveInOpen





;prepara a memoria

push sizeof estr2 ;tamanho da estrutura WAVEHDR
push offset estr2 ;endere�o da estrutura WAVEHDR
push manip ;manipulador
call waveInPrepareHeader









grava:







;define a memoria no dispositivo de grava��o

push sizeof estr2 ;tamanho da estrutura WAVEHDR
push offset estr2 ;endere�o da estrutura WAVEHDR
push manip ;manipulador
call waveInAddBuffer








;come�a a gravar

push manip ;manipulador
call waveInStart








;espera memoria cheia, com WHDR_DONE setado

aguarda:
mov eax, estr2.dwFlags ;copia flags em eax
and eax, WHDR_DONE ;zera bits exceto WHDR_DONE
cmp eax, 0 ;compara zero
je aguarda ;aguarda se zero








;para a grava��o

push manip ;manipulador
call waveInStop















;-----------------------------------------------------------------------------------------




;abre o dispositivo de reprodu��o

push CALLBACK_NULL ;modo
push 0 ;instancia
push 0 ;sem fun��o de procedimento
push offset estr ;endere�o da estrutura WAVEFORMATEX
push WAVE_MAPPER ;seleciona o dispositivo
push offset manip2 ;endere�o do manipulador
call waveOutOpen








;prepara a memoria

push sizeof estr2 ;tamanho da estrutura WAVEHDR
push offset estr2 ;endere�o da estrutura WAVEHDR
push manip2 ;manipulador
call waveOutPrepareHeader







reproduz:






;define a memoria no dispositivo de reprodu��o e come�a reproduzir
;(WHDR_DONE setado indica fim da reprodu��o)


push sizeof estr2 ;tamanho da estrutura WAVEHDR
push offset estr2 ;endere�o da estrutura WAVEHDR
push manip2 ;manipulador
call waveOutWrite









;teclado


espera_tecla:

push 031h ;1
call GetAsyncKeyState ;retorna al: 0 = tecla solta, 1 = tecla pressionada
cmp al, 1
je tecla_1


push 032h ;2
call GetAsyncKeyState ;retorna al: 0 = tecla solta, 1 = tecla pressionada
cmp al, 1
je tecla_2


push 01bh ;esc
call GetAsyncKeyState ;retorna al: 0 = tecla solta, 1 = tecla pressionada
cmp al, 1
je tecla_esc

jmp espera_tecla







tecla_1:

push manip2
call waveOutReset

jmp reproduz







tecla_2:

push manip
call waveInReset

jmp grava







tecla_esc:



;fecha o dispositivo de grava��o

push manip ;manipulador
call waveInClose




;fecha o dispositivo de reprodu��o

push manip2 ;manipulador
call waveOutClose



push 0
call ExitProcess
end start


###################################################################################
###################################################################################
###################################################################################

CO-PROCESSADOR PONTO FLUTUANTE FPU
Calculos em ponto flutuante com a FPU por funções da biblioteca
(includes gerados que não fazem parte do pacote masm32, fornecidos adiante)



include \masm32\include\masm32rt.inc
include \masm32\masm32_prog\funcoes\diversos.inc
include \masm32\masm32_prog\funcoes\converte.inc
include \masm32\include\fpu.inc
includelib \masm32\lib\fpu.lib
include \masm32\masm32_prog\funcoes\fpulib.inc





.data

;80 bits ponto flutuante

n1 dt 10.0
n2 dt 20.0
n3 dt 40.0
n4 dt 4.0
n5 dt 3.0
n6 dt 30.0
n7 dt 0.4
n8 dt 3.4837
n9 dt 5.9834
n10 dt 3.0
n11 dt 50.0
n12 dt 40.0
n13 dt -10.0
n14 dt 20.0
n15 dt 3.0
n16 dt 2.0












.code



start:


call fpulib_80bits ;inicializa





;soma subrai multiplica divide

mov eax, offset n1
call fpulib_80bitsfpu ;copia variavel na fpu

mov eax, offset n2
call fpulib_soma

mov eax, offset n3
call fpulib_subtrai

mov eax, offset n4
call fpulib_multiplica

mov eax, offset n5
call fpulib_divide


call fpulib_mostra ;mostra fpu -13.333






;trigonometria seno coseno tangente arco seno arco coseno arcotangente

mov eax, offset n6
call fpulib_80bitsfpu ;copia variavel na fpu
call fpulib_seno ;seno
call fpulib_mostra ;mostra fpu 0.5

mov eax, offset n6
call fpulib_80bitsfpu ;copia variavel na fpu
call fpulib_coseno ;coseno
call fpulib_mostra ;mostra fpu 0.866

mov eax, offset n6
call fpulib_80bitsfpu ;copia variavel na fpu
call fpulib_tangente ;tangente
call fpulib_mostra ;mostra fpu 0.577


mov eax, offset n7
call fpulib_80bitsfpu ;copia variavel na fpu
call fpulib_aseno ;aseno
call fpulib_mostra ;mostra fpu 23.578

mov eax, offset n7
call fpulib_80bitsfpu ;copia variavel na fpu
call fpulib_acoseno ;acoseno
call fpulib_mostra ;mostra fpu 66.42

mov eax, offset n7
call fpulib_80bitsfpu ;copia variavel na fpu
call fpulib_atangente ;atangente
call fpulib_mostra ;mostra fpu 21.8




;potencia
mov eax, offset n8
call fpulib_80bitsfpu ;variavel na fpu

mov eax, offset n9
call fpulib_potencia ;potencia
call fpulib_mostra ;mostra fpu 1750.84




;exponencial
mov eax, offset n10
call fpulib_80bitsfpu ;variavel na fpu
call fpulib_exp ;exponencial
call fpulib_mostra ;mostra fpu 20.08





;logaritmo base 10
mov eax, offset n11
call fpulib_80bitsfpu ;variavel na fpu
call fpulib_log ;logaritmo
call fpulib_mostra ;mostra fpu 1.698




;logaritmo neperiano
mov eax, offset n12
call fpulib_80bitsfpu ;variavel na fpu
call fpulib_ln ;logaritmo neperiano
call fpulib_mostra ;mostra fpu 3.68



;constante pi
call fpulib_pi ;pi
call fpulib_mostra ;mostra fpu 3.14




;constante e
call fpulib_e ;e
call fpulib_mostra ;mostra fpu 2.718



;valor absoluto
mov eax, offset n13
call fpulib_80bitsfpu ;copia variavel na fpu
call fpulib_absoluto
call fpulib_mostra ;mostra fpu 10.0



;muda sinal fpu
mov eax, offset n14
call fpulib_80bitsfpu ;copia variavel na fpu
call fpulib_sinal
call fpulib_mostra ;mostra fpu -20.0




;compara
mov eax, offset n15
call fpulib_80bitsfpu ;copia variavel na fpu
mov eax, offset n16
call fpulib_compara ;compara fpu com variavel
push eax
call converte_32hexa ;converte eax e mostra
push eax
call diversos_texto ;mostra maior = 2 2






call diversos_finaliza

end start



########################################################################################################


CO-PROCESSADOR PONTO FLUTUANTE FPU
Calculos em ponto flutuante com a FPU por instruções
(includes gerados que não fazem parte do pacote masm32, fornecidos adiante)





include \masm32\include\masm32rt.inc
include \masm32\include\Fpu.inc
includelib \masm32\lib\Fpu.lib
include \masm32\masm32_prog\funcoes\diversos.inc
include \masm32\masm32_prog\funcoes\converte.inc







.data


va dt 20.0
vb dt 10.0
vc dt 15.0
vd dt 2.0
ve dt 3.0


resultado dt 0ffffffffffffffffffffh




.code






;pilha fpu: 8 registros rotacionais 80bit st0, st1... st7
;----------------------------------------------------------
;adi��o de dados rotaciona pilha de registros
;retirada de dados retrocede pilha de registros
;
;
;
;
; st0,1...7 formatos:
;
; 80 bits ponto flutuante:
; 79 78...64 63...0
; inteiro apos virgula
;
;
; 64 bits ponto flutuante: (mais rapido, padrao)
; 63 62...52 51...0
; inteiro apos virgula
;
;
; 64 bits inteiro, complemento de 2
; 63...0
;
;
; 32 bits inteiro, complemento de 2
; 31...0
;
;
; 80 bits bcd inteiro decimal
; 79 75...72 3...0
; sinal digito 17 digito 0
;
;
;----------------------------------------------------------
;
;
;
;registro de controle
;----------------------------------------------
;15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
;
; X RC RC PC PC PM UM OM ZM DM IM
;
;
; X = controle infinito
; RC = controle arredondamento
; PC = controle precis�o
; PM = precis�o
; UM = pilha vazia (underflow)
; OM = pilha cheia (overflow)
; ZM = dividido por zero
; DM = opera��o anormal
; IM = opera��o invalida
;
; RC bits 11 10
; 00 = mais pr�ximo ou mesmo
; 01 = abaixo
; 10 = acima
; 11 = resultado truncado
;
; PC bits 09 08
; 00 = 24 bits
; 01 = reservado
; 10 = 53 bits = 64 bits ponto flutuante
; 11 = 64 bits = 80 bits ponto flutuante
;
;----------------------------------------------
;
;
;
;
;registro de estado
;----------------------------------------------
;15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
;
; C3 TS TS TS C2 C1 C0 EF SF PR UD OV ZD DN IO
;
; IO = opera��o invalida
; DN = anormalizado
; ZD = dividido por zero
; OV = pilha cheia
; UD = pilha vazia
; PR = precis�o
; SF = falha na pilha
; EF = bit excess�o
; C3,2,1 = codigo de condi��o
; TS 2,1,0 = aponta qual registro no topo da pilha (st0...7), usado pela fpu
;
;----------------------------------------------
;
;
;
;
;
;
;
;instru��es fpu
;----------------------------------------------
;
;
;
;fld variavel
;
; copia variavel 80bit em st0, rotacionando registros (avan�ando)
;
;
;fld st(0)
;
; duplica registro
;
;
;
;fstp variavel
;
; move st0 na variavel 80bit, retrocedendo
;
;
;fild variavel
;
; converte variavel 32bits em st0, rotacionando
;
;
;fistp variavel
;
; converte st0 na variavel 32bits,retrocedendo
;
;
;fbld variavel
;
; converte variavel bcd em st0, rotacionando
;
;
;
;fbstp variavel
;
; converte st0 na variavel bcd, retrocedendo
;
;
;
;fxch st(1)
;
; troca valores entre st0 (topo) e o registro especificado, exemplo st1
;
;
;fadd
;
; st1 + st0, resultado em st0, retrocedendo registros
;
;
;fsubr
;
; st1 - st0, resultado em st0, retrocedendo registros
;
;
;fmul
;
; st1 * st0, resultado em st0, retrocedendo registros
;
;
;fdiv
;
; st1 / st0, resultado em st0, retrocedento registros
;
;
;
;fldpi
;
; constante pi em st0, rotacionando registros
;
;
;fcos
;
; coseno de st0 radianos, resultado em st0, retrocedento registros
;
;fsin
;
; seno de st0 radianos, resultado em st0, retrocedendo registros
;
;
;fsincos
;
; seno e coseno de st0, resultados: cos em st0, sen em st1
; tangente = seno/coseno = fdiv (st1/st0)
;
;
;
;fdecstp
;
; avan�a registros (decrementa registro de pilha)
;
;
;fincstp
;
; retrocede registros (incrementa registro de pilha)
;
;
;fstcw variavel
;
; le registro de controle fpu na variavel 16bits
;
;
;
;fldcw variavel
;
; escreve variavel 16 bits no registro de controle fpu
;
;
;
;fstsw variavel
;
; le registro de estado fpu na variavel 16bits
;
;
;
;
;----------------------------------------------




start:

;calcula em 80 bits: A + B - C * D / E

fld va ;A na pilha em st0
fld vb ;B em st0, A em st1
fadd ;soma, resultado em st0
fld vc ;C em st0, resultado anterior em st1
fsubr ;subtrai st1 - st0, resultado em st0
fld vd ;D em st0, resultado anterior em st1
fmul ;multiplica st1 * st0, resultado em st0
fld ve ;E em st0, resultado anterior em st1
fdiv ;divide st1 / st0, resultado em st0



fstp resultado ;move st0 na variavel, retrocedendo

push offset resultado ;mostra resultado 80bit em hexadecimal
call diversos_80hexa



fcos


call diversos_finaliza

end start



###################################################################################################
###################################################################################################
###################################################################################################

Includes utilizados nos programas anteriores:


##################################################################################################

diversos.inc




;fun��es:
;
;
;
;diversos_texto offset texto
;
; cria uma caixa de mensagens pelo endere�o do texto, com um bot�o OK de sa�da
;
;
;diversos_finaliza
;
; finaliza o programa
;
;
;diversos_abrearquivo offset nome_do_arquivo
;
; abre arquivo, retorna manipulador em eax
;
;
;diversos_tamanhoarquivo manipulador
;
; retorna tamanho do arquivo em eax pelo manipulador
;
;
;diversos_alocamemoriaarquivo tamanho
;
; aloca memoria pelo tamanho, retorna endere�o em eax
;
;
;diversos_learquivo manipulador, endere�o, tamanho
;
; copia arquivo na memoria a partir do manipulador do arquivo aberto, endere�o da
; memoria alocada e o tamanho do arquivo
;
;
;diversos_criaarquivo offset nome_do_arquivo
;
; cria um arquivo a partir do ponteiro do nome, manipulador em eax
;
;
;diversos_escrevearquivo manipulador, endere�o, tamanho
;
; copia memoria no arquivo a partir do manipulador do arquivo criado, endere�o da
; memoria e o tamanho do arquivo
;
;
;
;diversos_alocamemoria bytes
;
; aloca memoria, endere�o retornado em eax
;
;
;
;diversos_teclado tecla
;
; verifica estado da tecla (teclas_codigos.txt), retorna al: 0 = solta, 1 = pressionada
;
;
;
;diversos_milisegundos
;
; retorna o contador de milisegundos do sistema (32 bits)
;
;
;
;diversos_procuraprimeiroarquivo offset filtro
;
; procura primeiro arquivo de um diretorio conforme
; ponteiro filtro (*.* = todos). Retorna manipulador p/ proximas procuras,
; ebx aponta nome do arquivo
;
;
;diversos_procuraproximoarquivo manipulador
;
; procura proximos arquivos a partir do manipulador retornado,
; ebx aponta nome do arquivo. Se eax = 0, acabou arquivos
;
;
;
;diversos_copiatexto ponteiro destino, endereco destino, ponteiro fonte, endereco fonte
;
; adiciona texto fonte no destino a partir dos ponteiros, retornando bytes copiados
; em ecx p/ atualizar ponteiros
;
;
;
;diversos_80hexa offset variavel
;
; variavel 80 bits mostrada em hexadecimal
;
;
;
;diversos_64hexa offset variavel
;
; variavel 64 bits mostrada em hexadecimal
;
;
;
;diversos_32hexa offset variavel
;
; variavel 32 bits mostrada em hexadecimal
;
;-----------------------------------------------------------------------------------------




.data
titulo db "texto",0

diversos_80hexaendereco db "00000000000000000000",0
diversos_64hexaendereco db "0000000000000000",0
diversos_32hexaendereco db "00000000",0


.data?

diversos_enderecoretorno dd ?
diversos_manipulador dd ?
diversos_endereco dd ?
diversos_tamanho dd ?
diversos_filtro dd ?


diversos_estrutura WIN32_FIND_DATA {?}

diversos_80hexaponteiro dd ?
diversos_80hexavariavel dd ?

diversos_64hexaponteiro dd ?
diversos_64hexavariavel dd ?

diversos_32hexaponteiro dd ?
diversos_32hexavariavel dd ?




.const








.code



diversos_texto proc

pop diversos_enderecoretorno

pop eax ;endere�o texto

push 0
push offset titulo
push eax
push 0
call MessageBox ;user32.inc

push diversos_enderecoretorno
ret

diversos_texto endp






diversos_finaliza proc

push 0
call ExitProcess ;kernel32.inc

diversos_finaliza endp





diversos_abrearquivo proc

pop diversos_enderecoretorno

pop ebx ;ponteiro nome do arquivo
mov eax, fopen(ebx) ;abre arquivo BINARIO, retorna manipulador eax
;masm32rt.inc
push diversos_enderecoretorno
ret

diversos_abrearquivo endp





diversos_tamanhoarquivo proc

pop diversos_enderecoretorno

pop ebx ;manipulador de arquivo aberto
mov eax, fsize(ebx) ;retorna tamanho em eax
;masm32rt.inc

push diversos_enderecoretorno
ret

diversos_tamanhoarquivo endp







diversos_alocamemoriaarquivo proc

pop diversos_enderecoretorno

pop ebx ;tamanho do arquivo p/ alocar memoria
mov eax, alloc(ebx) ;aloca memoria com tamanho do arquivo,
; endere�o retornado em eax masm32rt.inc
push diversos_enderecoretorno
ret

diversos_alocamemoriaarquivo endp









diversos_learquivo proc

pop diversos_enderecoretorno

pop diversos_manipulador ;manipulador do arquivo
pop diversos_endereco ;endere�o da memoria
pop diversos_tamanho ;tamanho do arquivo

mov eax, fread(diversos_manipulador,diversos_endereco,diversos_tamanho) ;copia arquivo na memoria
; eax descartado masm32rt.inc

push diversos_enderecoretorno
ret

diversos_learquivo endp








diversos_criaarquivo proc

pop diversos_enderecoretorno

pop ebx ;ponteiro do nome do arquivo
mov eax, fcreate(ebx) ;cria novo arquivo, retorna manipulador eax
;masm32rt.inc

push diversos_enderecoretorno
ret

diversos_criaarquivo endp







diversos_escrevearquivo proc

pop diversos_enderecoretorno

pop diversos_manipulador ;manipulador do arquivo
pop diversos_endereco ;endere�o da memoria
pop diversos_tamanho ;tamanho do arquivo

mov eax, fwrite(diversos_manipulador,diversos_endereco,diversos_tamanho) ;escreve memoria em arquivo
;masm32rt.inc
push diversos_enderecoretorno
ret

diversos_escrevearquivo endp








diversos_alocamemoria proc

pop diversos_enderecoretorno

call Alloc ;aloca memoria, bytes na pilha
;endere�o retornado em eax masm32.inc

push diversos_enderecoretorno

ret
diversos_alocamemoria endp






diversos_teclado proc

pop diversos_enderecoretorno

call GetAsyncKeyState ;verifica tecla na pilha (teclas_codigos.txt)
;retorna al : 0 = tecla solta,
; 1 = tecla pressionada

push diversos_enderecoretorno

ret
diversos_teclado endp








diversos_milisegundos proc

pop diversos_enderecoretorno

call GetTickCount ;Contador de milisegundos do sistema
; 32bits, retorno em eax

push diversos_enderecoretorno

ret
diversos_milisegundos endp













diversos_procuraprimeiroarquivo proc

pop diversos_enderecoretorno

pop diversos_filtro

push offset diversos_estrutura ;estrutura que receber� o nome do arquivo encontrado
push diversos_filtro ;filtro na busca "*.*" p/ todos
call FindFirstFile ;procura primeiro arquivo, manipulador em eax
mov ebx, offset diversos_estrutura.cFileName ;ebx = ponteiro do nome do arquivo
;eax = manipulador p/ proximas buscas
push diversos_enderecoretorno
ret
diversos_procuraprimeiroarquivo endp






diversos_procuraproximoarquivo proc

pop diversos_enderecoretorno

pop diversos_manipulador


push offset diversos_estrutura ;estrutura que receber� o nome do arquivo encontrado
push diversos_manipulador ;manipulador retornado de FindFirstFile
call FindNextFile ;procura proximo arquivo
mov ebx, offset diversos_estrutura.cFileName ;ebx ponteiro do nome do arquivo
;se eax 0, nao encontrou mais arquivos, fim

push diversos_enderecoretorno
ret
diversos_procuraproximoarquivo endp









diversos_copiatexto proc

pop diversos_enderecoretorno

pop ebx ;ponteiro destino
pop edi ;endereco destino
pop eax ;ponteiro fonte
pop esi ;endereco fonte


mov ecx, 0

diversos_copiatextoretorna:

mov dl, byte ptr [esi][eax] ;copia byte da fonte
mov byte ptr [edi][ebx], dl ;escreve byte no destino

cmp dl, 0 ;compara 0 se chegou no fim do texto
je diversos_copiatextofim

inc eax ;incrementa ponteiros e contador
inc ebx
inc ecx

jmp diversos_copiatextoretorna



diversos_copiatextofim:


push diversos_enderecoretorno

ret
diversos_copiatexto endp













diversos_80hexa proc

pop eax ;tira endere�o de retorno

pop esi ;tira demais argumentos

push eax ;volta com endere�o de retorno na pilha

mov diversos_80hexavariavel, esi ;guarda endere�o da variavel


mov diversos_80hexaponteiro, 0 ;ponteiro iniciado 0




mov eax, dword ptr [esi][8] ;32 bits mais significativos

and eax, 00000ffffh ;apaga 2 ultimos bytes nao usados 96-80 = 16 bits

push eax
call converte_32hexa ;converte eax em texto hexa, retornando ebx

push eax ;endereco fonte
push 0 ;ponteiro fonte
push offset diversos_80hexaendereco ;endereco destino
push diversos_80hexaponteiro ;ponteiro destino
call diversos_copiatexto ;adiciona fonte no destino

add diversos_80hexaponteiro, ecx ;avan�a ponteiro com n bytes copiados


mov esi, diversos_80hexavariavel ;endere�o variavel

mov eax, dword ptr [esi][4] ;32 bits intermediarios

push eax
call converte_32hexa ;converte em texto hexa


push eax ;endereco fonte
push 0 ;ponteiro fonte
push offset diversos_80hexaendereco ;endereco destino
push diversos_80hexaponteiro ;ponteiro destino
call diversos_copiatexto ;adiciona novamente

add diversos_80hexaponteiro, ecx ;atualiza ponteiro com bytes copiados


mov esi, diversos_80hexavariavel ;endere�o variavel

mov eax, dword ptr [esi][0] ;primeiros 32 bits menos significativos

push eax
call converte_32hexa ;converte em texto hexa

push eax ;endereco fonte
push 0 ;ponteiro fonte
push offset diversos_80hexaendereco ;endereco destino
push diversos_80hexaponteiro ;ponteiro destino
call diversos_copiatexto




push offset diversos_80hexaendereco ;mostra texto
call diversos_texto


ret
diversos_80hexa endp


















diversos_64hexa proc

pop eax ;tira endere�o de retorno

pop esi ;tira demais argumentos

push eax ;volta com endere�o de retorno na pilha

mov diversos_64hexavariavel, esi ;guarda endere�o da variavel


mov diversos_64hexaponteiro, 0 ;ponteiro iniciado 0



mov esi, diversos_64hexavariavel ;endere�o variavel

mov eax, dword ptr [esi][4] ;32 bits intermediarios

push eax
call converte_32hexa ;converte em texto hexa


push eax ;endereco fonte
push 0 ;ponteiro fonte
push offset diversos_64hexaendereco ;endereco destino
push diversos_64hexaponteiro ;ponteiro destino
call diversos_copiatexto ;adiciona novamente

add diversos_64hexaponteiro, ecx ;atualiza ponteiro com bytes copiados


mov esi, diversos_64hexavariavel ;endere�o variavel

mov eax, dword ptr [esi][0] ;primeiros 32 bits menos significativos

push eax
call converte_32hexa ;converte em texto hexa

push eax ;endereco fonte
push 0 ;ponteiro fonte
push offset diversos_64hexaendereco ;endereco destino
push diversos_64hexaponteiro ;ponteiro destino
call diversos_copiatexto




push offset diversos_64hexaendereco ;mostra texto
call diversos_texto


ret
diversos_64hexa endp










diversos_32hexa proc

pop eax ;tira endere�o de retorno

pop esi ;tira demais argumentos

push eax ;volta com endere�o de retorno na pilha

mov diversos_32hexavariavel, esi ;guarda endere�o da variavel


mov diversos_32hexaponteiro, 0 ;ponteiro iniciado 0



mov esi, diversos_32hexavariavel ;endere�o variavel

mov eax, dword ptr [esi][0] ;primeiros 32 bits menos significativos

push eax
call converte_32hexa ;converte em texto hexa

push eax ;endereco fonte
push 0 ;ponteiro fonte
push offset diversos_32hexaendereco ;endereco destino
push diversos_32hexaponteiro ;ponteiro destino
call diversos_copiatexto




push offset diversos_32hexaendereco ;mostra texto
call diversos_texto


ret
diversos_32hexa endp




#######################################################################################################33

converte.inc



;
;fun��es:
;
;
;converte_32hexa valor 32 bits
;
;
; converte um valor binario 32 bits num texto hexadecimal de 8 caracteres,
; retornando endere�o do texto em eax
;
;
;--------------------------------------------------------------------------------------------







.data
converte_32hexatexto db "00000000",0


.data?
converte_caractere1 db ?
converte_caractere2 db ?
converte_caractere3 db ?
converte_caractere4 db ?
converte_caractere5 db ?
converte_caractere6 db ?
converte_caractere7 db ?
converte_caractere8 db ?



converte_endereco dd ?

.code







converte_32hexa proc ;converte eax binario em texto com 8 caracteres hexa,
; endere�o retornado em ebx


pop ebx ;endere�o de retorno em ebx temporario
pop eax ;valor em eax
push ebx ;volta endere�o de retorno na pilha

mov ebx, eax ;copia primeiro nibble (caractere) em bl: bits 3210
and bl, 0fh ;zera nibble superior

cmp bl, 10 ;compara com 10
jb converte_numero1
jmp converte_letra1

converte_numero1:
add bl, 030h ;converte numero em caractere numerico, somando 030h (caractere 0)
jmp converte_alfanum1fim

converte_letra1:
add bl, 057h ;converte numero em caractere alfabetico, somando 057h
; 061h (letra A) - 10 (inicio hexa) = 057h
converte_alfanum1fim:

mov converte_caractere1, bl






mov ebx, eax ;copia segundo nibble (caractere) em bl: bits 7654
ror ebx, 4 ;move nibble superior p/ inferior
and bl, 0fh ;zera nibble superior

cmp bl, 10 ;compara com 10
jb converte_numero2
jmp converte_letra2

converte_numero2:
add bl, 030h ;converte numero em caractere numerico, somando 030h (caractere 0)
jmp converte_alfanum2fim

converte_letra2:
add bl, 057h ;converte numero em caractere alfabetico, somando 057h
; 061h (letra A) - 10 (inicio hexa) = 057h
converte_alfanum2fim:

mov converte_caractere2, bl







mov ebx, eax ;copia terceiro nibble (caractere) em bl: bits 3210
ror ebx, 8 ;move nibble
and bl, 0fh ;zera nibble superior

cmp bl, 10 ;compara com 10
jb converte_numero3
jmp converte_letra3

converte_numero3:
add bl, 030h ;converte numero em caractere numerico, somando 030h (caractere 0)
jmp converte_alfanum3fim

converte_letra3:
add bl, 057h ;converte numero em caractere alfabetico, somando 057h
; 061h (letra A) - 10 (inicio hexa) = 057h
converte_alfanum3fim:

mov converte_caractere3, bl





mov ebx, eax ;copia quarto nibble (caractere) em bl: bits 7654
ror ebx, 12 ;move nibble
and bl, 0fh ;zera nibble superior

cmp bl, 10 ;compara com 10
jb converte_numero4
jmp converte_letra4

converte_numero4:
add bl, 030h ;converte numero em caractere numerico, somando 030h (caractere 0)
jmp converte_alfanum4fim

converte_letra4:
add bl, 057h ;converte numero em caractere alfabetico, somando 057h
; 061h (letra A) - 10 (inicio hexa) = 057h
converte_alfanum4fim:

mov converte_caractere4, bl






mov ebx, eax ;copia quinto nibble (caractere) em bl: bits 3210
ror ebx, 16 ;move nibble
and bl, 0fh ;zera nibble superior

cmp bl, 10 ;compara com 10
jb converte_numero5
jmp converte_letra5

converte_numero5:
add bl, 030h ;converte numero em caractere numerico, somando 030h (caractere 0)
jmp converte_alfanum5fim

converte_letra5:
add bl, 057h ;converte numero em caractere alfabetico, somando 057h
; 061h (letra A) - 10 (inicio hexa) = 057h
converte_alfanum5fim:

mov converte_caractere5, bl





mov ebx, eax ;copia sexto nibble (caractere) em bl: bits 7654
ror ebx, 20 ;move nibble superior p/ inferior
and bl, 0fh ;zera nibble superior

cmp bl, 10 ;compara com 10
jb converte_numero6
jmp converte_letra6

converte_numero6:
add bl, 030h ;converte numero em caractere numerico, somando 030h (caractere 0)
jmp converte_alfanum6fim

converte_letra6:
add bl, 057h ;converte numero em caractere alfabetico, somando 057h
; 061h (letra A) - 10 (inicio hexa) = 057h
converte_alfanum6fim:

mov converte_caractere6, bl




mov ebx, eax ;copia setimo nibble (caractere) em bl: bits 3210
ror ebx, 24 ;move nibble
and bl, 0fh ;zera nibble superior

cmp bl, 10 ;compara com 10
jb converte_numero7
jmp converte_letra7

converte_numero7:
add bl, 030h ;converte numero em caractere numerico, somando 030h (caractere 0)
jmp converte_alfanum7fim

converte_letra7:
add bl, 057h ;converte numero em caractere alfabetico, somando 057h
; 061h (letra A) - 10 (inicio hexa) = 057h
converte_alfanum7fim:

mov converte_caractere7, bl







mov ebx, eax ;copia oitavo nibble (caractere) em bl: bits 7654
ror ebx, 28 ;move nibble superior p/ inferior
and bl, 0fh ;zera nibble superior

cmp bl, 10 ;compara com 10
jb converte_numero8
jmp converte_letra8

converte_numero8:
add bl, 030h ;converte numero em caractere numerico, somando 030h (caractere 0)
jmp converte_alfanum8fim

converte_letra8:
add bl, 057h ;converte numero em caractere alfabetico, somando 057h
; 061h (letra A) - 10 (inicio hexa) = 057h
converte_alfanum8fim:

mov converte_caractere8, bl











mov edi, offset converte_32hexatexto ;copia endere�o do texto no indexador edi

mov bl, converte_caractere8
mov byte ptr [edi][0], bl
mov bl, converte_caractere7
mov byte ptr [edi][1], bl
mov bl, converte_caractere6
mov byte ptr [edi][2], bl
mov bl, converte_caractere5
mov byte ptr [edi][3], bl
mov bl, converte_caractere4
mov byte ptr [edi][4], bl
mov bl, converte_caractere3
mov byte ptr [edi][5], bl
mov bl, converte_caractere2
mov byte ptr [edi][6], bl
mov bl, converte_caractere1
mov byte ptr [edi][7], bl

mov eax, edi ;retorna endere�o em ebx



ret
converte_32hexa endp




##########################################################################################################


fpulib.inc


;
;fun��es: (fpu tratada como registro e n�o pilha)
;-------------------------------------------------------------------------------
;
;fpulib_80bitsfpu
;
; copia variavel 80bits apontada por eax na fpu
;
;
;fpulib_32bitsfpu
;
; converte variavel 32bits apontada por eax na fpu
;
;
;fpulib_fpu80bits
;
; move fpu na memoria 80bits apontada por eax
;
;
;fpulib_fpu32bits proc
;
; converte fpu na memoria 32bits apontada por eax
;
;
;
;fpulib_80bits80bits
;
; copia variavel 80bitss apontada por eax em outra apontada por ebx
;
;
;fpulib_fputexto
;
; converte fpu 80bits em texto apontado por eax
;
;
;fpulib_textofpu
;
; converte texto apontado por eax em 80bits na fpu
;
;
;-------------------------------------------------------------------------------
;
;
;fpulib_mostra
;
; mostra fpu numa caixa de mensagem
;
;
;fpulib_80bits proc
;
; inicializa registro de controle fpu modo 80 bits ponto flutuante
;
;
;
;
;-------------------------------------------------------------------------------
;
;fpulib_soma
;
; fpu + 80bits apontado por eax, resultado em fpu
;
;
;
;fpulib_subtrai
;
; fpu - 80bits apontado por eax, resultado em fpu
;
;
;
;
;fpulib_multiplica
;
; fpu * 80bits apontado por eax, resultado em fpu
;
;
;
;fpulib_divide
;
;
; fpu / 80bits apontado por eax, resultado em fpu
;
;
;
;fpulib_seno
;
; seno de fpu em graus, resultado na fpu
;
;
;
;fpulib_coseno
;
; coseno de fpu em graus, resultado na fpu
;
;
;
;fpulib_tangente proc
;
; tangente de fpu em graus, resultado na fpu
;
;
;
;fpulib_aseno proc
;
; arco seno de fpu , resultado em graus na fpu
;
;
;
;fpulib_acoseno proc
;
; arco coseno de fpu, resultado na fpu em graus
;
;
;
;fpulib_atangente proc
;
; arco tangente de fpu, resultado na fpu em graus
;
;
;
;fpulib_potencia proc
;
; fpu elevado a 80bits apontado por eax, resultado na fpu
;
;
;
;fpulib_exp proc
;
; potencia base e de fpu, resultado na fpu
;
;
;
;fpulib_log proc
;
; log base 10 de fpu, resultado na fpu
;
;
;
;fpulib_ln
;
; log base e de fpu, resultado na fpu
;
;
;fpulib_pi
;
; copia constante pi 80bits na fpu
;
;
;
;fpulib_e
;
; copia constante e 80bits na fpu
;
;
;
;fpulib_absoluto
;
; valor absoluto de fpu 80bits, resultado na fpu
;
;
;
;
;fpulib_sinal
;
; muda sinal de fpu 80bits
;
;
;
;fpulib_compara
;
; compara fpu com variavel 80bits, retorna eax:
; fpu igual 1
; fpu maior 2
; fpu menor 4
;
;
;
;-------------------------------------------------------------------------------
;
;
;
;modos:
;
;
;SRC1_FPU 001h ;fonte1 est� na fpu
;SRC1_REAL 002h ;fonte1 aponta vari�vel 80 bits
;SRC1_DMEM 004h ;fonte1 aponta vari�vel 32 bits sinalizada
;SRC1_DIMM 008h ;fonte1 � vari�vel 32 bits sinalizada
;SRC1_CONST 010h ;fonte1 � constante: FPU_PI, FPU_NAPIER
;
;SRC2_FPU 100h ;fonte2 est� na fpu
;SRC2_REAL 200h ;fonte2 aponta vari�vel 80 bits
;SRC2_DMEM 400h ;fonte2 aponta vari�vel 32 bits sinalizada
;SRC2_DIMM 800h ;fonte2 � vari�vel 32 bits sinalizada
;SRC2_CONST 1000h ;fonte2 � constante: FPU_PI, FPU_NAPIER
;
;DEST_MEM 0h ;resultado aponta vari�vel 80 bits
;DEST_IMEM 40h ;resultado aponta vari�vel 32 bits sinalizada
;DEST_FPU 80h ;resultado fica na fpu
;
;STR_REG 000h
;STR_SCI 8000h
;
;CMP_EQU 1h
;CMP_GREATER 2h
;CMP_LOWER 4h











.data
fpulib_resultado dt 0

fpulib_texto db "000000000000000000000000000000",0

fpulib_variavel16 dw 0

fpulib_variavel0 dt 0.0





.code





;fun��es fpu de transferencia e conversao de texto
;-------------------------------------------------------------------------------

fpulib_80bitsfpu proc ;copia variavel 80bits apontada por eax na fpu

push 0282h ;0282h SRC1_REAL SRC2_REAL DEST_FPU
push 0 ;destino (0= fpu)
push offset fpulib_variavel0 ;numero2
push eax ;numero1
call FpuAdd ;soma

ret
fpulib_80bitsfpu endp







fpulib_32bitsfpu proc ;converte variavel 32bits apontada por eax na fpu

push 0284h ;0284h SRC1_DMEM SRC2_REAL DEST_FPU
push 0 ;destino (0= fpu)
push offset fpulib_variavel0 ;numero2
push eax ;numero1
call FpuAdd ;soma

ret
fpulib_32bitsfpu endp








fpulib_fpu80bits proc ;copia fpu na memoria apontada por eax

push 0201h ;0201h SRC1_FPU SRC2_REAL DEST_MEM
push eax ;destino 80bits
push offset fpulib_variavel0 ;numero2 80bits zerado
push 0 ;numero1 fpu
call FpuAdd ;soma

ret
fpulib_fpu80bits endp







fpulib_fpu32bits proc ;copia fpu na memoria apontada por eax

push 041h ;041h SRC1_FPU DEST_IMEM
push eax ;destino 32bits
push 0 ;fonte0 fpu
call FpuTrunc ;copia parte inteira do ponto flutuante

ret
fpulib_fpu32bits endp











fpulib_80bits80bits proc ;copia variavel 80bitss apontada por eax em outra ebx

push 0202h ;0202h SRC1_REAL SRC2_REAL DEST_MEM
push ebx ;destino 80bits
push offset fpulib_variavel0 ;numero2 80bits
push eax ;numero1 80bits
call FpuAdd ;soma

ret
fpulib_80bits80bits endp









fpulib_fputexto proc ;converte 80bits fpu em texto apontado em eax

push 0801h ;0801h SRC1_FPU SRC2_DIMM STR_REG
;origem fpu destino ponteiro texto decimal
push eax ;ponteiro texto destino
push 15 ;casas apos virgula (15max)
push 0 ;fpu
call FpuFLtoA

ret
fpulib_fputexto endp







fpulib_textofpu proc ;converte texto apontado por eax em 80bits fpu

push 080h ;080h DEST_FPU
push 0 ;destino 80bits
push eax ;origem texto
call FpuAtoFL

ret
fpulib_textofpu endp











;mostra, inicializa fpu
;-------------------------------------------------------------------------------



fpulib_mostra proc ;move fpu 80 bits hexadecimal numa caixa de mensagem

mov eax, offset fpulib_resultado
call fpulib_fpu80bits ;copia fpu na vari�vel

mov eax, offset fpulib_resultado
call fpulib_80bitsfpu ;copia vari�vel de volta na fpu

mov eax, offset fpulib_texto
call fpulib_fputexto ;converte fpu em texto

push offset fpulib_texto
call diversos_texto ;mostra texto

mov eax, offset fpulib_resultado ;copia resultado de volta na fpu
call fpulib_80bitsfpu

ret
fpulib_mostra endp





fpulib_80bits proc ;inicializa com registro de controle

mov fpulib_variavel16, 0b2fh ;0b2fh = fpu 80 bits ponto flutuante
fldcw fpulib_variavel16

ret
fpulib_80bits endp









;funcoes matematicas
;-------------------------------------------------------------------------------




fpulib_soma proc ;fpu + 80bits apontado por eax, resultado em fpu

push 0281h ;0281h SRC1_FPU SRC2_REAL DEST_FPU
;primeiro numero na pilha, segundo na variavel, resultado na pilha

push 0 ;destino (0= ja esta na fpu)
push eax ;numero2
push 0 ;numero1
call FpuAdd ;soma

ret
fpulib_soma endp






fpulib_subtrai proc ;fpu - 80bits apontado por eax, resultado em fpu

push 0281h ;0281h SRC1_FPU SRC2_REAL DEST_FPU
;primeiro numero na pilha, segundo na variavel, resultado na pilha

push 0 ;destino (0= ja esta na fpu)
push eax ;numero2
push 0 ;numero1
call FpuSub ;subtrai

ret
fpulib_subtrai endp









fpulib_multiplica proc ;fpu * 80bits apontado por eax, resultado em fpu

push 0281h ;0281h SRC1_FPU SRC2_REAL DEST_FPU
;primeiro numero na pilha, segundo na variavel, resultado na pilha

push 0 ;destino (0= ja esta na fpu)
push eax ;numero2
push 0 ;numero1
call FpuMul ;multiplica

ret
fpulib_multiplica endp








fpulib_divide proc ;fpu / 80bits apontado por eax, resultado em fpu

push 0281h ;0281h SRC1_FPU SRC2_REAL DEST_FPU
;primeiro numero na pilha, segundo na variavel, resultado na pilha

push 0 ;destino (0= ja esta na fpu)
push eax ;numero2
push 0 ;numero1
call FpuDiv ;divide

ret
fpulib_divide endp








fpulib_seno proc ;seno de fpu em graus, resultado na fpu

push 081h ;081h SRC1_FPU DEST_FPU
push 0 ;0 = fpu
push 0
call FpuSin ;seno

ret
fpulib_seno endp






fpulib_coseno proc ;coseno de fpu em graus, resultado na fpu

push 081h ;081h SRC1_FPU DEST_FPU
push 0 ;0 = fpu
push 0
call FpuCos ;coseno

ret
fpulib_coseno endp








fpulib_tangente proc ;tangente de fpu em graus, resultado na fpu

push 081h ;081h SRC1_FPU DEST_FPU
push 0 ;0 = fpu
push 0
call FpuTan ;tangente

ret
fpulib_tangente endp






fpulib_aseno proc ;arco seno de fpu, resultado na fpu em graus

push 081h ;081h SRC1_FPU DEST_FPU
push 0 ;0 = fpu
push 0
call FpuArcsin ;aseno

ret
fpulib_aseno endp





fpulib_acoseno proc ;arco coseno de fpu, resultado na fpu em graus

push 081h ;081h SRC1_FPU DEST_FPU
push 0 ;0 = fpu
push 0
call FpuArccos ;acoseno

ret
fpulib_acoseno endp









fpulib_atangente proc ;arco tangente de fpu, resultado na fpu em graus

push 081h ;081h SRC1_FPU DEST_FPU
push 0 ;0 = fpu
push 0
call FpuArctan ;atangente

ret
fpulib_atangente endp










fpulib_potencia proc ;fpu elevado a 80bits, resultado na fpu

push 0281h ;0281h SRC1_FPU SRC2_REAL DEST_FPU
push 0 ;0 = fpu
push eax
push 0
call FpuXexpY ;potencia

ret
fpulib_potencia endp








fpulib_exp proc ;potencia base e de fpu, resultado na fpu

push 081h ;081h SRC1_FPU DEST_FPU
push 0 ;0 = fpu
push 0
call FpuEexpX ;potencia base e

ret
fpulib_exp endp









fpulib_log proc ;log base 10 de fpu, resultado na fpu

push 081h ;081h SRC1_FPU DEST_FPU
push 0 ;0 = fpu
push 0
call FpuLogx ;logaritmo

ret
fpulib_log endp








fpulib_ln proc ;log base e de fpu, resultado na fpu

push 081h ;081h SRC1_FPU DEST_FPU
push 0 ;0 = fpu
push 0
call FpuLnx ;logaritmo neperiano

ret
fpulib_ln endp



.code



fpulib_pi proc ;copia variavel 80bits apontada por eax na fpu

push 0290h ;0290h SRC1_CONST SRC2_REAL DEST_FPU
push 0 ;destino (0= fpu)
push offset fpulib_variavel0 ;numero2
push FPU_PI ;numero1
call FpuAdd ;soma

ret
fpulib_pi endp





fpulib_e proc ;copia variavel 80bits apontada por eax na fpu

push 0290h ;0290h SRC1_CONST SRC2_REAL DEST_FPU
push 0 ;destino (0= fpu)
push offset fpulib_variavel0 ;numero2
push FPU_NAPIER ;numero1
call FpuAdd ;soma

ret
fpulib_e endp








fpulib_absoluto proc ;valor absoluto de fpu 80bits, resultado na fpu

push 081h ;081h SRC1_FPU DEST_FPU
push 0 ;0 = fpu
push 0
call FpuAbs ;absoluto

ret
fpulib_absoluto endp







fpulib_sinal proc ;muda sinal de fpu 80bits

push 081h ;081h SRC1_FPU DEST_FPU
push 0 ;0 = fpu
push 0
call FpuChs ;muda sinal

ret
fpulib_sinal endp








fpulib_compara proc ;compara fpu com variavel 80bits
;
;retorna eax:
;fpu igual 1
;fpu maior 2
;fpu menor 4

push 201h ;201h SRC1_FPU SRC2_REAL
push eax ;numero2 = 80bits
push 0 ;numero1 = 0 fpu
call FpuComp ;compara

ret
fpulib_compara endp



#########################################################################################################
#########################################################################################################
#########################################################################################################
#########################################################################################################
#########################################################################################################
#########################################################################################################



Masm32 Referência rápida:




masm32 anota��es:
qeditor.exe edita os programas. O caminho inicial � c:\masm32\ , copiar masm32_prog aqui.


----------------
programa tipico:
----------------

---------------------------------------------------------------------------------------------
;coment�rios

;cabe�alho:

.586 ;codigo 32 bits
.model flat, stdcall ;segmento de memoria 32 bits
option casemap: none ;difere maiuscula e minuscula


include \masm32\include\windows.inc ;inclusao das fun��es
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib ;inclusao das bibliotecas
includelib \masm32\lib\kernel32.lib



.data
;declaracao de variaveis com valores
.data?
;declaracao de variaveis nao inicializadas
.const
;declaracao de constantes
.code
;rotinas
start:
;inicio do programa


push 0
call ExitProcess ;fim (kernel32.inc)

end start
---------------------------------------------------------------------------------------------



! Substitui o cabe�alho, fun��es e bibliotecas:
include \masm32\include\masm32rt.inc ;inclusao das principais fun�oes e bibliotecas






------------------------------------
variaveis inicializadas: campo .data
------------------------------------

texto db "mensagem",0 ;texto com caracteres 8 bits, 0 finaliza o texto
variavel db 0 ;cria variavel 8 bits inicializada com 0
variavel byte 0 ;igual
variavel dw 0 ;variavel 16 bits
variavel word 0 ;igual
variavel dd 0 ;variavel 32 bits
variavel dword 0 ;igual
matriz dword 0,1,2,3,4,5 ;matriz 32 bits

variavel dq 0 ;64 bits
variavel qword 0 ;64 bits

variavel dt 0.0 ;80 bits fpu ponto flutuante

variavel dd 4294967295 ;nota��o decimal 32 bits
variavel dd 0ffffffffh ;nota��o hexadecimal 32 bits (0 valor h)







-----------------------------------------
variaveis nao inicializadas: campo .data?
-----------------------------------------

igual a anterior, mas sem os valores:

variavel db ? ;cria variavel 8 bits
variavel DWORD ? ;variavel 32 bits







------------------------
constantes: campo .const
------------------------

teste = 1 ;define constantes
teste equ 1












--------------------
rotinas: campo .code
--------------------

invoke rotina ;chama rotina sem argumentos
call rotina ;chama rotina sem argumentos

invoke rotina,0,1,2,variavel1 ;chama rotina com argumentos

push variavel1 ;chama rotina com argumentos na pilha + endereco local
push 2
push 1
push 0
call rotina






rotina sem argumentos
---------------------
rotina proc
;programa
ret
rotina endp




argumentos invoke
-----------------
rotina proc variavel2:DWORD,variavel3:DWORD ;variaveis locais declaradas p/ receber argumentos
;programa
ret
rotina endp




argumentos call
---------------
rotina proc ;variaveis na pilha
pop variavel ;guarda endere�o de retorno em variavel
;programa
push variavel
ret
rotina endp





retorno de argumento em eax
---------------------------
rotina proc
;programa
return variavel
rotina endp













-----------------------
! declaracao de rotinas
-----------------------
Se as rotinas estiverem fora do .code, deverao ser declaradas no inicio do programa,
apos os includes:

rotina proto ;rotina sem argumentos
rotina proto :DWORD,:DWORD,:DWORD,:DWORD ;rotina com argumentos











-------------
! programa��o
-------------


--------------------------------
.data
texto db "mensagem",0

mov eax, offset texto ;copia endere�o do texto (offset)

--------------------------------

push 32bits ;argumento de 32 bits na pilha, p/ vari�vel de tamanho diferente
call fun��o


fun��o proc

pop eax
mov 8bits, al ;32 bits recebidos em eax, somente 8 bits de al na vari�vel

ret
fun��o endp


--------------------------------












---------------------
! classes, estruturas
---------------------
Algumas fun��es das bibliotecas pedem classes com par�metros:


.data?
classe TIPO {?} ;cria uma classe. TIPO conforme a fun��o


mov classe.parametro1, eax ;preeche a estrutura da classe de acordo com a fun��o
mov classe.parametro2, eax ; que ir� utiliz�-la. Nomes dos par�metros definidos
mov classe.parametro3, eax ; conforme a fun��o (includes)
...

push offset classe
call fun��o ;fun��o utiliza a classe a partir do endere�o






-------------
! manipulador
-------------
Algumas fun��es pedem um manipulador, normalmente j� existente de outras fun��es, ou
ser� preciso gerar um.


.data?
manip dd ? ;variavel que ser� o manipulador


;gera manipulador
push 0
call GetModuleHandle ;(kernel32.inc)
mov manip,eax








---------
! memoria
---------
edi:eax = endere�amento da memoria

edi = segmento do endere�o retornado de fun��es
eax = 0 = inicio do deslocamento a cada byte

mov dword ptr [edi][eax],ebx escreve 32 bits = 4 bytes proximo endere�o = eax + 4

mov byte ptr [edi][eax],bl escreve 1 byte



mov ebx, dword ptr [edi][eax] leitura da memoria








------------------
! copia da memoria
------------------
endere�amento fonte, destino

esi:eax = fonte
edi:ebx = destino

ecx = contador

edx = dado

------------------------------------
copiando:

mov edx, dword ptr [esi][eax] ;copia 32 bits: edx <- memoria
mov dword ptr [edi][ebx], edx ;copia 32 bits: memoria <- edx

add eax,4 ;proximos 32 bits = 4 bytes
add ebx,4

dec ecx ;contando
jnz copiando
------------------------------------







----------------------
! memoria de variaveis
----------------------
byte menos significativo primeiro


variavel dd 012345678h ;32 bits

mov esi, offset variavel ;copia endere�o da variavel

mov eax, dword ptr [esi][0] ;copia valor da variavel em eax 32 bits



variavel dq 01234567890123456h ;64 bits

mov esi, offset variavel ;copia endere�o

mov eax, dword ptr [esi][0] ;copia 32 bits menos significativo em eax

mov ebx, dword ptr [esi][4] ;copia 32 bits mais significativo em ebx (+4 bytes)



############################################################################################3