;Disciplina: Arquitetura de Computadores - PUCGO 2024 ;Aluno(s): Denilson Oliveira da Silva ;Curso: Ciência da Computação ;Trabalho: Fazer uma calculadora que soma, subtrai, multiplica e divide. O usuário vai informar dois números e a operação que deseja realizar (usando os caracteres +,-,*,/). Ao término da operação, deverá ser opcional ao usuário realizar uma nova operação ou sair do programa. global main section .data ;Declaração de Constantes fmt db "%lf", 0 fmtChar db "%*c%c", 0 msg1 db "Insira o Primeiro Número: ", 0 msg2 db "Insira o Segundo Número: ", 0 msg3 db "Insira o Operador: ", 0 msgEnd db "Código Encerrado! Operador Vazio.", 10, 0 msgResult db "Resultado: %.4lf", 10, 10, 0 msgOperador db "Insira um Operador Válido!", 10, 10, 0 msgMenu db "*** Calculadora Básica - Linguagem de Montagem (NASM) ***", 10, 0 msgMenu2 db " -> Operações:", 10, " * :Multiplicação", 10, " + :Soma", 10, " - :Subtração", 10, " / :Divisão", 10, 10, 0 section .bss ; Declaração de Variáveis num resq 1 num2 resq 1 op resb 4 section .text ; Secção de Texto main: ; Função Principal menu_msg: mov rdi, msgMenu call print_string menu_op: mov rdi, msgMenu2 call print_string ler_op1: mov rdi, msg1 call print_string call read_double movsd xmmword [num], xmm0 ler_operador: mov rdi, msg3 call print_string call read_char mov byte [op], al mov ebx, 10 ; Verifica se o operador é Enter cmp byte [op], bl je fim ler_op2: mov rdi, msg2 call print_string call read_double movsd xmmword [num2], xmm0 def_operador: ;Função para definir o operador movq xmm0, qword [num] mov bl, '+' cmp byte [op], bl je adicao mov bl, '-' cmp byte [op], bl je subtracao mov bl, '*' cmp byte [op], bl je multiplicacao mov bl, '/' cmp byte [op], bl je divisao jmp novo_operador ;Caso o operador digitado nao exista subtracao: ;Funcao de Subtracao subsd xmm0, [num2] jmp exibir adicao: ;Funcao de Adicao addsd xmm0, [num2] jmp exibir multiplicacao: ;Funcao de Multiplicacao mulsd xmm0, [num2] jmp exibir divisao: ;Funcao de Divisao divsd xmm0, [num2] jmp exibir novo_operador: ;Mensagem para inserir um novo operador e jump para operador mov rdi, msgOperador call print_string jmp ler_operador ; Volta para o operador exibir: ;Funcao para exibir resultado movq [num], xmm0 mov rdi, msgResult call print_string jmp ler_operador fim: ;Funcao para encerrar o código mov rdi, msgEnd call print_string ret print_string: ; Função para imprimir strings mov rax, 0x1 mov rsi, rdi mov rdx, 0 ; Calcula o tamanho da string xor rcx, rcx while_char: cmp byte [rsi + rcx], 0 je end_while inc rcx jmp while_char end_while: ; Atualiza o tamanho mov rdx, rcx ; Chama a syscall write mov rax, 0x1 mov rdi, 0x1 syscall ret read_double: ; Função para ler um double mov rax, 0x0 mov rdi, 0x0 mov rsi, rsp mov rdx, 0x20 syscall movq xmm0, [rsp] add rsp, 0x20 ret read_char: ; Função para ler um caractere mov rax, 0x0 mov rdi, 0x0 mov rsi, rsp mov rdx, 0x1 syscall mov al, byte [rsp] add rsp, 0x1 ret
Write, Run & Share Assembly code online using OneCompiler's Assembly online compiler for free. It's one of the robust, feature-rich online compilers for Assembly language. Getting started with the OneCompiler's Assembly compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as Assembly
and start coding.
Assembly language(asm) is a low-level programming language, where the language instructions will be more similar to machine code instructions.
Every assembler may have it's own assembly language designed for a specific computers or an operating system.
Assembly language requires less execution time and memory. It is more helful for direct hardware manipulation, real-time critical applications. It is used in device drivers, low-level embedded systems etc.
Assembly language usually consists of three sections,
Data section
To initialize variables and constants, buffer size these values doesn't change at runtime.
bss section
To declare variables
text section
_start
specifies the starting of this section where the actually code is written.
There are various define directives to allocate space for variables for both initialized and uninitialized data.
variable-name define-directive initial-value
Define Directive | Description | Allocated Space |
---|---|---|
DB | Define Byte | 1 byte |
DW | Define Word | 2 bytes |
DD | Define Doubleword | 4 bytes |
DQ | Define Quadword | 8 bytes |
DT | Define Ten Bytes | 10 bytes |
Define Directive | Description |
---|---|
RESB | Reserve a Byte |
RESW | Reserve a Word |
RESD | Reserve a Doubleword |
RESQ | Reserve a Quadword |
REST | Reserve a Ten Bytes |
Constants can be defined using
CONSTANT_NAME EQU regular-exp or value
%assign constant_name value
%define constant_name value
Loops are used to iterate a set of statements for a specific number of times.
mov ECX,n
L1:
;<loop body>
loop L1
where n specifies the no of times loops should iterate.
Procedure is a sub-routine which contains set of statements. Usually procedures are written when multiple calls are required to same set of statements which increases re-usuability and modularity.
procedure_name:
;procedure body
ret