Академический Документы
Профессиональный Документы
Культура Документы
__________________________________________________________________
segment code : Define o incio do segmento de cdigo. Aqui entram as instrues do programa.
..start:
Estas instrues so obrigatrias para iniciar o registro DS para apontar para o segmento de dados e o
registro SS e o SP para apontarem para a pilha.
mov
mov
mov
mov
mov
ax,data
ds,ax
ax,stack
ss,ax
sp,stacktop
segment data : Define o incio do segmento de dados. Aqui sero definidas as variveis do programa.
segment stack stack : Define o incio do segmento de pilha e associa um nome a este segmento.
resb 256
: Reserva um determinado nmero de bytes (256 no caso) para a pilha.
stacktop:
: Rtulo que ser usado para indicar onde comea a pilha. Pilha vazia quando SP aponta
para stacktop.
O arquivo contendo o programa deve ser editado por um editor (EDIT do FREEDOS) no modo no
documento e possuir a extenso .ASM.
Definies de variveis:
O formato geral de uma linha de definio de variveis o seguinte:
<nome da varivel> <definio do tipo> <valor inicial>
;<comentrio>
<nome da varivel>
Qualquer nome de identificador comeado por letra e com caracteres de separao.
<definio do tipo> Os tipos possveis so:
DB
DW
DD
DQ
DT
define byte
define Word
define double Word
define quad word
real preciso estendida
ocupa 1 byte
ocupa 2 bytes
ocupa 4 bytes (real ou inteiro)
ocupa 8 bytes (real ou inteiro)
ocupa 10 bytes
Alguns exemplos:
b1
tres_bytes
db
db
db
mensagem
db
word1
dw
word2
dw
word3
dw
word4
dw
dword1
dd
real1
dd
dreal1
dq
ereal1
dt
vetor1
dw
vetor_de_quadrados
dw
dw
0x55
0x55,0x56,0x57
'a',0x55
'hello',13,10,'$'
0x1234
'a'
'ab'
'abc'
0x12345678
1.234567e20
1.234567e20
1.234567e20
0,1,2,3,4,5
;
;
;
;
;
;
;
;
;
;
;
;
;
byte 0x55
trs bytes sucessivos
caracteres so constantes OK
strings constantes
0x34 0x12
0x41 0x00 ( um nmero)
0x41 0x42
0x41 0x42 0x43 0x00 (string)
0x78 0x56 0x34 0x12
constante floating-point
double-precision float
extended-precision float
5 elementos tipo word
0,1,4,9,16
25,36,49,64,81,100
RESB, RESW, RESD, RESQ e REST declaram espao de armazenamento no iniciado. Eles tm um
nico operando que define o nmero de bytes, palavras ou o tipo de dado que se quer armazenar.
Exemplo:
buffer:
wordvar:
realarray
resb
resw
resq
64
1
10
; reserva 64 bytes
; reserve uma word
; reserve um vetor de 10 reais
O prefixo TIMES faz com que a instruo seja montada mltiplas vezes.
Exemplo:
zerobuf:
times 64 db 0
Por default a base 10 (decimal). Podemos definir nmeros em outras bases (binria, octal e
hexadecimal) como abaixo:
mov
mov
mov
mov
mov
mov
ax,100
ax,0a2h
ax,$0a2
ax,0xa2
ax,777q
ax,10010011b
;
;
;
;
;
;
decimal
hexadecimal
hexadecimal. O zero necessrio
hexadecimal
octal
binrio
db
dw
ax,w1
ax,[w1]
word [w1],10
10
0x1020
; offset 0
; offset 1
; coloca 1 em ax
; coloca 0x1020 em AX
; coloca 0x0010 em w1
E mais:
EQU: Define uma constante associando um nome a ela, como nos exemplos:
Nove
Baud_rate
EQU
EQU
9
(9600/10) + 5
$ Define o valor do contador de localizao (offset) do segmento na posio em que o $ for encontrado.
Array_ex
Tamanho_array_ex
db
equ
Parte Prtica:
1- Montagem de um programa usando o NASM.
a) Usando o editor EDIT do FREDOS, edite as linhas abaixo, com cuidado, em um arquivo OI.ASM.
segment code
..start:
; iniciar os registros de segmento DS e SS e o ponteiro de pilha SP
mov
ax,data
mov
ds,ax
mov
ax,stack
mov
ss,ax
mov
sp,stacktop
mov
ah,9
mov
dx,mensagem
int
21h
; Terminar o programa e voltar para o sistema operacional
mov
ah,4ch
int
21h
segment data
CR
equ
0dh
LF
equ
0ah
mensagem
db
Oi, olha eu aqui,CR,LF,$
segment stack stack
resb 256
stacktop:
h) Escreva um programa para multiplicar um vetor do tipo palavra , por outro vetor do tipo palavra,
elemento por elemento, colocando o resultado em outro vetor do tipo palavra dupla. Edite o programa,
definindo os valores dos vetores no arquivo (comandos DW) e reservando um espao para o vetor
resultado. Coloque a terminao de programa do debug (INT 3) no lugar da terminao do DOS. Monte
e ligue gerando um .EXE. Teste o programa no debug.