Caractersticas
Permite montar programas assembler
NASM Netwide Assembler
NASM version 0.98.39 compiled on Jan 16 2005
No DOS No Windows (Win16 e Win32) No Linux
Formato das instrues diferente do MASM e do TASM
Prof. Srgio L. Cechin
MASM (Microsoft Assembler - Microsoft) TASM (Turbo Assembler - Borland)
Gratuito Requer apenas um programa executvel (o montador)
Pode usar bibliotecas externas, caso seja requisitado Pode gerar cdigo a ser ligado com mdulos compilados com compiladores de linguagem de alto nvel (C, Pascal, etc)
2
Montagem
Linha de comando
nasm -f <format> <filename> [-o <output>] Exemplos
nasm -f obj [Link] nasm -f bin [Link] -o [Link]
Monta o arquivo [Link]
Nasm Formatos de sada
bin aout aoutb coff elf as86 obj win32 rdf ieee flat-form binary files (e.g. DOS .COM, .SYS) Linux [Link] object files NetBSD/FreeBSD [Link] object files COFF (i386) object files (ex: DJGPP for DOS) ELF32 (i386) object files (e.g. Linux) Linux as86 (bin86 version 0.3) object files MS-DOS 16-bit/32-bit OMF object files Microsoft Win32 (i386) object files Relocatable Dynamic Object File Format v2.0 IEEE-695 (LADsoft variant) object file format
4
Gerando a listagem do programa
nasm -f coff [Link] -l [Link] [Link]
Monta o arquivo [Link] e gera um executvel do tipo .com
Help
Monta o arquivo [Link] e tambm gera um arquivo lst (listagem)
nasm h (help geral) nasm hf (lista formatos de sada)
3
Nasm Referncia memria
A referncia memria requer colchetes explcitos
No usa o mecanismo do MASM de alterar a codificao, dependendo da forma como as variveis foram declaradas
OFFSET ?
NASM no necessita do comando OFFSET, usado no MASM
Se var uma varivel... No MASM, usa-se mov ax,OFFSET var No NASM, usa-se mov ax,var
Exemplo
mov ax,var
Sempre gera modo imediato var declarado como constante: coloca a constante var declarado com varivel: coloca o endereo da varivel
mov ax,[var]
Acessa o contedo da varivel
5 6
Formato Indireto/Indexado
No MASM
mov ax, table[bx]
AX recebe MEM16(table+BX)
Definio de tipos
O NASM
No suporta tipos de variveis No suporta instrues que dependam do tipo do operando
Ex: LODS, MOVS, STOS, SCAS, CMPS, INS, ou OUTS
mov ax, es:[di]
AX recebe MEM16(ES:DI)
Em geral, uma instruo s estar completamente definida quando se sabe o tamanho (tipo) dos operandos
No MASM, escreve-se apenas a parte do mnemnico que identifica a instruo
O montador identifica o tamanho do operando Eventualmente, necessrio indicar, explicitamente, o tamanho
No NASM (formato mais prximo a operao)
mov ax, [table+bx] mov ax, [es:di]
No NASM, necessrio (sempre) acrescentar os sufixos de determinao de tamanho: B, W ou D
Ex: LODSB, SCASW ou INSD
7 8
ASSUME ?
O NASM no usa o ASSUME O correto uso dos segmentos de responsabilidade do programador
Acesso NEAR/FAR
O programador deve indicar, explicitamente, se o acesso NEAR ou FAR
Na chamada de subrotinas No acesso s variveis No retorno das subrotinas
RETN (return NEAR)
Pode ser usado, simplesmente, RET
RETF (return FAR)
9 10
Espao para variveis
Variveis inicializadas
Igual ao MASM: DB, DW, etc
Linha de fonte
rtulo: instruo operandos ;comentrios Caracteres em rtulos
letras, numeros, _, $, #, @, ~, ., e ?
rea sem inicializao
RESB Equivalente ao DUP(?) usado no MASM Ex:
VAR: RESB 64
11
Instruo
Instrues do Pentium e P6, FPU, MMX e algumas no documentadas Podem ser prefixadas com
REP, REPE/REPZ ou REPNE/REPNZ Registrador de segmento
Ex: es mov [bx],ax equivalente a mov [es:bx],ax O segundo formato o preferido
12
Variveis inicializadas
db 0x55 db 0x55,0x56,0x57 db 'a',0x55 db 'hello',13,10,'$' dw 0x1234 dw 'a' dw 'ab' dw 'abc' dd 0x12345678 dd 1.234567e20 dq 1.234567e20 dt 1.234567e20 ; apenas um byte 0x55 ; trs bytes em seqncia ; uso de constantes do tipo caractere ; uso de constantes do tipo string ; 0x34 0x12 ; 0x61 0x00 (preenchimento com 0x00) ; 0x61 0x62 (constante do tipo caractere) ; 0x61 0x62 0x63 0x00 (string) ; 0x78 0x56 0x34 0x12 ; constante do tipo ponto flutuante ; double-precision ; extended-precision
13
Variveis no inicializadas
buffer: resb 64 wordvar: resw 1 realarray resq 10 reais ; reserva 64 bytes ; reserva uma word ; array com 10 nmeros
14
Constantes
Exemplo
Message Msglen DB 'hello, world' EQU $-Message
Exemplos de acesso memria
Suponha uma varivel definida da seguinte forma: pode-se fazer acesso varivel de vrias formas
mov ax,[wordvar] mov ax,[wordvar+1] mov ax,[es:wordvar+bx] wordvar dw 123
Codificaes mais complexas tambm so suportadas O Nasm tenta resolver os problemas do programador
mov eax,[ebx*5] mov eax,[label1*2-label2]
15
mov eax,[ebx*2+ecx+offset] mov ax,[bp+di+8]
Montado como [ebx*4+ebx] Montado como [label1+(label1-label2)]
16
Tipos de constantes suportadas
Numricas
100 (decimal) 0A2H, $0A2, 0xA2 (hexa) 777Q ou 777O (octal) 1001010B (binria)
Expresses Operadores lgicos e aritmticos
17
Caracteres
a, b, c, d
Strings
teste
Ponto flutuante
dd dq 1.2 1.e10
OR, XOR, AND, <<, >> ~ (complemento de 1) +, -, * / (sem sinal) // (com sinal) % (resto da diviso, sem sinal) %% (resto da diviso, com sinal)
18
Operador SEG
Retorna o segmento de um smbolo Exemplo
mov ax,seg symbol mov es,ax mov bx,symbol
Escrevendo um programa Formato OMF Object Module Format
Declarao de segmentos
Usar a diretiva SEGMENT
segment codigo
No necessrio indicar o final do segmento
Ponto de entrada do programa
Entrada por um smbolo especial
..start
no final, ES:BX contm o endereo de symbol
19
20
Exemplo
segment Pilha resb 100 TopPilha: stack segment Dados dw 0 db 'Mensagem de teste', 0x0D, 0x0A, '$' Codigo ax,Dados ds,ax ax,Pilha ss,ax sp,TopPilha ; Seta o registro DS ; Seta os registros SS e SP
Exemplo (cont.)
call mov int Funcao: mov mov int ret dx,Msg ah,9 0x21 Funcao ax,0x4C00 0x21
Var: Msg:
segment ..start: mov mov mov mov mov
21
22
Exerccios
Implementar, usando o NASM, as funes abaixo
void strcpy (char *dst, char *src) int strcmp (char *str1, char *str2) Retorna 0, se str1==str2 Retorna +1, se str1>str2 Retorna 1, se str1<str2 int strlen(char *str)
Retorna no registrador AX o valor de retorno das funes
23