Академический Документы
Профессиональный Документы
Культура Документы
Conte
udo
1 Introdu
c
ao
1.1 exemplo de chamada . . . . . . . . . . . . . . . . . . . . . . . . .
3
4
3 Tradu
c
ao do Capitulo 3 (The NASM Language)
3.1 Layout da linha de c
odigo do NASM . . . . . . . . . .
3.2 PSEUDO-INSTRUC
OES
. . . . . . . . . . . . . . . .
3.2.1 DB e Afins: Declarando dados Inicializados . . .
3.2.2 RESB e afins: Declarando dados nao incializados
3.2.3 INCBIN: Incluindo Arquivos Binarios Externos
3.2.4 EQU: Definindo Constantes . . . . . . . . . . . .
3.2.5 TIMES: Repetindo Instrucoes ou Dados . . . . .
3.3 Endereco Efetivo . . . . . . . . . . . . . . . . . . . . .
3.4 Constantes . . . . . . . . . . . . . . . . . . . . . . . .
3.4.1 Constantes numericas . . . . . . . . . . . . . .
3.4.2 Strings de caracteres . . . . . . . . . . . . . . .
3.4.3 Constantes de Caracteres . . . . . . . . . . . .
3.4.4 Constantes de String . . . . . . . . . . . . . . .
3.4.5 Strings Unicode . . . . . . . . . . . . . . . . . .
3.4.6 Constantes de ponto flutuante (Floating-Point)
3.4.7 Constantes Packed BCD . . . . . . . . . . . . .
3.5 Express
oes . . . . . . . . . . . . . . . . . . . . . . . . .
3.5.1 |: Operador OR bit a bit . . . . . . . . . . . .
3.5.2 : Operador XOR bit a bit . . . . . . . . . . .
3.5.3 & : Operador AND bit a bit . . . . . . . . . .
3.5.4 e : Operadores de rotacao de bit . . . . .
3.5.5 + e : Operadores de adicao e subtracao . . .
3.5.6 *, /, //, % e %%: Multiplicacao e Divisao . . .
3.5.7 Operadores Unitarios: +, , , ! e SEG . . . .
3.6 SEG e WRT . . . . . . . . . . . . . . . . . . . . . . . . .
3.7 STRICT: Inibindo Otimizacao . . . . . . . . . . . . . .
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
6
8
8
8
8
9
9
10
11
11
12
12
13
13
14
15
15
16
16
16
16
16
16
17
17
18
3.8
3.9
Express
oes Criticas . . . . . . . . . . . . . . . . . . . . . . . . . .
R
otulos Locais . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
19
21
1
Introduc
ao
1.1
exemplo de chamada
.data
msg:
.ascii "Oi MUNDO finalmente VIVO!!!\\n"
len = . - msg
Este pequeno programa devera exibir na tela a frase: Oi MUNDO finalmente VIVO!!!.
A descric
ao de cada chamada do sistema pode ser obtida no manual atraves
do comando:
man 2 sys call name
A referencia ao nome da chamado do sistema deve ser feita sem o prefixo sys,
por exemplo, a chamada sys write deve ser referida apenas como write. Assim
o comando deve ser:
man 2 write
A lista de syscalls pode ser obtida, tambem no manual, pelo comando:
man syscalls.
2
Motivos e objetivos desta traduc
ao
s opc
oes da linha de comando do NASM podem ser obtidas atraves do
A
man, o que n
os deixa duvidas apenas sobre a sintaxe da linguagem usada
pelo NASM.
3
Traduc
ao do Capitulo 3 (The NASM Language)
Layout da linha de c
odigo do NASM
Como muitos assemblers, cada linha de codigo do NASM contem (sem ser uma
macro, uma diretiva do preprocessador ou uma direta do assembler: veja os
c
apitulo 4 e 61 ) qualquer combinacao de quatro campos:
r
otulo:
instru
c~
ao
operandos
; coment
ario
do manual, n
ao apresentados aqui.
como um identificador e n
ao como uma palavra reservada; assim, se em algum
outro modulo voce est
a linkando com um simbolo chamado eax, voce pode se
referir a $eax no c
odigo do NASM para distinguir o simbolo do registro. O
comprimento m
aximo de um identificador e 4095 caracteces.
O campo instruc
ao pode conter qualquer instrucao de maquina: instrucoes
Pentium e P6, instruc
oes FPU, instrucoes MMX e ate mesmo instrucoes nao
documentadas s
ao suportadas. A instrucao pode ser prefixada com LOCK, REP,
REPE/REPZ ou REPNE/REPNZ, no modo usual. Sao providos os prefixos para
address-size e operand-size explicitos para A16, A32, A64, O16 e O32, O64
um exemplo do uso deles e dado no capitulo. Voce tambem pode usar o nome
do registro de segmento como um prefixo de uma instrucao: codificar es mov
[bx],ax e equivalente a codificar mov [es:bx],ax. No recomendamos a segunda sintaxe, desde que e consistente como a sintaxe da linguagem, mas para
instruc
oes como LODSB, as quais nao tem operandos e ainda podem requerer um
segment override, uma sintaxe nao clara pode processar com es lodsb.
Uma instruc
ao n
ao requer o uso de prefixo: prefixos como CS, A32, LOCK
ou REPE podem aparecer em uma linha por si mesmos, e o NASM apenas ira
gerar os bytes do prefixo.
Em adic
ao as instruc
oes de maquina atuais, o NASM tambem suporta algumas pseudo-instruc
oes, descritas na secao 3.2.
O operando da instruc
ao pode ter inumeros formatos: ele pode ser registros, descritos simplismente pelo nome do regsitro (exemplo ax, bp, ebx, cr0:
NASM n
ao usa o estilo de sintaxe do gas na qual o nome do registro deve ser
prefixado com um sinal %), ou ele pode ser um endereco efetivo (veja secao 3.3),
constantes (sec
ao 3.4) ou expressoes (secao 3.5).
Para instruc
oes de ponto flutuante x872 , o NASM aceita uma ampla gama
de sintaxes: voce pode usar formas de two-operand como as suportadas pelo
MASM, ou voce pode usar a forma single-operand nativa do NASM em muitos
casos. Por exemplo, voce pode codificar:
fadd
fadd
st1
st0,st1
fadd
fadd
st1,st0
to st1
do co-processador matem
atico
PSEUDO-INSTRUC
OES
3.2
Pseudo-instruc
oes s
ao coisas que, embora nao sejam instrucoes reais x86, sao
utilizados no campo instruc
ao porque esse e o lugar mais conveniente para coloc
a-los. As atuais pseudo-instrucoes sao DB, DW, DD, DQ, DT, DO e DY; suas
contrapartes n
ao inicializadas RESB, RESW, RESD, RESQ, REST, RESO e RESY;
o comando INCBIN, o comando EQU, e o prefixo TIMES.
3.2.1
DB, DW, DD, DQ, DT, DO e DY sao usados, assim como no MASM, para declarar
dados inicializados no arquivo de sada. Eles podem ser invocados com uma
ampla gama de meios:
db
db
db
db
dw
dw
dw
dw
dd
dd
dq
dq
dt
0x55
0x55,0x56,0x57
a,0x55
hello,13,10,$
0x1234
a
ab
abc
0x12345678
1.234567e20
0x123456789abcdef0
1.234567e20
1.234567e20
;
;
;
;
;
;
;
;
;
;
;
;
;
DT, DO e DY n
ao aceitam constantes numericas como operandos.
3.2.2
RESB, RESW, RESD, RESQ, REST, RESO e RESY sao projetados para serem usados na sec
ao BSS de um m
odulo: eles declaram espaco de armazenamento nao
inicializado. Cada um leva um u
nico operando, que e o n
umero de bytes, palavras, doublewords ou o que quer reservar. Como afirmado na secao 2.2.7,
NASM n
ao suporta a sintaxe padrao do MASM / TASM de reserva de espaco
n
ao inicializado escrito como DW ? ou coisas semelhantes. O operando de uma
pseudo-instruc
ao do tipo RESB e uma express
ao crtica: veja secao 3.8.
Por exemplo:
buffer:
wordvar:
realarray
ymmval:
3.2.3
resb
resw
resq
resy
64
1
10
1
;
;
;
;
reserve 64 bytes
reserve a word
array of ten reals
one YMM register
incluir gr
aficos e dados de som diretamente em um arquivo executavel de jogo.
Ele pode ser chamado de tres maneiras:
incbin
incbin
incbin
"file.dat"
"file.dat",1024
"file.dat",1024,512
;
;
;
;
INCBIN e tanto uma directiva como uma macro padrao, as pesquisas padrao
de vers
ao da macro em arquivo no include file search path adiciona o arquivo
para as listas de dependencia. Esta macro pode ser substituda, se desejar.
3.2.4
db
equ
hello, world
$-message
define msglen como sendo a constante 12. msglen nao pode ser redefinida
depois. Essa n
ao e uma definicao para o preprocessador: o valor de msglen e
avaliado, usando o valor de $ (veja a secao 3.5 para uma explicacao do $) no
local da definic
ao, ao inves de ser avaliado onde ele e referenciado, e usando o
valor de $ no ponto de referencia.
3.2.5
times 64 db 0
our coisas similares; mas TIMES e mais versatil que o DUP. O argumento do
TIMES n
ao precisa ser apenas uma constante n
umerica, pode ser uma express
ao
n
umerica, asim voce pode fazer coisas como
buffer: db
hello, world
times 64-$+buffer db
que ir
a armazenar exatamente enough spaces to make the total length of
buffer up to 64. Finalmente, TIMES pode ser aplicado em instrucoes ordinarias, assim voce pode criar c
odigo trivial sem usar loops como em:
times 100 movsb
Note que n
ao h
a nenhuma diferenca efetiva entre times 100 resb 1 e resb
100, exceto que o u
ltimo ser
a montado 100 vezes mais rapido por ser parte da
extrutura interna do assembler.
3.3
Endere
co Efetivo
123
ax,[wordvar]
ax,[wordvar+1]
ax,[es:wordvar+bx]
Qualquer coisa em n
ao conformidade com este simples sistema nao e uma referencia valida a mem
oria no NASM, por exemplo es:wordvar[bx].
Enderecos efetivos mais complicados, como os que envolvem mais que um
registro, trabalha exatamente do mesmo modo:
mov
mov
eax,[ebx*2+ecx+offset]
ax,[bp+di+8]
NASM e capaz de fazer algebra nos enderecos efetivos, assim como coisas
que n
ao parecem necessariamente legais, estao perfeitamente certas:
mov
mov
eax,[ebx*5]
eax,[label1*2-label2]
; assembles as [ebx*4+ebx]
; ie [label1+(label1-label2)]
Algumas formas de endereco efetivo tem mais de uma maneira de ser montado; em muitos casos o NASM gerara a menor forma que puder. Por exemplo,
essas s
ao formas distintas de montar endrecos efetivos para 32-bit [eax*2+0]
[eax+eax], e o NASM gerar
a generalmente a u
ltima com base em que a esta
forma requer quatro bytes par armazenar um delocamento (offset) zero.
NASM tem um mecanismo sugerido que causara que [eax+ebx] e [ebx+eax]
gere opcodes diferentes; isso e ocasionado usualmente por causa de que [esi+ebp]
e [ebp+esi] possuem diferentes registros de segmento padrao.
Todavia, voce pode forcar o NASM gerar um endereco efetivo em um formato particular com o uso das palavras-chave BYTE, WORD, DWORD e NOSPLIT.
Se voce precisa que [eax+3] seja montado usando um campo offset doubleword ao inves de um offset de um byte como o NASM normalmente gera, voce
pode usar [dword eax+3]. Similarmente, voce pode forcar o NASM a usar um
deslocamento de um byte para um valor pequeno que nao deve ser notado na
primeira passagem (veja a secao 3.8 pra um exemplo de fragmento de codigo)
com o uso de [byte eax+offset]. Em casos especiais, [byte eax] codificara
[eax+0] com um byte zero de offset, e [dword eax] codificara isso com uma
double-word zero de offset. A forma normal, [eax], sera codificada sem campo
de offset.
A forma discrita nos paragrafos anteriores tambem e util se voce tentar acessar dados em um segmento de 32-bit a partir de um codigo 16 bite. Para mais
informac
oes veja a sec
ao mixed-size addressing (secao 10.2). Em particular, se
10
voce precisa acessar dados com um deslocamento conhecido que e maior que um
valor de 16-bit, se voce n
ao especificar que e um deslocamento dword, o nasm
causar
a a perda da high word do deslocamento.
Similarmente, o NASM fatiara [eax*2] em [eax+eax] por que isso permite
eleminar o campo de deslocamento e economizar espaco; de fato, isso tambem
fatiar
a [eax*2+offset] em [eax+eax+offset]. Voce pode impedir este comportamento com o uso de NOSPLIT: [nosplit eax*2] forcara [eax*2+0] a ser
gerado literalmente.
No modo 64-bit, NASM gerara por padrao enderecos absolutos. A palavrachave REL produzir
a enderecos RIP-relative. Como esse comportamento e
frequentemente desejado, veja o DEFAULT directive (secao 6.2). A palavrachave ABS sobrescreve a REL.
3.4
Constantes
3.4.1
Constantes num
ericas
ax,200
ax,0200
ax,0200d
ax,0d200
ax,0c8h
ax,$0c8
ax,0xc8
ax,0hc8
ax,310q
ax,310o
;
;
;
;
;
;
;
;
;
;
decimal
still decimal
explicitly decimal
also decimal
hex
hex again: the 0 is required
hex yet again
still hex
octal
octal again
11
mov
mov
mov
mov
mov
mov
mov
3.4.2
ax,0o310
ax,0q310
ax,11001000b
ax,1100_1000b
ax,1100_1000y
ax,0b1100_1000
ax,0y1100_1000
;
;
;
;
;
;
;
Strings de caracteres
single quote ()
double quote (")
backquote ()
backslash (\)
question mark (?)
BEL (ASCII 7)
BS (ASCII 8)
TAB (ASCII 9)
LF (ASCII 10)
VT (ASCII 11)
FF (ASCII 12)
CR (ASCII 13)
ESC (ASCII 27)
Up to 3 octal digits - literal byte
Up to 2 hexadecimal digits - literal byte
4 hexadecimal digits - Unicode character
8 hexadecimal digits - Unicode character
Todas as outras escape sequences sao reservadas. Note que \0, significa um
caractere NULO (ASCII 0), e um caso especial de escape sequence octal.
Caracteres Unicode especificados com \u ou \U sao convertidos para UTF-8.
Por exemplo, as linhas a seguir sao todas equivantes:
db \u263a
db \xe2\x98\xba
db 0E2h, 098h, 0BAh
3.4.3
Constantes de Caracteres
3.4.4
Constantes de String
Constantes de String s
ao strings de caracteres usadas no contexto de algumas
pseudo-instruc
oes, como as da familia DB e a INCBIN (onde representa o nome
de um arquivo.) Elas podem ser usadas em certas diretivas do preprocessador.
Uma constante de string se parece com uma constente de caractere, so que
maior. Ela e tratada como uma concatenacao de constentes de caractere de
tamanho maximo. Assim s
ao equivalente:
db
db
hello
h,e,l,l,o
; string constant
; equivalent character constants
E a seguir, tambem s
ao equivalentes:
dd
dd
db
ninechars
nine,char,s
ninechars,0,0,0
Observe que, quando usado no contexto que aceita strings, strings fechadas
com aspas s
ao tratados como constantes de strings mesmo que sejam curtos o
suficiente para ser uma constante de caracteres, porque senao db ab teria o
mesmo efeito que db a, o que seria bobagem. Da mesma forma, constantes de
tres ou quatro caracteres s
ao tratados como strings quando elas forem operandos
de uma DW, e assim por diante.
3.4.5
Strings Unicode
; Pathname in UTF-16
; String in UTF-32
utf16 e utf32 pode ser aplicado ou para passar strings com instrucoes
da familia DB, ou em express
oes no contexto de constantes de caractere.
13
3.4.6
Constantes de ponto flutuante sao aceitas apenas como argumentos para DB,
DW, DD, DQ, DT, e DO, ou como argumentos para os operadores especiais float8 ,
float16 , float32 , float64 , float80m , float80e , float128l ,
e float128h .
Constantes de ponto flutuante sao expressas da forma tradicional: dgitos,
ent
ao um perodo, em seguida, opcionalmente mais dgitos, em seguida, opcionalmente, um E seguido de um expoente. O perodo e obrigatorio, de modo que
o NASM pode distinguir entre dd 1, que declara uma constante inteira, e dd
1,0 que declara uma constante de ponto flutuante.
NASM tambem suporta ponto flutuante hexadecimais em estilo C99:0x, digitos hexadecimais, periodo, opcionalmente mais digitos hexadecimais, entao
opcionalmente um P seguido por um expoente binario (nao hexadecimal) em
notac
ao decimal. Como uma extensao, NASM adicionalmente suporta os prefixos 0h e $ para hexadecimal, assim como ponto flutuante binario e octal, usando
os prefixos 0b ou 0y e 0o ou 0q, respectivamente.
Underscores ( ) para quebrar grupos de digitos em constantes de ponto flutuante s
ao permitos.
Alguns exemplos:
db
dw
dd
dd
dd
dq
dq
dq
dq
dt
do
-0.2
-0.5
1.2
1.222\_222\_222
0x1p+2
0x1p+32
1.e10
1.e+10
1.e-10
3.141592653589793238462
1.e+4000
;"Quarter precision"
;IEEE 754r/SSE5 half precision
;an easy one
;underscores are permitted
;1.0x2^2 = 4.0
;1.0x2^32 = 4 294 967 296.0
;10 000 000 000.0
;synonymous with 1.e10
;0.000 000 000 1
;pi
;IEEE 754r quad precision
14
Por exemplo:
mov rax,__float64__(3.141592653589793238462)
... seria atribuir a representacao binaria de pi como um n
umero de ponto
flutuante de 64 bits em RAX. Isto e equivale exatamente a:
mov
rax,0x400921fb54442d18
NASM n
ao pode efetuar aritmetica em constantes ponto flutuante durante a
compilac
ao. Isto ocorre porque o NASM foi concebido para ser portatil - embora
ele sempre gere c
odigo para ser executado em processadores x86, o montador
pode rodar em qualquer sistema com um compilador ANSI C. Portanto, o montador n
ao pode garantir a presenca de uma unidade ponto flutuante capaz de
lidar com os formatos de n
umero Intel, e assim que para o NASM fosse capaz
de fazer aritmetica flutuante teria que incluir o seu proprio conjunto completo
de rotinas ponto flutuante, o que aumentaria significativamente o tamanho do
montador para benefcio muito pequeno.
As token especiais Infinity , QNaN (ou NaN ) e SNaN podem ser
usadas para gerar infinitos, quiets Nans e Nans sinalizadas, respectivamente.
S
ao normalmente utilizados como macros:
%define Inf __Infinity__
%define NaN __QNaN__
dq +1.5, -Inf, NaN ; Double-precision constants
O pacote de macros padr
ao %use fp contem um conjunto de macros convenientes. Veja sec
ao 5.3.
3.4.7
3.5
2_345_678_901_245_678p
-12_345_678_901_245_678p
+0p33
33p
Express
oes
Express
oes no NASM e similar a sintaxe do C. Expressao sao avaliadas como inteiros de 64-bit que depois sa
o ajustados para o tamanho apropriado. O NASM
15
3.5.1
3.5.2
3.5.3
3.5.4
e : Operadores de rotac
ao de bit
3.5.5
+ e : Operadores de adic
ao e subtrac
ao
3.5.6
* e o operador de multiplicac
ao. / e // sao ambos operadores de divisao: / e
para divis
ao sem sinal e // e para divisao com sinal, Similarmente % e %% prove
operadores para o modulo da divisao sem sinal e com sinal respectivamente.
NASM, como o ANSI C, n
ao garante a exatidao de operacoes com o operador de modulo da divis
ao com sinal.
Como o caractere % e muito usado por macros do preprocessador, voce deve
asegurar que ambos os operadores de modulo com e sem sinal sejam seguidos
de um espaco em branco onde quer que eles aparecam.
16
3.5.7
Operadores Unit
arios: +, , , ! e SEG
3.6
SEG e WRT
Quando estiver escrevendo programas longos em 16-bit, o qual deve ser repartido
em multiplos segmentos, e frequentemente necessario ser capaz de referenciar o
segmento em parte do endereco de um simbolo. NASM suporta o operador SEG
que executa esta func
ao.
O operador SEG retorna o segmento base preferencial do simbolo, definido
como o segmento base relativo ao qual o deslocamento do simbolo se relaciona.
Assim o c
odigo
mov
mov
mov
ax,seg symbol
es,ax
bx,symbol
carregar
a ES:BX com um ponteiro valido para o simbolo symbol.
As coisas pode ser mais complexas que isso: como segmentos em 16-bit e
grupos podem ser sobrepostos overlap, voce podera ocasionalmente querer se
referir a algum smbolo usando um segmento base diferente do prefeencuial.
NASM permite faze-lo, pelo uso da palavra chave WRT (With Reference To).
Assim voce pode fazer coisas como
mov
mov
mov
ax,weird_seg
es,ax
bx,symbol wrt weird_seg
para carregar ES:BX com um diferente, mas funcionalmente equivalente, ponteiro para o smbolo symbol.
NASM suporta chamadas longas (inter-segmento) e jumps por meio da sintaxe de chamada segment:offset, onde ambos segment e offset representam
valores imediatos. Assim para chamar um procedimento distante, voce pode
codificar qualquer uma destas
call
call
(seg procedure):procedure
weird_seg:(procedure wrt weird_seg)
(OS parenteses s
ao incluidos aqui para dar clareza, para mostrar a intensao
da instruc
ao acima. Eles n
ao sao necessarios na pratica.)
JMP trabalha de modo identico ao CALL nos exemplos acima.
Para declarar um ponteiro muito longe para um item de dados em um segmento de dados, voce deve codificar
17
dw
NASM n
ao suporta sin
onimo conveniente para esto, mas voce sempre pode
inventar um usando uma macro.
3.7
Quando montar com o otimizador em level 2 ou maior (veja secao 2.1.22), NASM
usar
a os especificadores de tamanho (BYTE, WORD, DWORD, QWORD, TWORD, OWORD
ou YWORD), mas dar
a a eles o menor tamanho possvel. A palavra chave STRICT
pode ser usada para inibir a otimizacao e forcar um operano em particular a
ser emitido em um tamanho especifico. Por exemplo, com o otimizador ligado,
e em modo BITS 16,
push dword 33
e codificado em tres bytes 66 6A 21, enquanto que
push strict dword 33
e codificado em seis bytes, com um operando imediato dword completa 66
68 21 00 00 00.
Com o otimizador desligado, o mesmo codigo (seis bytes) e gerado independente do uso da palavra chave STRICT.
3.8
Express
oes Criticas
(label-$) db 0
Where am I?
O argumento para TIME, neste caso, poderia igualmente avaliar nada; NASM
vai rejeitar este exemplo, porque nao pode dizer o tamanho da linha TIMES na
primeira vez que a ve. Assim rejeitara com firmeza qualquer codigo pouco
paradoxal
label:
times (label-$+1) db 0
db
NOW where am I?
18
3.9
R
otulos Locais
NASM d
a tratamento especial aos smbolos que comecam com um ponto. Um
r
otulo iniciado com um ponto e tratado como um rotulo local, o que significa
que ele est
a associada com o rotulo nao local anterior. Assim, por exemplo:
label1
; some code
.loop
; some more code
jne
ret
label2
.loop
; some code
.loop
; some more code
jne
ret
.loop
No fragmento de c
odigo anterior, cada instrucao JNE salta para a linha imediatamente antes dela, porque as duas definicoes de .loop sao mantidas em
separado, em virtude de que cada uma esta associada com o rotulo nao local
anterior.
Esta forma de manipulac
ao de rotulo local e emprestada do velho assembler
Amiga DevPac, no entanto, o NASM vai um passo alem, ao permitir o acesso
aos r
otulos locais de outras partes do codigo. Isto e conseguido por meio da
definic
ao de uma etiqueta local em termos da etiqueta nao local anterior: a
primeira definic
ao de .loop acima e realmente definida como um smbolo chamado label1.loop, e a segunda definica do smbolo e chamado de label2.loop.
Ent
ao, se voce realmente precisar, voce pode escrever
label3
` vezes e u
As
til - numa macro, por exemplo - ser capaz de definir um rotulo
que possa ser referenciado a partir de qualquer lugar, mas que nao interfira
com o mecanismo de r
otulo local normal. Esse rotulo nao pode ser nao local
porque iria interferir com as definicoes subsequentes de, e referencias locais a,
19
r
otulos; e n
ao pode ser local porque a macro que o definiu nao saberia o nome
completo do r
otulo. NASM, portanto, introduz um terceiro tipo de rotulo, que
provavelmente e u
til apenas para as definicoes de macro: se um rotulo comeca
com o prefixo especial ..@ entao ele nao utiliza o mecanismo de rotulo local.
Ent
ao voce pode codificar
label1:
.local:
..@foo:
label2:
.local:
;
;
;
;
;
jmp
..@foo
um r
otulo n~
ao local
este
e relamente label1.local
este
e um simbolo especial
outro rotulo n~
ao local
este
e realment label2.loop
; isso pular
a para tr^
e linha a cima
NASM tem a capacidade de definir outros smbolos especiais que comecam com
dois pontos seguidos: por exemplo, ..start e usado para especificar o ponto de
entrada na sada do formato objeto (ver secao 7.4.6), ..imagebase e usado para
descobrir o deslocamento de um endereco de base da imagem atual na saida do
formato win64 (ver sec
ao 7.6.1). Entao, basta ter em mente que os smbolos
comecando com dois pontos seguidos sao especiais.
20
4
Lista de Chamadas do sistema
uma lista com as Syscall do kernel linux, com o tipo de dado que deve
Segue
haver em cada registro usado para passar parametro ao sistema.
21
1 de 12
http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html
Name
Source
%ebx
%ecx
%edx
%esx
%edi
sys_exit
kernel/exit.c
int
sys_fork
arch/i386/kernel
/process.c
struct pt_regs
sys_read
fs/read_write.c
unsigned int
char *
size_t
sys_write
fs/read_write.c
unsigned int
const char *
size_t
sys_open
fs/open.c
const char *
int
int
sys_close
fs/open.c
unsigned int
sys_waitpid
kernel/exit.c
pid_t
unsigned int *
int
sys_creat
fs/open.c
const char *
int
sys_link
fs/namei.c
const char *
const char *
10
sys_unlink
fs/namei.c
const char *
sys_execve
arch/i386/kernel
/process.c
struct pt_regs
11
12
sys_chdir
fs/open.c
const char *
13
sys_time
kernel/time.c
int *
14
sys_mknod
fs/namei.c
const char *
int
dev_t
15
sys_chmod
fs/open.c
const char *
mode_t
16
sys_lchown
fs/open.c
const char *
uid_t
gid_t
18
sys_stat
fs/stat.c
char *
struct
__old_kernel_stat *
19
sys_lseek
fs/read_write.c
unsigned int
o_t
unsigned int -
20
sys_getpid
kernel/sched.c
21
sys_mount
fs/super.c
char *
char *
char *
22
sys_oldumount
fs/super.c
char *
23
sys_setuid
kernel/sys.c
uid_t
24
sys_getuid
kernel/sched.c
25
sys_stime
kernel/time.c
int *
26
sys_ptrace
arch/i386/kernel
/ptrace.c
long
long
long
long
27
sys_alarm
kernel/sched.c
unsigned int
28
sys_fstat
fs/stat.c
unsigned int
struct
__old_kernel_stat *
29
sys_pause
arch/i386/kernel
/sys_i386.c
30
sys_utime
fs/open.c
char *
struct utimbuf *
33
sys_access
fs/open.c
const char *
int
34
sys_nice
kernel/sched.c
int
36
sys_sync
fs/buer.c
37
sys_kill
kernel/signal.c
int
int
38
sys_rename
fs/namei.c
const char *
const char *
39
sys_mkdir
fs/namei.c
const char *
int
40
sys_rmdir
fs/namei.c
const char *
41
sys_dup
fs/fcntl.c
unsigned int
07/28/2012 02:49 PM
2 de 12
http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html
42
sys_pipe
arch/i386/kernel
/sys_i386.c
unsigned long *
43
sys_times
kernel/sys.c
45
sys_brk
mm/mmap.c
46
sys_setgid
47
struct tms *
unsigned long
kernel/sys.c
gid_t
sys_getgid
kernel/sched.c
48
sys_signal
kernel/signal.c
int
__sighandler_t
49
sys_geteuid
kernel/sched.c
50
sys_getegid
kernel/sched.c
51
sys_acct
kernel/acct.c
const char *
52
sys_umount
fs/super.c
char *
int
54
sys_ioctl
fs/ioctl.c
unsigned int
unsigned int
unsigned
long
55
sys_fcntl
fs/fcntl.c
unsigned int
unsigned int
unsigned
long
57
sys_setpgid
kernel/sys.c
pid_t
pid_t
sys_olduname
arch/i386/kernel
/sys_i386.c
struct
oldold_utsname *
59
60
sys_umask
kernel/sys.c
int
61
sys_chroot
fs/open.c
const char *
62
sys_ustat
fs/super.c
dev_t
struct ustat *
63
sys_dup2
fs/fcntl.c
unsigned int
unsigned int
64
sys_getppid
kernel/sched.c
65
sys_getpgrp
kernel/sys.c
66
sys_setsid
kernel/sys.c
const struct
old_sigaction *
struct
old_sigaction *
67
sys_sigaction
arch/i386/kernel
/signal.c
int
68
sys_sgetmask
kernel/signal.c
69
sys_ssetmask
kernel/signal.c
int
70
sys_setreuid
kernel/sys.c
uid_t
uid_t
71
sys_setregid
kernel/sys.c
gid_t
gid_t
72
sys_sigsuspend
arch/i386/kernel
/signal.c
int
int
old_sigset_t
73
sys_sigpending
kernel/signal.c
old_sigset_t *
74
sys_sethostname
kernel/sys.c
char *
int
75
sys_setrlimit
kernel/sys.c
unsigned int
struct rlimit *
76
sys_getrlimit
kernel/sys.c
unsigned int
struct rlimit *
77
sys_getrusage
kernel/sys.c
int
struct rusage *
78
sys_gettimeofday
kernel/time.c
struct timeval *
struct timezone
*
79
sys_settimeofday
kernel/time.c
struct timeval *
struct timezone
*
80
sys_getgroups
kernel/sys.c
int
gid_t *
81
sys_setgroups
kernel/sys.c
int
gid_t *
82
old_select
arch/i386/kernel
/sys_i386.c
struct
sel_arg_struct *
83
sys_symlink
fs/namei.c
const char *
const char *
84
sys_lstat
fs/stat.c
char *
struct
__old_kernel_stat *
85
sys_readlink
fs/stat.c
const char *
char *
int
86
sys_uselib
fs/exec.c
const char *
87
sys_swapon
mm/swaple.c
const char *
int
88
sys_reboot
kernel/sys.c
int
int
int
void *
89
old_readdir
fs/readdir.c
unsigned int
void *
unsigned int -
arch/i386/kernel
/sys_i386.c
struct
mmap_arg_struct
*
90
old_mmap
07/28/2012 02:49 PM
3 de 12
http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html
91
sys_munmap
mm/mmap.c
unsigned long
size_t
92
sys_truncate
fs/open.c
const char *
unsigned long
93
sys_ftruncate
fs/open.c
unsigned int
unsigned long
94
sys_fchmod
fs/open.c
unsigned int
mode_t
95
sys_fchown
fs/open.c
unsigned int
uid_t
gid_t
96
sys_getpriority
kernel/sys.c
int
int
97
sys_setpriority
kernel/sys.c
int
int
int
99
sys_statfs
fs/open.c
const char *
struct statfs *
100
sys_fstatfs
fs/open.c
unsigned int
struct statfs *
101
sys_ioperm
arch/i386/kernel
/ioport.c
unsigned long
unsigned long
int
102
sys_socketcall
net/socket.c
int
unsigned long *
103
sys_syslog
kernel/printk.c
int
char *
int
104
sys_setitimer
kernel/itimer.c
int
struct
struct itimerval *
itimerval *
105
sys_getitimer
kernel/itimer.c
int
struct itimerval * -
106
sys_newstat
fs/stat.c
char *
struct stat *
107
sys_newlstat
fs/stat.c
char *
struct stat *
108
sys_newfstat
fs/stat.c
unsigned int
struct stat *
109
sys_uname
arch/i386/kernel
/sys_i386.c
struct
old_utsname *
110
sys_iopl
arch/i386/kernel
/ioport.c
unsigned long
111
sys_vhangup
fs/open.c
112
sys_idle
arch/i386/kernel
/process.c
113
sys_vm86old
arch/i386/kernel
/vm86.c
unsigned long
struct
vm86plus_struct *
114
sys_wait4
kernel/exit.c
pid_t
unsigned long *
int options
struct
rusage *
115
sys_swapo
mm/swaple.c
const char *
116
sys_sysinfo
kernel/info.c
struct sysinfo *
117
sys_ipc (*Note)
arch/i386/kernel
/sys_i386.c
uint
int
int
int
void *
118
sys_fsync
fs/buer.c
unsigned int
119
sys_sigreturn
arch/i386/kernel
/signal.c
unsigned long
120
sys_clone
arch/i386/kernel
/process.c
struct pt_regs
121
sys_setdomainname
kernel/sys.c
char *
int
struct
new_utsname *
122
sys_newuname
kernel/sys.c
123
sys_modify_ldt
arch/i386/kernel/ldt.c int
void *
unsigned
long
124
sys_adjtimex
kernel/time.c
struct timex *
125
sys_mprotect
mm/mprotect.c
unsigned long
size_t
unsigned
long
126
sys_sigprocmask
kernel/signal.c
int
old_sigset_t *
old_sigset_t
*
127
sys_create_module
kernel/module.c
const char *
size_t
128
sys_init_module
kernel/module.c
const char *
struct module *
129
sys_delete_module
kernel/module.c
const char *
130
sys_get_kernel_syms
kernel/module.c
struct kernel_sym
*
131
sys_quotactl
fs/dquot.c
int
const char *
int
caddr_t
132
sys_getpgid
kernel/sys.c
pid_t
133
sys_fchdir
fs/open.c
unsigned int
134
sys_bdush
fs/buer.c
int
long
07/28/2012 02:49 PM
4 de 12
http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html
135
sys_sysfs
fs/super.c
int
136
sys_personality
138
sys_setfsuid
kernel/sys.c
uid_t
139
sys_setfsgid
kernel/sys.c
gid_t
unsigned
long
lo_t *
unsigned
int
unsigned long
140
sys_llseek
fs/read_write.c
unsigned int
unsigned long
unsigned
long
141
sys_getdents
fs/readdir.c
unsigned int
void *
unsigned int -
142
sys_select
fs/select.c
int
fd_set *
fd_set *
fd_set *
struct
timeval *
143
sys_ock
fs/locks.c
unsigned int
unsigned int
144
sys_msync
mm/lemap.c
unsigned long
size_t
int
unsigned
long
145
sys_readv
fs/read_write.c
unsigned long
const struct
iovec *
146
sys_writev
fs/read_write.c
unsigned long
const struct
iovec *
unsigned
long
147
sys_getsid
kernel/sys.c
pid_t
148
sys_fdatasync
fs/buer.c
unsigned int
149
sys_sysctl
kernel/sysctl.c
struct
__sysctl_args *
150
sys_mlock
mm/mlock.c
unsigned long
size_t
151
sys_munlock
mm/mlock.c
unsigned long
size_t
152
sys_mlockall
mm/mlock.c
int
153
sys_munlockall
mm/mlock.c
154
sys_sched_setparam
kernel/sched.c
pid_t
struct
sched_param *
155
sys_sched_getparam
kernel/sched.c
pid_t
struct
sched_param *
156
sys_sched_setscheduler
kernel/sched.c
pid_t
int
struct
sched_param *
157
sys_sched_getscheduler
kernel/sched.c
pid_t
158
sys_sched_yield
kernel/sched.c
159
sys_sched_get_priority_max kernel/sched.c
int
160
sys_sched_get_priority_min kernel/sched.c
int
161
sys_sched_rr_get_interval
kernel/sched.c
pid_t
struct timespec * -
162
sys_nanosleep
kernel/sched.c
struct timespec *
struct timespec * -
163
sys_mremap
mm/mremap.c
unsigned long
unsigned long
unsigned
long
164
sys_setresuid
kernel/sys.c
uid_t
uid_t
uid_t
165
sys_getresuid
kernel/sys.c
uid_t *
uid_t *
uid_t *
sys_vm86
arch/i386/kernel
/vm86.c
struct
vm86_struct *
167
sys_query_module
kernel/module.c
const char *
int
char *
size_t
size_t *
168
sys_poll
fs/select.c
struct pollfd *
unsigned int
long
166
unsigned
long
169
sys_nfsservctl
fs/lesystems.c
int
void *
void *
170
sys_setresgid
kernel/sys.c
gid_t
gid_t
gid_t
171
sys_getresgid
kernel/sys.c
gid_t *
gid_t *
gid_t *
172
sys_prctl
kernel/sys.c
int
unsigned long
unsigned
long
unsigned unsigned
long
long
173
sys_rt_sigreturn
arch/i386/kernel
/signal.c
unsigned long
174
sys_rt_sigaction
kernel/signal.c
int
const struct
sigaction *
struct
sigaction *
size_t
175
sys_rt_sigprocmask
kernel/signal.c
int
sigset_t *
sigset_t *
size_t
176
sys_rt_sigpending
kernel/signal.c
sigset_t *
size_t
size_t
177
sys_rt_sigtimedwait
kernel/signal.c
const sigset_t *
siginfo_t *
const struct
timespec *
178
sys_rt_sigqueueinfo
kernel/signal.c
int
int
siginfo_t *
07/28/2012 02:49 PM
5 de 12
179
http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html
sys_rt_sigsuspend
arch/i386/kernel
/signal.c
sigset_t *
size_t
180
sys_pread
fs/read_write.c
unsigned int
char *
size_t
lo_t
181
sys_pwrite
fs/read_write.c
unsigned int
const char *
size_t
lo_t
182
sys_chown
fs/open.c
const char *
uid_t
gid_t
183
sys_getcwd
fs/dcache.c
char *
unsigned long
184
sys_capget
kernel/capability.c
cap_user_header_t cap_user_data_t -
185
sys_capset
kernel/capability.c
const
cap_user_header_t
cap_user_data_t
186
sys_sigaltstack
arch/i386/kernel
/signal.c
const stack_t *
stack_t *
187
sys_sendle
mm/lemap.c
int
int
o_t *
size_t
sys_vfork
arch/i386/kernel
/process.c
struct pt_regs
190
Note for sys_ipc (117): this syscall takes six arguments, so it can't t into the ve registers %ebx - %edi; the last parameter
(not shown) is of type 'long'. This syscall requires a special call method where a pointer is put in %ebx which points to an array
containing the six arguments.
I will now explain exactly where in the kernel source that I got the information in the table above. I do this because 1) changes
in the source are bound to happen, 2) you might be curious, or 3) I might've made an error.
Typedefs
Here are the typedef declarations in the prototypes above:
atomic_t
caddr_t
include/asm/atomic.h:
#ifdef __SMP__
typedef struct { volatile int counter; } atomic_t;
#else
typedef struct { int counter; } atomic_t;
#endif
include/asm/posix_types.h:typedef char * __kernel_caddr_t;
include/linux/types.h:typedef __kernel_caddr_t caddr_t;
cap_user_header_t include/linux/capability.h:
typedef struct __user_cap_header_struct {
__u32 version;
int pid;
} *cap_user_header_t;
cap_user_data_t
clock_t
include/linux/capability.h:
typedef struct __user_cap_data_struct {
__u32 eective;
__u32 permitted;
__u32 inheritable;
} *cap_user_data_t;
include/asm/posix_types.h:typedef long __kernel_clock_t;
include/linux/types.h:typedef __kernel_clock_t clock_t;
dev_t
fdset
include/linux/posix_types.h
#dene __FD_SETSIZE 1024
#dene __NFDBITS (8 * sizeof(unsigned long))
#dene __FDSET_LONGS (__FD_SETSIZE/__NFDBITS)
(==> __FDSET_LONGS == 32)
typedef struct {
unsigned long fds_bits [__FDSET_LONGS];
07/28/2012 02:49 PM