Perguntas e respostas com Assembly e NASM

Publicado por Perfil removido (última atualização em 14/04/2014)

[ Hits: 5.911 ]

Download pergunta.asm




Simples aplicação de perguntas e respostas feito em Assembly usando assemblador NASM.

Este script foi testado em uma máquina com processador Intel Pentium 4, arquitetura x64.

Para executar o exemplo, deve-se ter o NASM instalado em sua máquina. Daí, execute os seguintes comandos para compilar o arquivo, e transformá-lo em um programa executável:

Para compilar:
$ nasm -f elf64 pergunta.asm

Para gerar o executável:
$ ld pergunta.o -o pergunta

Para executar:
$ ./pergunta

  



Esconder código-fonte

; Variáveis setadas
section .data
    p DB "PRIMEIRA PERGUNTA", 0xa
    ln_p  equ $ - p
    p_d DB "SEGUNDA PERGUNTA", 0xa
    ln_p_d  equ $ - p_d
    r1 DB "OI"
    R2 DB "DOIS"
    ac DB "voce acertou"
    l_ac equ $ - ac
    ec DB "voce errou"
    l_ec equ $ - ec
    l_r1 equ $ - r1
    fim DB "ACABOU"
    l_f equ $ - fim

; Variáveis declaradas
section .bss
resp1 RESB 2
resp2 RESB 2


; Corpo do documento
section .text

global _start

_start:
    mov eax, 4 ; Indica pro KERNEL que é operação de saída
    mov ebx, 1 ; 0 = NADA; 1 = STDOUT(Saída); 2 = STDIN (Entrada)
    mov ecx, p ; Conteúdo
    mov edx, ln_p ; quantidade de caracteres que serão exibidos
    int 0x80 ; Sinal para o KERNEL

    mov eax, 3 ; Indica pro KERNEL que é para receber um campo
    mov ebx, 2 ; STDIN (Entrada)
    mov ecx, resp1 ; Campo digitado pelo usuário vai para a variável resp1
    mov edx, 2 ; Espaço para digitação de dois caracteres
    int 0x80

    mov esi, resp1 ; Joga em esi o valor de resp1
    mov edi, r1 ; Joga em edi o valor da resposta (r1)
    mov ecx, 2
    cld ; Incrementa registradores de strings (Pula de um caracter para outro)
    repe  cmpsb ; REPE repete o comando cmpsb até ecx igualar á 0. O comando CMPSB compara valores de string que estao em ESI e EDI.
    jecxz acertou    ; Pula  para o trecho acertou quando
    jmp _start ; Quando o usuário erra, volta para este fluxo
    ;jmp errou
    jmp sair

; Exibo na tela mensagem de que acertou
acertou:
    mov eax, 4
    mov ebx, 1
    mov ecx, ac
    mov edx, l_ac
    int 0x80

; Fluxo da segunda pergunta, semelhante á primeira
segunda:
    mov eax, 4
    mov ebx, 1
    mov ecx, p_d
    mov edx, ln_p_d
    int 0x80

    mov eax, 3
    mov ebx, 2
    mov ecx, resp2
    mov edx, 4
    int 0x80

    mov esi, resp2
    mov edi, R2
    mov ecx, 2
    cld
    repe  cmpsb
    jecxz finish
    jmp segunda

errou:
    mov eax, 4
    mov ebx, 1
    mov ecx, ec
    mov edx, l_ec
    int 0x80
    jmp sair


finish:

    mov eax, 4
    mov ebx, 1
    mov ecx, fim
    mov edx, l_f
    int 0x80
    jmp sair

; eax recebe valor de 1, indicando ao KERNEL que é o fim do programa
sair:
    mov eax, 1
    mov ebx, 0
    int 0x80

Scripts recomendados

Programação para sistemas embarcados em Assembly

Bubble Sort em Scilab

Método da Bissecção em SCILAB

Conectar o gns3 na Internet

Welcome!


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts