Вы находитесь на странице: 1из 27

Sintaxe NASM e Syscalls do linux

Cacio jose gazola


28 de Julho de 2012

Conte
udo

1 Introdu
c
ao
1.1 exemplo de chamada . . . . . . . . . . . . . . . . . . . . . . . . .

3
4

2 Motivos e objetivos desta tradu


c
ao

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 . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4 Lista de Chamadas do sistema

18
19
21

1
Introduc
ao

presento neste trabalho a traducao para portugues do Brasil do capitulo


A
3 (The NASM Language) do manual NASM The Netwide Assembler
vers
ao 2.09.10. E tambem a compilacao de material encontrado na web, em
dezenas de sites, sobre as syscalls do Linux.
As syscall do linux s
ao similares as interrupc
oes de software do DOS e BIOS.
Neles as interrupc
oes mais usadas sao: 0x21, 0x25, do DOS, e 0x10, 0x16, da
BIOS.
J
a no linux todas as syscall sao chamadas pela interrupcao 0x80. A valor carregado em eax define qual das chamadas do sistema sera usada, e os
argumentos s
ao dados em ebx, ecx, edx, esi, edi, sucessivamente, ate cinco argumentos. Caso mais argumentos sejam necessarios, um ponteiro para a estrutura
com todos eles e passada em ebx, com todos os argumentos arranjados sucessivamente na mem
oria. Ap
os cada chamada um inteiro e dado em eax, como
valor de retorno.
O conhecimento das chamadas pode ser obtido lendo as fontes do kernel
e tambem por meio de sites e exemplos disponveis, mas sao todas as funcoes
b
asicas do sistema, que s
ao explorados por bibliotecas como a GLIBC, que implementa uma serie de func
oes e padroes usados por varios programas. Em algumas
distros e possvel encontrar uma lista das syscalls em /usr/includes/sys/syscall.h.
No Linux a tabela das system call e definida dentro do arquivo
arch/i386/kernel/entry.S ou similar. Por exemplo no Slackware 13.37 e possivel encontrar em /usr/src/linux/arch/x86/kernel os arquivos entry 32.S e entry 64.S.
Uma lista tambem pode ser obtida com o comando: man syscalls.

1.1

exemplo de chamada

neste exemplo usamos as chamadas sys write(eax = 4) que le uma cadeia de


caracteres, cujo ponteiro est
a em ecx e o comprimento total da cadeia em edx,
e imprime na saida padr
ao (ebx = 1); e a sys exit(eax = 1) que encerra o
programa.
movl
movl
movl
movl
int
movl
movl
int

len,edx ; comprimento da cadeia


msg,ecx ; endere
co da cadeia
0x01,ebx ; saida
0x04,eax ; chamada sys_write
0x80
0x00,ebx ; para a sys_exit ebx deve ser zero
0x01,eax ; chamada sys_exit
0x80

.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.

Por isso me abstive que traduzir os capitulos referentes a instalacao e opcoes


de execuc
ao do NASM.
Fiz uma traduc
ao adaptada, pois algumas vezes e impossvel traduzir uma
sentenca literalmente.

3
Traduc
ao do Capitulo 3 (The NASM Language)

Segue a traducao adaptada do capitulo 3 no manual do NASM versao 2.09.10.


3.1

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

Como e usual, muitos destes campos sao opcionais; a presenca ou ausencia


de qualquer combinac
ao de um rotulo, uma instrucao e um comentario e permitido. Obviamente, o campo operando e requerido ou proibido pela presenca
e natureza da instruc
ao.
NASM usa a barra invertida (\) como caractere de continuacao de linha;
se a linha termina com a barra invertida, a proxima linha e considerada como
sendo da linha anterior.
NASM n
ao impoem retricoes quanto a espacos em branco na linha: podem
haver espacos em branco antes dos rotulos, ou nao ter espacos em branco antes
das instruc
oes. Os dois pontos depois de um rotulo tambem e opcional. (Note
que se voce quiser digitar lodsb sozinho em uma linha, e digitar lodab por acidente, ser
a considerado uma linha de codigo valida mas nao contera um rotulo.
Executar o NASM como a opcao --w+orphan--labels provocara um aviso se
voce definir um r
otulo sozinho em uma linha sem os dois pontos).
Caracteres v
alidos nos r
otulos sao letras, n
umeros, _, $, #, @, , ., and ?.
Os u
nicos caracteses permitidos para serem usados como primeiro caractere de
um identificador s
ao letras, . (mais detalhes: veja secao 3.9), _ e ?. Um identificador tambem pode ser prefixado com um $ para indicar que deve ser lido
1 capitulos

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

; this sets st0 := st0 + st1


; so does this

fadd
fadd

st1,st0
to st1

; this sets st1 := st1 + st0


; so does this

Quase todas intruc


oes de ponto flutuante x87 que fazem referencia a memoria
devem usar um do prefixos DWORD, QWORD ou TWORD para indicar o tamanho da
mem
oria que o operando se refere.
2 instru
c
oes

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 e Afins: Declarando dados Inicializados

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

;
;
;
;
;
;
;
;
;
;
;
;
;

just the byte 0x55


three bytes in succession
character constants are OK
so are string constants
0x34 0x12
0x61 0x00 (its just a number)
0x61 0x62 (character constant)
0x61 0x62 0x63 0x00 (string)
0x78 0x56 0x34 0x12
floating-point constant
eight byte constant
double-precision float
extended-precision float

DT, DO e DY n
ao aceitam constantes numericas como operandos.

3.2.2

RESB e afins: Declarando dados n


ao incializados

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

INCBIN: Incluindo Arquivos Bin


arios Externos

INCBIN e emprestada do antigo Amiga assembler DevPac: inclui um arquivo


bin
ario na ntegra na sada arquivo. Isto pode ser u
til para (por exemplo),
8

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

;
;
;
;

include the whole file


skip the first 1024 bytes
skip the first 1024, and
actually include at most 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

EQU: Definindo Constantes

EQU define um simbolo associado a um valor constante: quando EQU e usado,


a linha do fonte deve conter um rotulo. A acao do EQU e atribuir ao rotulo
dado o valor do seu (
unico) operando. Essa definicao e absoluta, e nao pode ser
alterado depois. Assim, por exemplo,
message
msglen

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: Repetindo Instruc


oes ou Dados

O prefixo TIMES forca a montagem da instrucao multiplas vezes. Esta parte


do NASM tem sintaxe equivalente ao DUP suportado pelos assembler MASMcompatible, onde voce pode codificar
zerobuf:

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

Um endereco efetivo e qualquer operando em uma instrucao que faca referencia


a mem
oria. Enderecos Efetivos, no NASM, tem uma sintaxe muito simples:
eles consistem de uma expressao que calcule e endereco desejado, fechada em
colchetes. Por exemplo:
wordvar dw
mov
mov
mov

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

NASM entende quatro tipo diferentes de constantes: numericas, caracteres,


string e ponto flutuante (floating-point).

3.4.1

Constantes num
ericas

Uma constante numerica e simplesmente um n


umero. NASM permite que voce
especifique n
umeros em um variedade de bases numericas, em uma variedade de
formas: voce pode usar o sufixo H ou X, D ou T, Q ou O, e B ou Y para hexadecimal,
decimal, octal e bin
ario respectivamente, ou pde preficar 0x, para hexadecimal
no estilo do C, ou pode prefixar $ para hexadecimal no estilo do Borland Pascal
ou Motorola Assemblers. Note que, ainda que o prefixo $ tem funcao dupla
como um prefixo de identificadores (veja secao 3.1), assim um n
umero hex prefixado com um $ deve ter um digito apos o $ ao inves de uma letra. Em adicao,
a vers
ao atual do NASM aceita o prefixo 0h para hexadecimal, 0d ou 0t para
decimal, 0o ou 0q para octal, e 0b ou 0y para binario. Por favor note que diferente do C, um prefixo 0 por si mesmo nao implica em uma constante em octal!
Constantes Numericas pode ter underscores ( ) intercalados para separar
strings longas.
Alguns exemplos (todos produzindo exatamente o mesmo codigo):
mov
mov
mov
mov
mov
mov
mov
mov
mov
mov

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

;
;
;
;
;
;
;

octal yet again


octal yet again
binary
same binary constant
same binary constant once more
same binary constant yet again
same binary constant yet again

Strings de caracteres

Uma String de caracteres consiste em ate oito caracteres fechados ou em aspas


simples (...), aspas duplas (...) ou backquotes(...). Aspas duplas e simples
s
ao equivalentes no NASM (exceto, claro, que fechar uma constante com aspas
simples permite usar aspas duplas dentro da marcacao e vice versa); o conte
udo
e representado literalmente. Strings fechadas em backquotes suportam o estilo
C \-escapes para caracteres especiais.
As seguinte escape sequence que sao reconhecidas por strings backquoted:
\
\"
\
\\
\?
\a
\b
\t
\n
\v
\f
\r
\e
\377
\xFF
\u1234
\U12345678

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

; UTF-8 smiley face


; UTF-8 smiley face
; UTF-8 smiley face

Constantes de Caracteres

Uma constente de caracteres consiste em um string de ate oito bytes, usada no


tratada como se fosse um inteiro. Uma constente
contexto de uma expres
ao. E
12

de caracteres com mais de um byte sera arrumada na memoria com ordem


little-endian: se voce codificar
mov eax,abcd
ent
ao a constante gerada nao sera 0x61626364, mas 0x64636261, assim se
voce fosse, em seguida ao armazenamento do valor na memoria, ler abcd ao inves
de dcba. Este e tambem o sentido das constantes de caracteres compreendida
pela instruc
ao Pentium CPUID.

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

; doubleword string constant


; becomes three doublewords
; and really looks like this

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

Os operadores especiais utf16 e utf32 permite definir strings unicode.


Eles pegam uma string em formato UTF-8 e convertem para (littleendian) UTF16 ou UTF-32, respectivamente.
Por exemplo:
%define u(x) __utf16__(x)
%define w(x) __utf32__(x)
dw u(C:\WINDOWS), 0
dd w(A + B = \u206a), 0

; 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 (Floating-Point)

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

O formato quarter-precision8-bit de ponto flutuante e sinal:expoente:mantissa


= 1:4:3 com um expoente 7. Este parece ser o mais utilizado formato de 8-bit
de ponto flutuante, embora n
ao seja coberto por qualquer padrao formal. Isso
a`s vezes e chamado de minifloat.
Os operadores especiais s
ao usados para produzir n
umeros de ponto flutuante em outros contextos. Eles produzem a representacao binaria de um
n
umero ponto flutuante especfico como um inteiro, e pode usar constantes inteiras em qualquer lugar que sao utilizados em uma expressao. float80m e
float80e produzir uma mantissa de 64-bits e um expoente de 16-bit de um
n
umero ponto flutuante de 80-bit, e float128l e float128h produz a
parte inferior e superior de 64 bits de um n
umero ponto flutuante de 128-bit,
respectivamente.

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

Constantes Packed BCD

Constantes estilo x87 podem ser usadas no mesmo contexto dos n


umeros ponto
flutuantes de 80-bit. Eles s
ao sufixados com p ou prefixados com 0p, e podem
incluir ate 18 digitos decimais. Como qualquer outra constante numerica, underscores podem ser usados para separar digitos.
Por exemplo:
dt
dt
dt
dt

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

suporta dois tokens especiais em expressoes, permitindo calculos que envolve


a posic
ao atual da montagem: os tokens $ e $$ tokens. $ avalia a posicao de
montagem desde o inicio da linha que contem a expressao; assim voce pode
codificar loops infinitos usando JMP $. $$ avalia do inicio da secao atual; assim
voce pode dizer qual a dist
ancia que voce esta dentro da secao usando ($-$$).
Os operadores aritmeticos providos pelo NASM sao listados a seguir, estao
incrementados em ordem de precendencia.

3.5.1

|: Operador OR bit a bit

O operador | prove um OR bit a bit, exatamente como o realizado pela instrucao


de maquina OR. O OR bit a bit e o operador aritmetico de menor prioridade
suportado pelo NASM.

3.5.2

: Operador XOR bit a bit

prove uma operac


ao XOR bit a bit.

3.5.3

& : Operador AND bit a bit

& prove uma operac


ao AND bit a bit.

3.5.4

 e : Operadores de rotac
ao de bit

 prove uma rotac


ao de bit para a esquerda, igual ao que faz em C. Assim
53 calcula 5 vezes 8, ou 40.  prove uma rotacao de bit para a direita; no
NASM, como a rotac
ao e sempre sem sinal, o bit rodado da extrema esquerda
e preenchido com zero independente do valor anterior do bit mais alto.

3.5.5

+ e : Operadores de adic
ao e subtrac
ao

Os operadores + e fazem perfeitamente a adicao e subtracao ordinarias.

3.5.6

*, /, //, % e %%: Multiplicac


ao e Divis
ao

* 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

Os operadores de maior prioridade na gramatica de expressoes do NASM sao


aqueles que apresentam um u
nico argumento. operador de negacao, + nao
faz nada (provido apenas para ser simetrico com ), computa o complemento
um de seu operando, ! e o operador de negacao logica, e SEG prove o endereco
do segmento de seu operando (expliccoes com mais detalhes na secao3.6).

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

; weird_seg is a segment base

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

symbol, seg symbol

NASM n
ao suporta sin
onimo conveniente para esto, mas voce sempre pode
inventar um usando uma macro.

3.7

STRICT: Inibindo Otimizac


ao

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

Embora NASM tenha um otimizador multi-pass opcional, existem algumas express


oes que devem ser resolvidas na primeira passagem. Sao as chamadas
express~
oes cr
ticas.
A primeira passagem e usada para determinar o tamanho total do codigo
montado e dos dados, de modo que na segunda passagem, quando gerar o codigo,
sabe-se todos os enderecos dos smbolos. Entao, uma coisa que o NASM nao
pode lidar e c
odigo cujo tamanho depende do valor de um smbolo declarado
ap
os o c
odigo em quest
ao. Por exemplo,
times
label: db

(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

no qual qualquer valorpara o argumento de TIMES e por definicao falso!


NASM rejeita estes exemplos, por meio do conceito chamado express~
ao
cr
tica, que e definido para ser uma expressao cujo valor e necessario ser
comput
avel na primeira passagem, e que deve, portanto, depender apenas de
smbolos definidos previamente. O argumento para o prefixo TIMES e uma express
ao crtica.

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

; some more code


; and some more
jmp label1.loop

` 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

System Call Table

1 de 12

http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html

Linux System Call Table


The following table lists the system calls for the Linux 2.2 kernel. It could also be thought of as an API for the interface between
user space and kernel space. My motivation for making this table was to make programming in assembly language easier when
using only system calls and not the C library (for more information on this topic, go to http://www.linuxassembly.org). On the left
are the numbers of the system calls. This number will be put in register %eax. On the right of the table are the types of values to
be put into the remaining registers before calling the software interrupt 'int 0x80'. After each syscall, an integer is returned in
%eax.
For convenience, the kernel source le where each system call is located is linked to in the column labelled "Source". In order to
use the hyperlinks, you must rst copy this page to your own machine because the links take you directly to the source code on
your system. You must have the kernel source installed (or linked from) under '/usr/src/linux' for this to work.
%eax

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

System Call Table

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

System Call Table

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

System Call Table

4 de 12

http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html

135

sys_sysfs

fs/super.c

int

136

sys_personality

kernel/exec_domain.c unsigned long

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

System Call Table

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.

System Call Numbers


For the numbers of the syscalls, look in arch/i386/kernel/entry.S for sys_call_table. The syscall numbers are osets into that
table. Several spots in the table are occupied by the syscall sys_ni_syscall. This is a placeholder that either replaces an obsolete
syscall or reserves a spot for future syscalls.
Incidentally, the system calls are called from the function system_call in the same le; in particular, they are called with the
assembly instruction 'call *SYMBOL_NAME(sys_call_table)(,%eax,4)'. The part '*SYMBOL_NAME(sys_call_table)' just gets
replaced by a symbol name in sys_call_table. SYMBOL_NAME is a macro dened in include/linux/linkage.h, and it just
replaces itself with its argument.

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

include/asm/posix_types.h:typedef unsigned short __kernel_dev_t;


include/linux/types.h:typedef __kernel_dev_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

Вам также может понравиться