Certa vez um amigo meu me disse “eu sei assembly, eu vi na faculdade, é só colocar as coisas nao lugar certo, tudo é INT21, é só dar os parametros e blablabla“
Este meu amigo é muito em “C“, e aprendeu Assembly na faculdade, e não questione-o, mas como meu amigo está errado ….se você procurar na internet, vai achar centenas de programas baseados em “InNterrupção de DOS”, e o motivo pelo qual estou alertando você ! é para não passar vergonha em uma etnrevista de Lingaugem Assembly, colocando as velharias que se ensina na faculdade, não só na LIngaugem Assembly MAS TAMBÉM na lingaugem “C”, ou seja, os professores tem verdadeira adoração pelo AMBIENTE D.O.S. (modo real), este modo de programação desparece em 1994 ! mas por ser simples usam até hoje com a desculpa que é “principios”, não é ! principio seria programação BIOS, sem recurso nenhum.
Programação D.O.S. (Modo Real)
O chamado Modo Real (ok a 1m), que é o antigo ambiente D.O.S., é o tipo de assembly mais divulgado ! É INUTIL ! sim, sinto muito por isto, é totalmente inútil amigo, o DOS acabou em 1994, e esta é o exemplo mais simples que ensinam:
MOV AH, 9
MOV DX, offset frase
INT 21h
INT 20
frase db “Ola mundo DOS, ainda estou vivo no modo Real ! $”
O código acima é o Hello World mais divulgado e você acha aos montes na internet, não serve para nada hoje em dia, hoje temos o que ? WINDOWS, LINUX, MacOS , são os sistemas mais usados, este código acima não serve para nenhum deles, entendido ?
Vamos explicar o código acima, primeiramente carregamos o registrador AH com 9 (AH é parte do AX lembra ? AH pode ser dividido em AH e AL, high e low ), depois passamos o endereço de “frase” para o registrador DX, é endereço onde está a frase a ser impressa, veja no fim do código “frase db ola mundo” , perceba que o db indica que será inserido byte (db = data byte).
Então o INT 21 e´uma interrupção de DOS, do sistema operacional MS-DOS/PC-DOS que tem a função de pegar o endereço em DX e exibir, case AH seja 9, e tudo isto foi configurado correto ? é simples ! e funciona (em D.O.S.)
MAS LEMBRE-SE ! isto é modo real, isto não funciona no Windows, INT 21 é um recurso do sistema DOS e não windows, você pode até ver isto funcionando no prompt de comando, porque o Windows emula o D.O.S. quando entramos em prompt de comando (cmd).
Vamos testar o código, primeiro baixe o programa EMU8086,
Após baixar, execute-o, veremos a tela abaixo:

Click em NEW, para criarmos um programa do zero, após clicar em NEW, veemos a tela abaixo:

Ele pergunta qual o formato do programa após compilado, .COM, .EXE, BIN ou BOOT, os 3 formatos ja foam discutidos em outro tópico, ma podemos relembrar:
Extensão .COM , programa que tem somente 1 segmento de memória, ele não passa de 64k, o código, dados e stack ficam todos no mesmo segmento.
Extensão .EXE , tem mais de um segmento de memória, pode chegar a 640k, código dados e stack ocupam segmento diferentes.
Extensão .BIN , não é executável , normalmente usado como biblioteca.
Tipo BOOT, programa de Boot, master boot Record ou Boot de sistema, tem no máximo 512 bytes normalmente, é uma parte do Kernel File System.
Estes são os tipos sugeridos, ficaremos com o primeiro tipo (.COM) já que nosso programa será extremamente pequeno, repare que esta extensão de programa (.COM) morreu com o anigo sistema D.O.S., existe uma tecnologia windows chamada COM, mas NÂO TEM NADA A VER com a antiga extensão .COM.

Digite então o programa no EMU8086 conforme a imagem acima, perceba que ele tem todos os comando comentados no exemplo mais o INT 20h, a função do INT 20h é terminar o programa, dizer a cpu “ESTE É O FIM “, caso você não faça isto, a CPU contiua executando sugeira na memória e pode traver o sistema.

Tudo digitado basta clicar em EMULATE, depois RUN, e veremos o resutlado: “Ola Mundo”, bem .. no tempo do DOS era tudo qe tinhamos, uma tela preta nada mais.
Um programa Windows
Vamos agora ao programa Windows, perceba que, para programar em Windows, ele exige que usemos seus recurso (APIs), sua APIs famosas, que nos forncem o que queremos, não podemos fazer acesso direto a memória, acesso direto ao teclado, ao vídeo, nada disto ! tudo que queremos , precisamos pedir que ele faça por nós, então em assembly incluimos suas bibliotecas no código:
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
Estas são as basicas, definições: WINDOWS.INC, USER32.INC, KERNEL32.INC e as bibliotecas: user32.lib e kernel32.lib, quando colocamos isto no cabeçalho do programa Assembly, avisamos que iremos usar estes recursos, caso não coloquemos, o windows não vai rodar nosso programa para windows, para este exemplo, vams usar o compilador MASM32, veja no tutorial sobre este compilador se preicsar saber mais sobre ele, se ainda não fez download, faça download do compilador MASM32, vamos a um exemplo do programa assembly para windows.
Código para Windows Completo
386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.code
start:
push MB_OK
push offset titulo
push 0
call MessageBox
push 0
call ExitProcess
titulo db “Titulo do programa”,0
frase db “Ola mundo windows”,0
end start
Este é um programa para Windows, perceba como ele sofre contaminações, primeiro é o cacebalho com definicções (.inc) e bibliotecas que são as apis do windows (.LIB). logo mais vemos empurrar valores ao stack.
push MB_OK
push offset titulo
push offset frase
push 0
call MessageBox
O push MB_OK informa que será um botão OK que queremos, push offiset titulo empurra para o stack o endereço da frase que será o título da janela, então ele empurra para o stack o endereço da frase com push offset frase, que será colocada na janela, e finalmente push 0 terminando o bloco, agora , basta chamar a API do windows chamada “MessageBox” para para fazer o serviço.
Copie o código para windows completo em um arquivo, você pode copiar no editor QE.EXE que vem no MASM32 ou até no notepad, grave com o nome programa.asm
Para compilar (considerando que o MAS32 esta em c:\masm32)
\masm32\bin\ml /c /coff /nologo programa.asm
\masm32\bin\Link /SUBSYSTEM:WINDOWS /MERGE:.rdata=.text programa.obj
As 2 linhas acima compilam o programa, a primeira gera .OBJ , a segunda gera o .EXE, então absta rodar digitando programa.exe ou clicando em programa.exe

Você pode baixar o programa aqui:
Download programa.asm e compile.bat Exemplo para Windows
Download EMU8086 Emulador 8086