Para explorar o universo da programação em Assembly de 16 bits, especialmente no contexto do sistema operacional DOS, é fundamental preparar um ambiente adequado. Como as CPUs 8086, essenciais para essa era, não são nativamente compatíveis com sistemas operacionais modernos como o Windows 10, utilizaremos um emulador e um conjunto de ferramentas de desenvolvimento clássicas.
- Preparando o Emulador DOSBox
O DOSBox é um emulador de código aberto que recria um ambiente de DOS completo, permitindo a execução de programas e jogos antigos. Comece por baixar e instalar o DOSBox (por exemplo, a versão DOSBox0.74-3-win32-installer.exe para Windows) e o Microsoft Macro Assembler (MASM).
1.1. Instalação e Configuração do DOSBox
Após a instalação padrão do DOSBox, ao iniciar o programa a partir do ícone da área de trabalho, duas janelas podem ser abertas. Uma delas, a "DOSBox Status Window", exibe informações de status e o caminho para o arquivo de configuração principal, geralmente localizado em C:\Users\SEU_USUARIO\AppData\Local\DOSBox\dosbox-0.74-3.conf.
Para desabilitar a janela de status e ter uma experiência mais limpa, você pode modificar as propriedades do atalho do DOSBox. Clique com o botão direito no ícone do DOSBox, selecione "Propriedades" e adicione -noconsole ao final do campo "Destino", conforme o exemplo:
"C:\Program Files (x86)\DOSBox-0.74-3\DOSBox.exe" -userconf -noconsole
Para ajustar a resolução da janela do emulador, edite o arquivo dosbox-0.74-3.conf. Localize as linhas relacionadas à resolução e defina os valores desejados. Por exemplo, para uma resolução de 1280x1080 com saída OpenGL:
windowresolution=1280X1080
output=opengl
1.2. Comandos Básicos do DOS
Familiarize-se com alguns comandos essenciais do DOS, que serão úteis durante o desenvolvimento:
| Comando | Descrição |
|---|---|
DIR |
Lista o conteúdo (arquivos e diretórios) do diretório atual. |
CD |
Altera o diretório. Ex: CD MEU_PROJETO entra no diretório; CD \ retorna à raiz; CD .. sobe um nível. |
MD |
Cria um novo diretório. Ex: MD CODIGOS cria um diretório chamado "CODIGOS". |
RD |
Remove um diretório vazio. Ex: RD TEMP remove o diretório "TEMP". |
CLS |
Limpa a tela do console, deixando apenas o prompt de comando. |
EXIT |
Sai do ambiente DOSBox. |
- Instalação do Microsoft Macro Assembler (MASM)
O MASM é um conjunto de ferramentas que traduz o código-fonte Assembly em código de máquina executável. Após baixar o pacote MASM, execute o instalador (por exemplo, MasmSetup.exe) e instale-o em um local acessível, como D:\DOS\MASM. É recomendável copiar os executáveis principais, como MASM.EXE e LINK.EXE (geralmente encontrados na pasta BIN5 da instalação do MASM), para o diretório de trabalho onde você armazenará seus projetos, por exemplo, D:\DOS\TESTE. Essas ferramentas são cruciais para compilar e linkar programas de 16 bits.
- O Ciclo de Vida de um Programa Assembly
Vamos demonstrar o processo de compilação, ligação e execução de um simples programa Assembly.
3.1. Configuração do Disco Virtual no DOSBox
Primeiramente, precisamos montar um diretório do seu sistema operacional como um disco virtual dentro do DOSBox. Isso permite que o DOSBox acesse seus arquivos. Se seus arquivos de projeto e ferramentas MASM estiverem em D:\DOS\TESTE, execute o seguinte comando no DOSBox:
mount c D:\DOS\TESTE
C:
O primeiro comando monta o diretório D:\DOS\TESTE como a unidade C: virtual no DOSBox, e o segundo comando muda para essa unidade.
3.2. Criando o Código-Fonte Assembly
Crie um arquivo chamado SAUDACAO.ASM (ou qualquer nome com extensão .ASM) no seu diretório D:\DOS\TESTE com o seguinte conteúdo. Este programa simples exibe a mensagem "Olá, Programador!" na tela:
; Define o modelo de memória como 'small' para programas DOS
.model small
; Aloca 100h bytes para a pilha do programa
.stack 100h
; Seção de dados: declara as variáveis
.data
; Mensagem a ser exibida, terminada com '$' (convenção DOS)
mensagem_saudacao DB 'Ola, Programador!', '$'
; Seção de código: contém as instruções do programa
.code
; Ponto de entrada principal do programa
principal PROC
; Inicializa o registrador DS com o endereço do segmento de dados
MOV AX, @data
MOV DS, AX
; Função DOS 09h: Imprime uma string
; AH = 09h indica o serviço para exibir string
MOV AH, 09h
; DX aponta para o endereço da string (offset da mensagem_saudacao)
MOV DX, OFFSET mensagem_saudacao
; Interrupção 21h invoca o serviço DOS
INT 21h
; Função DOS 4Ch: Termina o programa
; AH = 4Ch indica o serviço para terminar
INT 21h
principal ENDP
; Indica o final do programa e o ponto de entrada principal
END principal
3.3. Compilação do Código-Fonte
No prompt do DOSBox (já na unidade C:), compile o arquivo SAUDACAO.ASM usando o MASM:
masm SAUDACAO.ASM
Se a compilação for bem-sucedida, o MASM gerará um arquivo objeto (SAUDACAO.OBJ) e exibirá a mensagem "0 Severe Errors".
3.4. Ligação (Linkagem) do Programa
Em seguida, use o linker (LINK.EXE) para transformar o arquivo objeto em um executável:
link SAUDACAO.OBJ
Este comando criará o arquivo executável SAUDACAO.EXE.
3.5. Execução do Programa
Para executar o programa, simplesmente digite seu nome:
SAUDACAO.EXE
A mensagem "Olá, Programador!" deverá ser exibida na tela do DOSBox.
3.6. Automatizando a Configuração
Para evitar digitar os comandos mount toda vez que iniciar o DOSBox, adicione-os ao arquivo de configuração dosbox-0.74-3.conf. Role até o final do arquivo e insira as linhas sob a seção [autoexec]:
[autoexec]
mount c D:\DOS\TESTE
C:
- Depuração de Programas com DEBUG.EXE
A depuração é uma parte vital do desenvolvimento de software, especialmente em Assembly. O DEBUG.EXE é uma ferramenta de depuração nativa do DOS que permite inspecionar e manipular o estado da CPU e da memória em tempo real. Copie o arquivo DEBUG.EXE (geralmente encontrado na pasta BIN6 da instalação do MASM) para o seu diretório de trabalho (D:\DOS\TESTE).
4.1. Comandos Essenciais do DEBUG
Inicie o depurador com seu programa executável:
debug SAUDACAO.EXE
No prompt do DEBUG (-), você pode usar os seguintes comandos:
| Comando | Descrição |
|---|---|
R |
Exibe ou modifica o conteúdo dos registradores da CPU (AX, BX, CX, DX, CS, IP, etc.). Ex: R AX para ver/modificar AX. |
D |
Exibe o conteúdo da memória em um determinado endereço. Ex: D 1000:0000 para ver a memória a partir do endereço físico 1000:0000. |
E |
Edita o conteúdo da memória em um endereço específico. Ex: E 1000:0000 01 02 03 para escrever bytes na memória. |
U |
Desmonta (disassemble) o código de máquina na memória em instruções Assembly. Útil para "ver o código-fonte" executado. |
T |
Executa uma única instrução de máquina (single-step), atualizando o estado da CPU. |
A |
Permite inserir instruções Assembly diretamente na memória em um determinado endereço. |
Q |
Sai do DEBUG. |
4.2. Exemplos de Uso do DEBUG
4.2.1. Inspecionando Registradores com 'R'
Ao iniciar o DEBUG, ele exibirá o estado inicial dos registradores. Você pode usar R para ver todos os registradores ou R AX para inspecionar especificamente o registrador AX. Você pode então alterar seu valor se desejar (por exemplo, :0010).
4.2.2. Visualizando Memória com 'D'
Para observar o conteúdo da memória, incluindo a mensagem do seu programa, use o comando D. Por exemplo, D CS:100 para inspecionar a memória a partir do segmento de código e um offset de 100h. Você verá o conteúdo em hexadecimal e sua representação ASCII correspondente.
4.2.3. Modificando Memória com 'E'
Você pode alterar bytes na memória usando E. Se a sua string "Olá, Programador!" estivesse em um endereço como 076A:0010 e o primeiro byte fosse 4Fh ('O'), você poderia alterá-lo para 50h ('P') usando E 076A:0010 50. Ao re-visualizar com D, você notaria a mudança (por exemplo, "Olá" para "Plá"). Lembre-se que essas modificações são temporárias e se perdem ao reiniciar o DOSBox.
4.2.4. Desmontando Código com 'U'
Para ver as instruções Assembly correspondentes ao código de máquina em memória, utilize U. Ao digitar U repetidamente, o DEBUG desmontará as instruções subsequentes, revelando o fluxo do seu programa em Assembly.
4.2.5. Execução em Passo Único com 'T'
O comando T ("trace") é fundamental para depurar. Ele executa uma única instrução do programa e, em seguida, exibe o novo estado dos registradores, permitindo que você siga a execução do seu código linha por linha e observe como os valores e o fluxo mudam.