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

Nenhum comentário:
Postar um comentário