Assembly na Pratica - aula 00 - Sobre o Curso
Assembly na Pratica - aula 01 - Hello World
Assembly na Pratica - aula 02 - Entrada de Dados
Assembly na Pratica - aula 03 - Entendimento
Assembly na Pratica - aula 04 - Comparacao
Assembly na Pratica - aula 05 - Introducao a Funcoes
Assembly na Pratica - aula 06 - Funcoes de Conversao
Assembly na Pratica - aula 07 - Menu do Sistema
Assembly na Pratica - aula 08 - Uniao com o C++
Assembly na Pratica - aula 09 - Saltos Condicionais

Código Fonte

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