·

Ciência da Computação ·

Linguagens de Programação

Envie sua pergunta para a IA e receba a resposta na hora

Fazer Pergunta

Texto de pré-visualização

Universidade Federal da Paraíba Arquitetura de Computadores Ciências da Comutação Centro de Informática UFPB Prof Ewerton Salvador Entrada e Saída com Win32 e MASM32 Entrada de dados no NASM Universidade Federal da Paraíba Arquitetura de Computadores Centro de Informática UFPB No Windows operações de entrada e saída na console devem ser realizadas através de chamadas a funções da biblioteca kernel32 Includes necessários include masm32includewindowsinc definição de alias como NULL STDOUTPUTHANDLE etc include masm32includekernel32inc includelib masm32libkernel32lib funções como GetStdHandle WriteConsole e ExitProcess Entrada e Saída com Win32 Universidade Federal da Paraíba Arquitetura de Computadores Centro de Informática UFPB 686 model flatstdcall option casemapnone include masm32includewindowsinc include masm32includekernel32inc includelib masm32libkernel32lib data output db Hello World 0ah 0h outputHandle dd 0 Variavel para armazenar o handle de saida writecount dd 0 Variavel para armazenar caracteres escritos na console code start push STDOUTPUTHANDLE call GetStdHandle Call convention do tipo callee cleanup nao precisa mover esp depois mov outputHandle eax invoke WriteConsole outputHandle addr output sizeof output addr writecount NULL invoke ExitProcess 0 end start Entrada e Saída com Win32 Universidade Federal da Paraíba Arquitetura de Computadores Centro de Informática UFPB STDOUTPUTHANDLE indica que queremos um handle para escrever na console de saída call GetStdHandle Handle é gravado no registrador EAX invoke WriteConsole outputHandle addr output sizeof output addr writecount NULL outputHandle o handle pro buffer do console addr output passagem por referência do texto de saída sizeof output tamanho da string a ser impressa na console O operador sizeof retorna o tamanho total da estrutura de dados informada neste caso o tamanho de toda a string Para considerer apenas a quantidade de caracteres antes do terminador de string usar a função StrLen chamada invoke StrLen addr output o retorno será armazenado em EAX addr writecount valor de retorno secundário que contém o número de bytes escritos NULL reservado MSDN apenas pede pra passer NULL A função retorna um código de erro através do registrador EAX Entrada e Saída com Win32 Universidade Federal da Paraíba Arquitetura de Computadores Centro de Informática UFPB 686 model flatstdcall option casemapnone include masm32includewindowsinc include masm32includekernel32inc include masm32includemasm32inc includelib masm32libkernel32lib includelib masm32libmasm32lib data inputString db 50 dup0 inputHandle dd 0 Variavel para armazenar o handle de entrada outputHandle dd 0 Variavel para armazenar o handle de saida consolecount dd 0 Variavel para armazenar caracteres lidosescritos na console tamanhostring dd 0 Variavel para armazenar tamanho de string terminada em 0 code start invoke GetStdHandle STDINPUTHANDLE mov inputHandle eax invoke GetStdHandle STDOUTPUTHANDLE mov outputHandle eax invoke ReadConsole inputHandle addr inputString sizeof inputString addr consolecount NULL invoke StrLen addr inputString mov tamanhostring eax invoke WriteConsole outputHandle addr inputString tamanhostring addr consolecount NULL invoke ExitProcess 0 end start Entrada e Saída com Win32 Universidade Federal da Paraíba Arquitetura de Computadores Centro de Informática UFPB STDINPUTHANDLE indica que queremos um handle para ler da console de entrada invoke ReadConsole inputHandle addr inputString sizeof inputString addr consolecount NULL inputHandle o handle pro buffer do console addr inputString passagem por referência da string a ser recebida sizeof inpuString tamanho da memória alocada para a string de destino addr consolecount valor de retorno secundário que contém o número de bytes efetivamente lidos NULL apontador para estrutura CONSOLEREADCONSOLECONTROL a qual é capaz de especificar um caracter sinalizador de término da string A função retorna um código de erro através do registrador EAX Entrada e Saída com Win32 Universidade Federal da Paraíba Arquitetura de Computadores Centro de Informática UFPB Informações lidas com ReadConsole são armazenadas em uma string Números necessitam ser convertidos para tipos numéricos Possível solução da função atodw da biblioteca MASM32 include masm32includemasm32inc includelib masm32libmasm32lib invoke atodw addr umastring valor convertido é armazenado em EAX 32 bits Inverso invoke dwtoa eax addr umastring Problema quando a string convertida através de ReadConsole ela também contém o character de Carriage Return CR o que compromete a conversão Conversão de ASCII para DWORD Universidade Federal da Paraíba Arquitetura de Computadores Centro de Informática UFPB Possível solução antes de utilizar atodw percorrer a string de entrada verificando se cada byte representa um caracter numérico da tabela ASCII dígitos de 0 a 9 Assim que um caracter diferente de um dígito for encontrado inserir o caracter nulo na string para finalizála mov esi offset umastring Armazenar apontador da string em esi proximo mov al esi Mover caractere atual para al inc esi Apontar para o proximo caractere cmp al 13 Verificar se eh o caractere ASCII CR FINALIZAR jne proximo dec esi Apontar para caractere anterior onde o CR foi encontrado xor al al ASCII 0 terminado de string mov esi al Inserir ASCII 0 no lugar do ASCII CR Conversão de ASCII para DWORD Universidade Federal da Paraíba Arquitetura de Computadores Centro de Informática UFPB Entrada de dados no NASM 32 bits extern scanf printf global main section bss integer1 resd 1 section data message db O resultado eh d 0AH 0H request db Digite o numero 0H formatin db d 0H section text main push request call printf add esp 4 push integer1 push formatin call scanf add esp 8 push DWORD integer1 push message call printf add esp 8 mov eax 1 mov ebx 0 int 80h Universidade Federal da Paraíba Arquitetura de Computadores Centro de Informática UFPB Entrada de dados no NASM 64 bits extern scanf printf global main section bss integer1 resd 1 section data message db O resultado eh d 0AH 0H request db Digite o numero 0H formatin db d 0H section text main push rbp Garantir alinhamento da pilha em palavras de 16 bytes devido a calling convention mov rdi request xor rax rax Não serão utilizados registradores xmm call printf mov rsi integer1 mov rdi formatin xor rax rax call scanf mov esi integer1 mov rdi message xor rax rax Não serão utilizados registradores xmm call printf pop rbp Desempilhar o ebp empilhado no inicio da rotina principal mov rdi 60 mov rsi 0 syscall Universidade Federal da Paraíba Arquitetura de Computadores Centro de Informática UFPB Entrada de dados no NASM 64 bits extern scanf printf global main section bss float1 resd 1 long1 resq 1 section data message db O resultado eh 2f 0AH 0H request db Digite o numero 0H formatin db f 0H section text main push rbp Garantir alinhamento da pilha em palavras de 16 bytes devido a calling convention mov rdi request xor rax rax Não serão utilizados registradores xmm call printf mov rsi float1 mov rdi formatin xor rax rax call scanf fld DWORDfloat1 fstp QWORDlong1 movsd xmm0 long1 mov rax 1 mov edi message call printf pop rbp Desempilhar o ebp empilhado no inicio da rotina principal mov rdi 60 mov rsi 0 syscall Universidade Federal da Paraíba Arquitetura de Computadores Ciências da Comutação Centro de Informática UFPB Perguntas Entrada e Saída com Win32 e MASM32 Entrada de dados no NASM