| Arquivo: hello.asm |
| ; ========================= ; Programa Hello World ; ========================= ; Compilação ; ========================= ; nasm -f elf64 hello.asm ; ld -s -o hello hello.o ; ./hello ; ========================= ; Resultado ; ========================= ; Hello World ; ========================= section .data: msg db 'Hello World', 0xa len equ $ - msg section .text: global _start _start: mov edx, len mov ecx, msg mov ebx, 1 mov eax, 4 int 0x80 ; Saida mov eax, 1 mov ebx, 0 int 0x80 |
| Arquivo: entrada.asm |
| ; ========================= ; Programa para entrada de dados ; ========================= ; Compilação ; ========================= ; nasm -f elf64 entrada.asm ; ld -s -o entrada entrada.o ; ./entrada ; ========================= ; Resultado ; ========================= ; Entre com seu nome: ; Jorge ; ========================= SYS_EXIT equ 1 RET_EXIT equ 5 SYS_READ equ 3 SYS_WRITE equ 4 STD_IN equ 0 STD_OUT equ 1 MAX_IN equ 10 segment .data msg db "Entre com seu nome: ", 0xA, 0xD len equ $- msg segment .bss nome resb 2 segment .text global _start _start: ; ax, bx, cx, dx -> e, r mov eax, SYS_WRITE mov ebx, STD_OUT mov ecx, msg mov edx, len int 0x80 ; Entrada de Dados mov eax, SYS_READ mov ebx, STD_IN mov ecx, nome mov edx, MAX_IN int 0x80 exit: mov eax, SYS_EXIT mov ebx, RET_EXIT int 0x80 |
| Arquivo: maiornum.asm |
| ;============================== ; maior numero ;============================== ; nasm -f elf64 maiornum.asm ; ld -s -o maiornum maiornum.o ; ./maiornum ;============================== ; Resultado ;============================== ; X eh maior que Y ;============================== section .data x dd 50 ; dd - Define Double Word - 4 bytes ; db - Define Byte - 1 Byte ; dw - Define Word - 2 Bytes ; dq - Define Quad Word - 4 Bytes ; dt - Define Ten Word - 10 Bytes y dd 10 msg1 db 'X eh maior que Y', 0xa len1 equ $ - msg1 msg2 db 'X eh menor que Y', 0xa len2 equ $ - msg2 section .text global _start _start: mov eax, DWORD [x] mov ebx, DWORD [y] cmp eax, ebx ; Comparacao: <, >, <=, >= jge maior ; je =, jg >, jge >=, jl <, jle <=, jne != ; se for menor mov edx, len2 mov ecx, msg2 ; mov ebx, 1 ; Codigo repetido ; mov eax, 4 ; int 0x80 jmp final ; pula para o => final: maior: ; se for maior mov edx, len1 mov ecx, msg1 ; mov ebx, 1 ; Codigo repetido ; mov eax, 4 ; int 0x80 final: mov ebx, 1 mov eax, 4 int 0x80 mov eax, 1 int 0x80 |
| Arquivo: soma.asm |
| ; nasm -f elf64 soma.asm ; ld -s -o soma soma.o ; ./soma ; 6 section .data v1 dw '5', 0xa section .text global _start _start: call converter_valor ; nova funcao mov ecx, v1 call mostrar_valor ; nova funcao _final: mov eax, 1 mov ebx, 0 int 0x80 converter_valor: ; funcao mov eax, [v1] sub eax, '0' ; Converte para inteiro add eax, 1 ; ADD adiciona add eax, '0' ; Converte para caractere mov [v1], eax ret ; retornar valor mostrar_valor: ; funcao mov eax, 4 mov ebx, 1 mov edx, 1 int 0x80 ret ; retornar valor |
| Arquivo: soma2.asm |
| ; nasm -f elf64 soma2.asm ; ld -s -o soma2 soma2.o ; ./soma2 ; 106 section .data v1 dw '105', 0xa section .bss buffer: resb 10 section .text global _start _start: call converter_valor ; nova funcao call mostrar_valor ; nova funcao _final: mov eax, 1 mov ebx, 0 int 0x80 converter_valor: ; funcao ; mov eax, [v1] ; sub eax, '0' ; Converte para inteiro lea esi, [v1] mov ecx, 3 call string_to_int add eax, 1 ; ADD adiciona ; add eax, '0' ; Converte para caractere ; mov [v1], eax ret ; retornar valor mostrar_valor: ; funcao lea esi, [buffer] call int_to_string mov eax, 4 mov ebx, 1 mov ecx, buffer mov edx, 10 int 0x80 ret ; retornar valor ; Converte String para Inteiro ; Entrada: ESI ECX ; Saida EAX com o valor string_to_int: xor ebx, ebx .prox_digito: movzx eax, byte[esi] inc esi sub al, '0' imul ebx, 10 add ebx, eax ; ebx = ebx*10 + eax loop .prox_digito ; while (--ecx) mov eax, ebx ret ; Converter Inteiro para String ; Entrada EAX ESI ; Saída EAX int_to_string: add esi, 9 mov byte[esi], 0 mov ebx, 10 .prox_digito: xor edx, edx div ebx add dl, '0' dec esi mov [esi], dl test eax, eax jnz .prox_digito ; eax == 0 mov eax, esi ret |
| Arquivo: menu.asm |
| ; nasm -f elf64 menu.asm ; ld -s -o menu menu.o ; ./menu section .data tit db 10, '+-------------+', 10, '| Calculadora |', 10, '+-------------+', 0 ltit equ $ - tit obtVal1 db 10, 'Valor 1: ', 0 lobtVal1 equ $ - obtVal1 obtVal2 db 10, 'Valor 2: ', 0 lobtVal2 equ $ - obtVal2 opc1 db 10, '1 - Adicionar', 0 lopc1 equ $ - opc1 opc2 db 10, '2 - Subtrair', 0 lopc2 equ $ - opc2 opc3 db 10, '3 - Multiplicar', 0 lopc3 equ $ - opc3 opc4 db 10, '4 - Dividir', 0 lopc4 equ $ - opc4 msgOpc db 10, 'Deseja Realizar? ', 0 lmsgOpc equ $ - msgOpc msgErro db 10, 'Valor da Opcao Invalida!', 0 lmsgErro equ $ - msgErro saltLinha db 10, 0 lsaltLinha equ $ - saltLinha section .bss opc resb 2 num1 resb 10 num2 resb 10 result resb 10 section .text global _start _start: mov ecx, tit mov edx, ltit call mst_saida mov ecx, obtVal1 mov edx, lobtVal1 call mst_saida mov ecx, num1 mov edx, 10 mov eax, 3 mov ebx, 0 int 80h mov ecx, obtVal2 mov edx, lobtVal2 call mst_saida mov ecx, num2 mov edx, 10 mov eax, 3 mov ebx, 0 int 80h mov ecx, opc1 mov edx, lopc1 call mst_saida mov ecx, opc2 mov edx, lopc2 call mst_saida mov ecx, opc3 mov edx, lopc3 call mst_saida mov ecx, opc4 mov edx, lopc4 call mst_saida mov ecx, msgOpc mov edx, lmsgOpc call mst_saida mov ecx, opc mov edx, 2 mov eax, 3 mov ebx, 0 int 80h mov ah, [opc] sub ah, '0' cmp ah, 1 je adicionar cmp ah, 2 je subtrair cmp ah, 3 je multiplicar cmp ah, 4 je dividir mov ecx, msgErro mov edx, lmsgErro call mst_saida jmp exit adicionar: add eax, 1 ; ADD adiciona jmp exit subtrair: sub eax, 1 ; SUB subtrai jmp exit multiplicar: mov ax, 2 mov bx, 2 mul bx ; MUL multiplica jmp exit dividir: mov ax, 14 mov bx, 2 div bx ; DIV divide jmp exit exit: mov ecx, saltLinha mov edx, lsaltLinha call mst_saida mov eax, 1 mov ebx, 0 int 80h mst_saida: mov eax, 4 mov ebx, 1 int 80h ret |
| Arquivo: makefile |
| troca: troca.cpp troca.o g++ troca.o troca.cpp -o troca troca.o: troca.asm nasm -f elf64 troca.asm -o troca.o #Compilar com o comando: #make |
| Arquivo: troca.cpp |
| #include <cstdio> #include <iostream> using namespace std; extern "C" int GetValorASM(int a); int main(){ printf("ASM me deu %d\n", GetValorASM(32)); return 0; } /* ========== Compilação ========== nasm -f elf64 troca.asm -o troca.o g++ troca.o troca.cpp -o troca ./troca ========== Resultado ========== ASM me deu 33 */ |
| Arquivo: troca.asm |
| global GetValorASM segment .text GetValorASM: mov eax, edi add eax, 1 ret |
| Arquivo: makefile |
| questao: questao.cpp questao.o g++ questao.o questao.cpp -o questao questao.o: questao.asm nasm -f elf64 questao.asm -o questao.o #Compilar com o comando: #make |
| Arquivo: questao.cpp |
| #include <iostream> /* ================== Compilacao ================== make ================== Execucao ================== ./questao ================== Resultado ================== Numero Par */ using namespace std; extern "C" int Question(int a); int main() { if (Question(26) == 1) { printf("Numero Par\n"); } else { printf("Numero Impar\n"); } return 0; } |
| Arquivo: questao.asm |
| global Question segment .text Question: mov ebx, edi jmp _testar ret _testar: cmp ebx, 0 je _par jl _impar sub ebx, 2 jmp _testar _par: mov eax, 1 ret _impar: mov eax, 0 ret ; JUMP ; jmp incondicional ; condicional ; cmp a, b ; je a == b ; jne a != b ; jg a > b ; jge a >= b ; jl a < b ; jle a <= b |