causo do Gubi de programa em COBOL que usava JG ao inves de JA
funcionava com 256KB, nao funcionava com 640KB
mensagem: nao há memória disponível
LOOP (usa o CX como contador)
LOOP destino
equivalente a
DEC ECX
JNZ destino
Truque de linguagem de montagem:
uso de SHL (=SAL) e SHR (= SAR) para multiplicar e dividir por
potências de 2
mesmo truque pode ser usado em C/C++ com operadores >> e
<<.
Interface entre programas em Montagem e em C
A seção 5.1 do Linux Assembly HOWTO explica como fazer chamar C
de montagem e vice-versa:
32-bit arguments are pushed down stack in reverse syntactic order
(hence accessed/popped in the right order), above the 32-bit near return
address. %ebp, %esi, %edi, %ebx are callee-saved, other registers are
caller-saved; %eax is to hold the result, or %edx:%eax for 64-bit
results.
Ligação de programas em linguagem de montagem e C:
Inserindo a opção -g na linha de comando do gcc, do nasm ou do as, instruimos o programa a incluir informações de depuração no executável final.
Escrever um programa em C bem simples, compilar com gcc -S
prog.c e ver saida prog.s
Depois gerar o executável com gcc -g prog.s -o prog
Rastrear a execuçao do programa com o Data Display Debugger do
Linux:
ddd prog
Ative a opção Status->Registers... para visualizar os registradores
Problema no gdb (e ddd): nao consegui colocar breakpoint na primeira
instrucao, so' a partir da segunda :-(
Vamos ver como fica um programa que calcula médias de inteiros passados como parâmetro
Para casa: se quiser, experimentar depurar o mesmo programa usando o gdb.
No gdb, use o comando l para listar o codigo, o comando break
N para colocar um breakpoint na linha N, o comando run para
executar o programa e o comando s para executar passo a passo, o
comandoinfo registers para ver os registradores, etc.
Segmentação de memória
No 80x86, com registradores de 16 bits, os ponteiros podem apontar para apenas 64KB de memória.
Para
permitir um endereçamento de mais memória, a Intel resolveu esse
problema usando segmentos de memória e registradores de segmentos.
CS aponta para o segmento de código
DS para o segmento de dados
SS para o segmento da pilha
ES
é um registrador de segmento extra para manipular registradores de
segmento ou apontar para outro lugar de interesse do programador
A memória tinha tamanho máximo de 2^20, ou seja 16MB.
Cada segmento é espaçado de 16bytes.
O endereço físico real portanto é calculado através da seguinte forma:
16 * seletor + deslocamento
Pode-se usar o formato completo seletor:deslocamento em vários comandos, por exemplo:
MOV AX, [ES:DI]
se o seletor não é especificado, um padrão é assumido (p.ex. DS para dados, CS para código e SS para pilha)
A partir do 80386, os registradores passaram a ter 32 bits
isso permite o endereçamento de até 4 gigabytes, que passou a ser o tamanho de cada segmento.
com segmentos tão grandes, a necessidade de usar os registradores de segmentos explicitamente passou a ser menor.