NASM e Syscall

download NASM e Syscall

of 27

Transcript of NASM e Syscall

  • 7/26/2019 NASM e Syscall

    1/27

    Sintaxe NASM e Syscalls do linux

    Cacio jose gazola

    28 de Julho de 2012

  • 7/26/2019 NASM e Syscall

    2/27

    Conteudo

    1 Introducao 31.1 exemplo de chamada . . . . . . . . . . . . . . . . . . . . . . . . . 4

    2 Motivos e objetivos desta traducao 5

    3 Traducao do Capitulo 3 (The NASM Language) 63.1 Layout da linha de codigo do NASM . . . . . . . . . . . . . . . . 63.2 PSEUDO-INSTRUCOES . . . . . . . . . . . . . . . . . . . . . . 8

    3.2.1 DB e Afins: Declarando dados Inicializados . . . . . . . . . 83.2.2 RESB e afins: Declarando dados nao incializados . . . . . . 83.2.3 INCBIN: Incluindo Arquivos Binarios Externos . . . . . . 83.2.4 EQU: Definindo Constantes . . . . . . . . . . . . . . . . . . 93.2.5 TIMES: Repetindo Instrucoes ou Dados . . . . . . . . . . . 9

    3.3 Endereco Efetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . 103.4 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    3.4.1 Constantes numericas . . . . . . . . . . . . . . . . . . . . 113.4.2 Strings de caracteres . . . . . . . . . . . . . . . . . . . . . 123.4.3 Constantes de Caracteres . . . . . . . . . . . . . . . . . . 123.4.4 Constantes de String . . . . . . . . . . . . . . . . . . . . . 133.4.5 Strings Unicode . . . . . . . . . . . . . . . . . . . . . . . . 133.4.6 Constantes de ponto flutuante (Floating-Point) . . . . . . 14

    3.4.7 Constantes Packed BCD . . . . . . . . . . . . . . . . . . . 153.5 Expressoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    3.5.1 |: Operador OR bit a bit . . . . . . . . . . . . . . . . . . 163.5.2 : Operador XOR bit a bit . . . . . . . . . . . . . . . . . 163.5.3 & : Operador AND bit a bit . . . . . . . . . . . . . . . . 163.5.4 e : Operadores de rotacao de bit . . . . . . . . . . . 163.5.5 + e : Operadores de adicao e subtracao . . . . . . . . . 163.5.6 *, /, //, % e %%: Multiplicacao e Divisao . . . . . . . . . 163.5.7 Operadores Unitarios: +, , , ! e SEG . . . . . . . . . . 17

    3.6 SEGe WRT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173.7 STRICT: Inibindo Otimizacao . . . . . . . . . . . . . . . . . . . . 18

    1

  • 7/26/2019 NASM e Syscall

    3/27

    3.8 Expressoes Criticas . . . . . . . . . . . . . . . . . . . . . . . . . . 18

    3.9 Rotulos Locais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    4 Lista de Chamadas do sistema 21

    2

  • 7/26/2019 NASM e Syscall

    4/27

    1Introducao

    Apresento neste trabalho a traducao para portugues do Brasil do capitulo

    3 (The NASM Language) do manual NASM The Netwide Assemblerversao 2.09.10. E tambem a compilacao de material encontrado na web, emdezenas de sites, sobre as syscalls do Linux.

    As syscall do linux sao similares asinterrupcoes de softwaredo DOS e BIOS.Neles as interrupcoes mais usadas sao: 0x21, 0x25, do DOS, e 0x10, 0x16, daBIOS.

    Ja no linux todas as syscall sao chamadas pela interrupcao 0x80. A va-

    lor carregado em eax define qual das chamadas do sistema sera usada, e osargumentos sao dados em ebx, ecx, edx, esi, edi, sucessivamente, ate cinco argu-mentos. Caso mais argumentos sejam necessarios, um ponteiro para a estruturacom todos eles e passada em ebx, com todos os argumentos arranjados suces-sivamente na memoria. Apos cada chamada um inteiro e dado em eax, comovalor de retorno.

    O conhecimento das chamadas pode ser obtido lendo as fontes do kernele tambem por meio de sites e exemplos disponveis, mas sao todas as funcoesbasicas do sistema, que sao explorados por bibliotecas como a GLIBC, que imple-menta uma serie de funcoes e padroes usados por varios programas. Em algumasdistros e possvel encontrar uma lista das syscalls em /usr/includes/sys/syscall.h.

    No Linux a tabela das system call e definida dentro do arquivoarch/i386/kernel/entry.Sou similar. Por exemplo no Slackware 13.37 e possi-vel encontrar em /usr/src/linux/arch/x86/kernel os arquivos entry 32.S e en-try 64.S.

    Uma lista tambem pode ser obtida com o comando: man syscalls.

    3

  • 7/26/2019 NASM e Syscall

    5/27

    1.1 exemplo de chamada

    neste exemplo usamos as chamadas sys write(eax = 4) que le uma cadeia decaracteres, cujo ponteiro esta em ecx e o comprimento total da cadeia em edx,e imprime na saida padrao (ebx = 1); e a sys exit(eax = 1) que encerra oprograma.

    movl len,edx ; comprimento da cadeia

    movl msg,ecx ; endereco da cadeia

    movl 0x01,ebx ; saida

    movl 0x04,eax ; chamada sys_write

    int 0x80

    movl 0x00,ebx ; para a sys_exit ebx deve ser zero

    movl 0x01,eax ; chamada sys_exit

    int 0x80.data

    msg:

    .ascii "Oi MUNDO finalmente VIVO!!!\\n"

    len = . - msg

    Este pequeno programa devera exibir na tela a frase: Oi MUNDO final-mente VIVO!!!.

    A descricao de cada chamada do sistema pode ser obtida no manual atravesdo 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 writedeve ser referida apenas como write. Assimo comando deve ser:

    man 2 write

    A lista de syscalls pode ser obtida, tambem no manual, pelo comando:

    man syscalls.

    4

  • 7/26/2019 NASM e Syscall

    6/27

    2Motivos e objetivos desta traducao

    As opcoes da linha de comando do NASM podem ser obtidas atraves doman, o que nos deixa duvidas apenas sobre a sintaxe da linguagem usada

    pelo NASM.

    Por isso me abstive que traduzir os capitulos referentes a instalacao e opcoesde execucao do NASM.

    Fiz uma traducao adaptada, pois algumas vezes e impossvel traduzir umasentenca literalmente.

    5

  • 7/26/2019 NASM e Syscall

    7/27

    3Traducao do Capitulo 3 (The NASM Language)

    Seguea traducao adaptada do capitulo 3 no manual do NASM vers ao 2.09.10.

    3.1 Layout da linha de codigo do NASM

    Como muitos assemblers, cada linha de codigo do NASM contem (sem ser umamacro, uma diretiva do preprocessador ou uma direta do assembler: veja oscapitulo 4 e 61) qualquer combinacao de quatro campos:

    rotulo: instruc~ao operandos ; comentario

    Como e usual, muitos destes campos sao opcionais; a presenca ou ausenciade qualquer combinacao de um rotulo, uma instrucao e um comentario e per-mitido. Obviamente, o campo operando e requerido ou proibido pela presencae natureza da instrucao.

    NASM usa a barra invertida (\) como caractere de continuacao de linha;se a linha termina com a barra invertida, a proxima linha e considerada comosendo da linha anterior.

    NASM nao impoem retricoes quanto a espacos em branco na linha: podemhaver espacos em branco antes dos rotulos, ou nao ter espacos em branco antesdas instrucoes. Os dois pontos depois de um rotulo tambem e opcional. (Note

    que se voce quiser digitar lodsbsozinho em uma linha, e digitar lodabpor aci-dente, sera considerado uma linha de codigo valida mas nao contera um rotulo.Executar o NASM como a opcao --w+orphan--labels provocara um aviso sevoce definir um rotulo sozinho em uma linha sem os dois pontos).

    Caracteres validos nos rotulos sao letras, numeros, _, $, #, @, , ., and ?.Os unicos caracteses permitidos para serem usados comoprimeiro caractere deum identificador sao letras, . (mais detalhes: veja secao 3.9), _ e ?. Um iden-tificador tambem pode ser prefixado com um $ para indicar que deve ser lido

    1capitulos do manual, nao apresentados aqui.

    6

  • 7/26/2019 NASM e Syscall

    8/27

    como um identificador e nao como uma palavra reservada; assim, se em algum

    outro modulo voce esta linkando com um simbolo chamado eax, voce pode sereferir a $eax no codigo do NASM para distinguir o simbolo do registro. Ocomprimento maximo de um identificador e 4095 caracteces.

    O campo instrucao pode conter qualquer instrucao de maquina: instrucoesPentium e P6, instrucoes FPU, instrucoes MMX e ate mesmo instrucoes naodocumentadas sao suportadas. A instrucao pode ser prefixada com LOCK, REP,REPE/REPZ ou REPNE/REPNZ, no modo usual. Sao providos os prefixos paraaddress-size e operand-sizeexplicitos para A16, A32, A64, O16 e O32, O64 um exemplo do uso deles e dado no capitulo. Voce tambem pode usar o nomedo 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 se-gunda sintaxe, desde que e consistente como a sintaxe da linguagem, mas para

    instrucoes comoLODSB, as quais nao tem operandos e ainda podem requerer umsegment override, uma sintaxe nao clara pode processar com es lodsb.

    Uma instrucao nao requer o uso de prefixo: prefixos como CS, A32, LOCKou REPE podem aparecer em uma linha por si mesmos, e o NASM apenas iragerar os bytes do prefixo.

    Em adicao as instrucoes de maquina atuais, o NASM tambem suporta algu-mas pseudo-instrucoes, descritas na secao 3.2.

    O operando da instrucao pode ter inumeros formatos: ele pode ser regis-tros, descritos simplismente pelo nome do regsitro (exemplo ax, bp, ebx, cr0:

    NASM nao usa o estilo de sintaxe do gas na qual o nome do registro deve serprefixado com um sinal %), ou ele pode ser um endereco efetivo (veja secao 3.3),constantes (secao 3.4) ou expressoes (secao 3.5).

    Para instrucoes de ponto flutuante x872, o NASM aceita uma ampla gamade sintaxes: voce pode usar formas de two-operand como as suportadas peloMASM, ou voce pode usar a forma single-operand nativa do NASM em muitoscasos. Por exemplo, voce pode codificar:

    fadd st1 ; this sets st0 := st0 + st1

    fadd st0,st1 ; so does this

    fadd st1,st0 ; this sets st1 := st1 + st0

    fadd to st1 ; so does this

    Quase todas intrucoes de ponto flutuante x87 que fazem referencia a memoriadevem usar um do prefixos DWORD, QWORDou TWORDpara indicar o tamanho damemoria que o operando se refere.

    2instrucoes do co-processador matematico

    7

  • 7/26/2019 NASM e Syscall

    9/27

    3.2 PSEUDO-INSTRUCOES

    Pseudo-instrucoes sao coisas que, embora nao sejam instrucoes reais x86, saoutilizados no campo instrucao p orque esse e o lugar mais conveniente para co-loca-los. As atuais pseudo-instrucoes sao DB, DW, DD, DQ, DT, DO e DY; suascontrapartes nao 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, DOeDYsao usados, assim como no MASM, para declarardados inicializados no arquivo de sada. Eles podem ser invocados com umaampla gama de meios:

    db 0x55 ; just the byte 0x55

    db 0x55,0x56,0x57 ; three bytes in succession

    db a,0x55 ; character constants are OK

    db hello,13,10,$ ; so are string constants

    dw 0x1234 ; 0x34 0x12

    dw a ; 0x61 0x00 (its just a number)

    dw ab ; 0x61 0x62 (character constant)

    dw abc ; 0x61 0x62 0x63 0x00 (string)

    dd 0x12345678 ; 0x78 0x56 0x34 0x12

    dd 1.234567e20 ; floating-point constant

    dq 0x123456789abcdef0 ; eight byte constant

    dq 1.234567e20 ; double-precision float

    dt 1.234567e20 ; extended-precision float

    DT, DOe DYnao aceitam constantes numericas como operandos.

    3.2.2 RESB e afins: Declarando dados nao incializados

    RESB, RESW, RESD, RESQ, REST, RESOe RESYsao projetados para serem usa-dos na secao BSS de um modulo: eles declaram espaco de armazenamento naoinicializado. Cada um leva um unico operando, que e o numero de bytes, pa-lavras, doublewords ou o que quer reservar. Como afirmado na secao 2.2.7,NASM nao suporta a sintaxe padrao do MASM / TASM de reserva de espaconao inicializado escrito como DW ? ou coisas semelhantes. O operando de umapseudo-instrucao do tipo RESB e uma expressao crtica: veja secao 3.8.

    Por exemplo:

    buffer: resb 64 ; reserve 64 bytes

    wordvar: resw 1 ; reserve a word

    realarray resq 10 ; array of ten reals

    ymmval: resy 1 ; one YMM register

    3.2.3 INCBIN: Incluindo Arquivos Binarios Externos

    INCBIN e emprestada do antigo Amiga assembler DevPac: inclui um arquivobinario na ntegra na sada arquivo. Isto pode ser util para (por exemplo),

    8

  • 7/26/2019 NASM e Syscall

    10/27

    incluir graficos e dados de som diretamente em um arquivo executavel de jogo.

    Ele pode ser chamado de tres maneiras:incbin "file.dat" ; include the whole file

    incbin "file.dat",1024 ; skip the first 1024 bytes

    incbin "file.dat",1024,512 ; skip the first 1024, and

    ; actually include at most 512

    INCBIN e tanto uma directiva como uma macro padrao, as pesquisas padraode versao da macro em arquivo no include file search pathadiciona o arquivopara 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 rotulodado o valor do seu (unico) operando. Essa definicao e absoluta, e nao pode seralterado depois. Assim, por exemplo,

    message db hello, world

    msglen equ $-message

    define msglencomo sendo a constante 12. msglen nao pode ser redefinidadepois. Essa nao e uma definicao para o preprocessador: o valor de msglen eavaliado, usando o valor de $ (veja a secao 3.5 para uma explicacao do $) nolocal da definicao, ao inves de ser avaliado onde ele e referenciado, e usando ovalor de $ no ponto de referencia.

    3.2.5 TIMES: Repetindo Instrucoes ou Dados

    O prefixo TIMES forca a montagem da instrucao multiplas vezes. Esta partedo NASM tem sintaxe equivalente ao DUP suportado pelos assembler MASM-compatible, onde voce pode codificar

    zerobuf: times 64 db 0

    our coisas similares; mas TIMES e mais versatil que o DUP. O argumento doTIMES nao precisa ser apenas uma constante numerica, pode ser umaexpressaonumerica, asim voce pode fazer coisas como

    buffer: db hello, world

    times 64-$+buffer db

    que ira armazenar exatamente enough spaces to make the total length ofbuffer up to 64. Finalmente, TIMES pode ser aplicado em instrucoes ordina-rias, assim voce pode criar codigo trivial sem usarloopscomo em:

    times 100 movsb

    Note que nao ha nenhuma diferenca efetiva entretimes 100 resb 1e resb100, exceto que o ultimo sera montado 100 vezes mais rapido por ser parte daextrutura interna do assembler.

    9

  • 7/26/2019 NASM e Syscall

    11/27

    3.3 Endereco Efetivo

    Um endereco efetivo e qualquer operando em uma instrucao que faca referenciaa memoria. Enderecos Efetivos, no NASM, tem uma sintaxe muito simples:eles consistem de uma expressao que calcule e endereco desejado, fechada emcolchetes. Por exemplo:

    wordvar dw 123

    mov ax,[wordvar]

    mov ax,[wordvar+1]

    mov ax,[es:wordvar+bx]

    Qualquer coisa em nao conformidade com este simples sistema nao e uma re-ferencia valida a memoria no NASM, por exemplo es:wordvar[bx].

    Enderecos efetivos mais complicados, como os que envolvem mais que umregistro, trabalha exatamente do mesmo modo:

    mov eax,[ebx*2+ecx+offset]

    mov ax,[bp+di+8]

    NASM e capaz de fazer algebra nos enderecos efetivos, assim como coisasque nao parecemnecessariamente legais, estao perfeitamente certas:

    mov eax,[ebx*5] ; assembles as [ebx*4+ebx]

    mov eax,[label1*2-label2] ; ie [label1+(label1-label2)]

    Algumas formas de endereco efetivo tem mais de uma maneira de ser mon-

    tado; em muitos casos o NASM gerara a menor forma que puder. Por exemplo,essas sao formas distintas de montar endrecos efetivos para 32-bit [eax*2+0][eax+eax], e o NASM gerara generalmente a ultima com base em que a estaforma 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 for-mato particular com o uso das palavras-chave BYTE, WORD, DWORDe NOSPLIT.Se voce precisa que [eax+3] seja montado usando um campo offset double-wordao 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 umdeslocamento de um byte para um valor pequeno que nao deve ser notado naprimeira 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 umadouble-wordzero de offset. A forma normal, [eax], sera codificada sem campode offset.

    A forma discrita nos paragrafos anteriores tambem e util se voce tentar aces-sar dados em um segmento de 32-bit a partir de um codigo 16 bite. Para maisinformacoes veja a secao mixed-size addressing (secao 10.2). Em particular, se

    10

  • 7/26/2019 NASM e Syscall

    12/27

    voce precisa acessar dados com um deslocamento conhecido que e maior que um

    valor de 16-bit, se voce nao especificar que e um deslocamentodword, o nasmcausara a perda da high word do deslocamento.

    Similarmente, o NASM fatiara[eax*2]em [eax+eax]por que isso permiteeleminar o campo de deslocamento e economizar espaco; de fato, isso tambemfatiara [eax*2+offset] em [eax+eax+offset]. Voce pode impedir este com-portamento com o uso de NOSPLIT: [nosplit eax*2]forcara [eax*2+0]a sergerado literalmente.

    No modo 64-bit, NASM gerara por padrao enderecos absolutos. A palavra-chave REL produzira enderecos RIP-relative. Como esse comportamento efrequentemente desejado, veja o DEFAULT directive (secao 6.2). A palavra-chave ABSsobrescreve a REL.

    3.4 Constantes

    NASM entende quatro tipo diferentes de constantes: numericas, caracteres,stringe ponto flutuante (floating-point).

    3.4.1 Constantes numericas

    Uma constante numerica e simplesmente um numero. NASM permite que voceespecifique numeros em um variedade de bases numericas, em uma variedade deformas: voce pode usar o sufixo HouX,DouT,QouO, e BouYpara hexadecimal,

    decimal, octal e binario respectivamente, ou pde preficar 0x, para hexadecimalno estilo do C, ou pode prefixar $ para hexadecimal no estilo do Borland Pascalou Motorola Assemblers. Note que, ainda que o prefixo $ tem funcao duplacomo um prefixo de identificadores (veja secao 3.1), assim um numero hex pre-fixado com um $ deve ter um digito apos o $ ao inves de uma letra. Em adicao,a versao atual do NASM aceita o prefixo 0h para hexadecimal, 0d ou 0t paradecimal, 0o ou 0qpara octal, e 0b ou 0y para binario. Por favor note que di-ferente do C, um prefixo0por si mesmo nao implica em uma constante em octal!

    Constantes Numericas pode ter underscores ( ) intercalados para separarstrings longas.

    Alguns exemplos (todos produzindo exatamente o mesmo codigo):mov ax,200 ; decimal

    mov ax,0200 ; still decimal

    mov ax,0200d ; explicitly decimal

    mov ax,0d200 ; also decimal

    mov ax,0c8h ; hex

    mov ax,$0c8 ; hex again: the 0 is required

    mov ax,0xc8 ; hex yet again

    mov ax,0hc8 ; still hex

    mov ax,310q ; octal

    mov ax,310o ; octal again

    11

  • 7/26/2019 NASM e Syscall

    13/27

    mov ax,0o310 ; octal yet again

    mov ax,0q310 ; octal yet againmov ax,11001000b ; binary

    mov ax,1100_1000b ; same binary constant

    mov ax,1100_1000y ; same binary constant once more

    mov ax,0b1100_1000 ; same binary constant yet again

    mov ax,0y1100_1000 ; same binary constant yet again

    3.4.2 Strings de caracteres

    Uma String de caracteres consiste em ate oito caracteres fechados ou em aspassimples (...), aspas duplas (...) ou backquotes(...). Aspas duplas e simplessao equivalentes no NASM (exceto, claro, que fechar uma constante com aspassimples permite usar aspas duplas dentro da marcacao e vice versa); o conteudo

    e representado literalmente. Strings fechadas em backquotessuportam o estiloC \-escapes para caracteres especiais.

    As seguinte escape sequenceque sao reconhecidas por strings backquoted:

    \ single quote ()

    \" double quote (")

    \ backquote ()

    \\ backslash (\)

    \? question mark (?)

    \a BEL (ASCII 7)

    \b BS (ASCII 8)

    \t TAB (ASCII 9)

    \n LF (ASCII 10)

    \v VT (ASCII 11)

    \f FF (ASCII 12)

    \r CR (ASCII 13)

    \e ESC (ASCII 27)

    \377 Up to 3 octal digits - literal byte

    \xFF Up to 2 hexadecimal digits - literal byte

    \u1234 4 hexadecimal digits - Unicode character

    \U12345678 8 hexadecimal digits - Unicode character

    Todas as outras escape sequences sao reservadas. Note que \0, significa umcaractere NULO (ASCII 0), e um caso especial de escape sequence octal.

    Caracteres Unicode especificados com \uou \Usao convertidos para UTF-8.Por exemplo, as linhas a seguir sao todas equivantes:

    db \u263a ; UTF-8 smiley face

    db \xe2\x98\xba ; UTF-8 smiley face

    db 0E2h, 098h, 0BAh ; UTF-8 smiley face

    3.4.3 Constantes de Caracteres

    Uma constente de caracteres consiste em um string de ate oito bytes, usada nocontexto de uma expresao. E tratada como se fosse um inteiro. Uma constente

    12

  • 7/26/2019 NASM e Syscall

    14/27

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

    little-endian: se voce codificarmov eax,abcd

    entao a constante gerada nao sera 0x61626364, mas 0x64636261, assim sevoce fosse, em seguida ao armazenamento do valor na memoria, lerabcdao invesde dcba. Este e tambem o sentido das constantes de caracteres compreendidapela instrucao Pentium CPUID.

    3.4.4 Constantes de String

    Constantes de String sao strings de caracteres usadas no contexto de algumaspseudo-instrucoes, como as da familia DB e a INCBIN (onde representa o nomede um arquivo.) Elas podem ser usadas em certas diretivas do preprocessador.

    Uma constante de string se parece com uma constente de caractere, s o quemaior. Ela e tratada como uma concatenacao de constentes de caractere detamanho maximo. Assim sao equivalente:

    db hello ; string constant

    db h,e,l,l,o ; equivalent character constants

    E a seguir, tambem sao equivalentes:

    dd ninechars ; doubleword string constant

    dd nine,char,s ; becomes three doublewords

    db ninechars,0,0,0 ; and really looks like this

    Observe que, quando usado no contexto que aceita strings, strings fechadascom aspas sao tratados como constantes de strings mesmo que sejam curtos osuficiente para ser uma constante de caracteres, porque senao db ab teria omesmo efeito quedb a, o que seria bobagem. Da mesma forma, constantes detres ou quatro caracteres sao tratados como strings quando elas forem operandosde 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) UTF-16 ou UTF-32, respectivamente.

    Por exemplo:

    %define u(x) __utf16__(x)

    %define w(x) __utf32__(x)

    dw u(C:\WINDOWS), 0 ; Pathname in UTF-16

    dd w(A + B = \u206a), 0 ; String in UTF-32

    utf16 e utf32 pode ser aplicado ou para passar strings com instrucoesda familia DB, ou em expressoes no contexto de constantes de caractere.

    13

  • 7/26/2019 NASM e Syscall

    15/27

    3.4.6 Constantes de ponto flutuante (Floating-Point)

    Constantes de ponto flutuante sao aceitas apenas como argumentos para DB,DW, DD, DQ, DT,eDO, 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,

    entao um perodo, em seguida, opcionalmente mais dgitos, em seguida, opcio-nalmente, umE seguido de um expoente. O perodo e obrigatorio, de modo queo NASM pode distinguir entre dd 1, que declara uma constante inteira, e dd1,0que declara uma constante de ponto flutuante.

    NASM tambem suporta ponto flutuante hexadecimais em estilo C99:0x, di-gitos hexadecimais, periodo, opcionalmente mais digitos hexadecimais, entao

    opcionalmente um P seguido por um expoente binario (nao hexadecimal) emnotacao decimal. Como uma extensao, NASM adicionalmente suporta os prefi-xos0he $ para hexadecimal, assim como ponto flutuante binario e octal, usandoos prefixos 0b ou 0y e 0oou 0q, respectivamente.

    Underscores( ) para quebrar grupos de digitos em constantes de ponto flu-tuante sao permitos.

    Alguns exemplos:

    db -0.2 ;"Quarter precision"

    dw -0.5 ;IEEE 754r/SSE5 half precision

    dd 1.2 ;an easy one

    dd 1.222\_222\_222 ;underscores are permitteddd 0x1p+2 ;1.0x2^2 = 4.0

    dq 0x1p+32 ;1.0x2^32 = 4 294 967 296.0

    dq 1.e10 ;10 000 000 000.0

    dq 1.e+10 ;synonymous with 1.e10

    dq 1.e-10 ;0.000 000 000 1

    dt 3.141592653589793238462 ;pi

    do 1.e+4000 ;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-bitde ponto flutuante, embora nao seja coberto por qualquer padrao formal. Issoas vezes e chamado de minifloat.

    Os operadores especiais sao usados para produzir numeros de ponto flu-tuante em outros contextos. Eles produzem a representacao binaria de umnumero ponto flutuante especfico como um inteiro, e pode usar constantes in-teiras 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 umnumero ponto flutuante de 80-bit, e float128l e float128h produz aparte inferior e superior de 64 bits de um numero ponto flutuante de 128-bit,respectivamente.

    14

  • 7/26/2019 NASM e Syscall

    16/27

    Por exemplo:

    mov rax,__float64__(3.141592653589793238462)

    ... seria atribuir a representacao binaria de pi como um numero de pontoflutuante de 64 bits em RAX. Isto e equivale exatamente a:

    mov rax,0x400921fb54442d18

    NASM nao pode efetuar aritmetica em constantes ponto flutuante durante acompilacao. Isto ocorre porque o NASM foi concebido para ser portatil - emboraele sempre gere codigo para ser executado em processadores x86, o montadorpode rodar em qualquer sistema com um compilador ANSI C. Portanto, o mon-tador nao pode garantir a presenca de uma unidade ponto flutuante capaz de

    lidar com os formatos de numero Intel, e assim que para o NASM fosse capazde fazer aritmetica flutuante teria que incluir o seu proprio conjunto completode rotinas ponto flutuante, o que aumentaria significativamente o tamanho domontador para benefcio muito pequeno.

    As token especiais Infinity , QNaN (ou NaN ) e SNaN podem serusadas para gerar infinitos, quiets Nans e Nans sinalizadas, respectivamente.Sao normalmente utilizados como macros:

    %define Inf __Infinity__

    %define NaN __QNaN__

    dq +1.5, -Inf, NaN ; Double-precision constants

    O pacote de macros padrao %use fpcontem um conjunto de macros conve-nientes. Veja secao 5.3.

    3.4.7 Constantes Packed BCD

    Constantes estilo x87 podem ser usadas no mesmo contexto dos numeros pontoflutuantes de 80-bit. Eles sao sufixados com p ou prefixados com 0p, e podemincluir ate 18 digitos decimais. Como qualquer outra constante numerica, un-derscorespodem ser usados para separar digitos.

    Por exemplo:dt 2_345_678_901_245_678p

    dt -12_345_678_901_245_678p

    dt +0p33

    dt 33p

    3.5 Expressoes

    Expressoes no NASM e similar a sintaxe do C. Expressao sao avaliadas como in-teiros de 64-bit que depois sao a justados para o tamanho apropriado. O NASM

    15

  • 7/26/2019 NASM e Syscall

    17/27

    suporta dois tokens especiais em expressoes, permitindo calculos que envolve

    a posicao atual da montagem: os tokens $ e $$ tokens. $ avalia a posicao demontagem desde o inicio da linha que contem a express ao; assim voce podecodificar loops infinitos usando JMP $. $$avalia do inicio da secao atual; assimvoce pode dizer qual a distancia que voce esta dentro da secao usando ($-$$).

    Os operadores aritmeticos providos pelo NASM sao listados a seguir, estaoincrementados 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 instrucaode 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 operacao XOR bit a bit.

    3.5.3 & : Operador AND bit a bit

    & prove uma operacao AND bit a bit.

    3.5.4 e : Operadores de rotacao de bit

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

    3.5.5 + e : Operadores de adicao e subtracao

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

    3.5.6 *, /, //, % e %%: Multiplicacao e Divisao

    * e o operador de multiplicacao. / e // sao ambos operadores de divisao: / epara divisao 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, nao garante a exatidao de operacoes com o opera-dor de modulo da divisao com sinal.

    Como o caractere % e muito usado por macros do preprocessador, voce deveasegurar que ambos os operadores de modulo com e sem sinal sejam seguidosde um espaco em branco onde quer que eles aparecam.

    16

  • 7/26/2019 NASM e Syscall

    18/27

    3.5.7 Operadores Unitarios: +, , , ! e SEG

    Os operadores de maior prioridade na gramatica de expressoes do NASM saoaqueles que apresentam um unico argumento. operador de negacao, + naofaz nada (provido apenas para ser simetrico com ), computa o complementoum de seu operando, ! e o operador de negacao logica, e SEG prove o enderecodo 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 repartidoem multiplos segmentos, e frequentemente necessario ser capaz de referenciar osegmento em parte do endereco de um simbolo. NASM suporta o operador SEGque executa esta funcao.

    O operador SEG retorna o segmento base preferencialdo simbolo, definidocomo o segmento base relativo ao qual o deslocamento do simbolo se relaciona.Assim o codigo

    mov ax,seg symbol

    mov es,ax

    mov bx,symbol

    carregara ES:BXcom um ponteiro valido para o simbolo symbol.

    As coisas pode ser mais complexas que isso: como segmentos em 16-bit egrupos 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 ax,weird_seg ; weird_seg is a segment base

    mov es,ax

    mov bx,symbol wrt weird_seg

    para carregarES:BXcom um diferente, mas funcionalmente equivalente, pon-teiro para o smbolo symbol.

    NASM suporta chamadas longas (inter-segmento) e jumpspor meio da sin-taxe de chamadasegment:offset, onde ambos segmente offset representamvalores imediatos. Assim para chamar um procedimento distante, voce podecodificar qualquer uma destas

    call (seg procedure):procedure

    call weird_seg:(procedure wrt weird_seg)

    (OS parenteses sao incluidos aqui para dar clareza, para mostrar a intens aoda instrucao acima. Eles nao sao necessarios na pratica.)

    JMPtrabalha de modo identico ao CALL nos exemplos acima.

    Para declarar um ponteiro muito longe para um item de dados em um seg-mento de dados, voce deve codificar

    17

  • 7/26/2019 NASM e Syscall

    19/27

    dw symbol, seg symbol

    NASM nao suporta sinonimo conveniente para esto, mas voce sempre podeinventar um usando uma macro.

    3.7 STRICT: Inibindo Otimizacao

    Quando montar com o otimizador em level 2 ou maior (veja secao 2.1.22), NASMusara os especificadores de tamanho (BYTE, WORD, DWORD, QWORD, TWORD, OWORDou YWORD), mas dara a eles o menor tamanho possvel. A palavra chave STRICTpode ser usada para inibir a otimizacao e forcar um operano em particular aser 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 6668 21 00 00 00.

    Com o otimizador desligado, o mesmo codigo (seis bytes) e gerado indepen-dente do uso da palavra chave STRICT.

    3.8 Expressoes Criticas

    Embora NASM tenha um otimizador multi-pass opcional, existem algumas ex-pressoes que devem ser resolvidas na primeira passagem. Sao as chamadasexpress~oes crticas.

    A primeira passagem e usada para determinar o tamanho total do codigomontado 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 naopode lidar e codigo cujo tamanho depende do valor de um smbolo declaradoapos o codigo em questao. Por exemplo,

    times (label-$) db 0

    label: db Where am I?

    O argumento paraTIME, neste caso, poderia igualmente avaliar nada; NASMvai rejeitar este exemplo, porque nao pode dizer o tamanho da linha TIMES naprimeira vez que a ve. Assim rejeitara com firmeza qualquer codigo poucoparadoxal

    times (label-$+1) db 0

    label: db NOW where am I?

    18

  • 7/26/2019 NASM e Syscall

    20/27

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

    NASM rejeita estes exemplos, por meio do conceito chamado express~aocrtica, que e definido para ser uma expressao cujo valor e necessario sercomputavel na primeira passagem, e que deve, portanto, depender apenas desmbolos definidos previamente. O argumento para o prefixo TIMES e uma ex-pressao crtica.

    3.9 Rotulos Locais

    NASM da tratamento especial aos smbolos que comecam com um ponto. Umrotulo iniciado com um ponto e tratado como um rotulo local, o que significaque ele esta associada com o rotulo nao local anterior. Assim, por exemplo:

    label1 ; some code

    .loop

    ; some more code

    jne .loop

    ret

    label2 ; some code

    .loop

    ; some more code

    jne .loop

    ret

    No fragmento de codigo anterior, cada instrucaoJNE salta para a linha ime-diatamente antes dela, porque as duas definicoes de .loop sao mantidas emseparado, em virtude de que cada uma esta associada com o r otulo nao localanterior.

    Esta forma de manipulacao de rotulo local e emprestada do velho assemblerAmiga DevPac, no entanto, o NASM vai um passo alem, ao permitir o acessoaos rotulos locais de outras partes do codigo. Isto e conseguido por meio dadefinicao de uma etiqueta local em termos da etiqueta nao local anterior: a

    primeira definicao de .loop acima e realmente definida como um smbolo cha-madolabel1.loop, e a segunda definica do smbolo e chamado delabel2.loop.Entao, se voce realmente precisar, voce pode escrever

    label3 ; some more code

    ; and some more

    jmp label1.loop

    As vezes e util - numa macro, por exemplo - ser capaz de definir um rotuloque possa ser referenciado a partir de qualquer lugar, mas que nao interfiracom o mecanismo de rotulo local normal. Esse rotulo nao pode ser nao localporque iria interferir com as definicoes subsequentes de, e referencias locais a,

    19

  • 7/26/2019 NASM e Syscall

    21/27

    rotulos; e nao pode ser local porque a macro que o definiu n ao saberia o nome

    completo do rotulo. NASM, portanto, introduz um terceiro tipo de rotulo, queprovavelmente e util apenas para as definicoes de macro: se um rotulo comecacom o prefixo especial ..@ entao ele nao utiliza o mecanismo de rotulo local.Entao voce pode codificar

    label1: ; um rotulo n~ao local

    .local: ; este e relamente label1.local

    ..@foo: ; este e um simbolo especial

    label2: ; outro rotulo n~ao local

    .local: ; este e realment label2.loop

    jmp ..@foo ; isso pulara para tre linha a cima

    NASM tem a capacidade de definir outros smbolos especiais que comecam comdois pontos seguidos: por exemplo,..starte usado para especificar o ponto deentrada na sada do formato objeto (ver secao 7.4.6),..imagebasee usado paradescobrir o deslocamento de um endereco de base da imagem atual na saida doformato win64 (ver secao 7.6.1). Entao, basta ter em mente que os smboloscomecando com dois pontos seguidos sao especiais.

    20

  • 7/26/2019 NASM e Syscall

    22/27

    4Lista de Chamadas do sistema

    Segueuma lista com as Syscall do kernel linux, com o tipo de dado que deve

    haver em cada registro usado para passar parametro ao sistema.

    21

  • 7/26/2019 NASM e Syscall

    23/27

    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 betweenuser space and kernel space. My motivation for making this table was to make programming in assembly language easier whenusing only system calls and not the C library (for more information on this topic, go to http://www.linuxassembly.org). On the leftare 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 file where each system call is located is linked to in the column labelled "Source". In order touse the hyperlinks, you must first copy this page to your own machine because the links take you directly to the source code onyour 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

    1 sys_exit kernel/exit.c int - - - -

    2 sys_fork arch/i386/kernel/process.c

    struct pt_regs - - - -

    3 sys_read fs/read_write.c unsigned int char * size_t - -

    4 sys_write fs/read_write.c unsigned int const char * size_t - -

    5 sys_open fs/open.c const char * int int - -

    6 sys_close fs/open.c unsigned int - - - -7 sys_waitpid kernel/exit.c pid_t unsigned int * int - -

    8 sys_creat fs/open.c const char * int - - -

    9 sys_link fs/namei.c const char * const char * - - -

    10 sys_unlink fs/namei.c const char * - - - -

    11 sys_execvearch/i386/kernel/process.c

    struct pt_regs - - - -

    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 off_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_ptracearch/i386/kernel/ptrace.c

    long long long long -

    27 sys_alarm kernel/sched.c unsigned int - - - -

    28 sys_fstat fs/stat.c unsigned intstruct__old_kernel_stat*

    - - -

    29 sys_pausearch/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/buffer.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 - - - -

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

    e 12 07/28/2012 02:49 PM

  • 7/26/2019 NASM e Syscall

    24/27

    42 sys_pipearch/i386/kernel/sys_i386.c

    unsigned long * - - - -

    43 sys_times kernel/sys.c struct tms * - - - -

    45 sys_brk mm/mmap.c unsigned long - - - -

    46 sys_setgid kernel/sys.c gid_t - - - -

    47 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 intunsignedlong

    - -

    55 sys_fcntl fs/fcntl.c unsigned int unsigned intunsignedlong

    - -

    57 sys_setpgid kernel/sys.c pid_t pid_t - - -

    59 sys_oldunamearch/i386/kernel/sys_i386.c

    structoldold_utsname *

    - - - -

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

    67 sys_sigactionarch/i386/kernel/signal.c

    intconst structold_sigaction *

    structold_sigaction*

    - -

    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_sigsuspendarch/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_selectarch/i386/kernel/sys_i386.c

    structsel_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/swapfile.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 - -

    90 old_mmap arch/i386/kernel/sys_i386.c

    structmmap_arg_struct*

    - - - -

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

    e 12 07/28/2012 02:49 PM

  • 7/26/2019 NASM e Syscall

    25/27

    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_iopermarch/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 itimerval *structitimerval *

    - -

    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_unamearch/i386/kernel/sys_i386.c

    structold_utsname *

    - - - -

    110 sys_ioplarch/i386/kernel/ioport.c

    unsigned long - - - -

    111 sys_vhangup fs/open.c - - - - -

    112 sys_idlearch/i386/kernel/process.c

    - - - - -

    113 sys_vm86oldarch/i386/kernel/vm86.c

    unsigned longstructvm86plus_struct*

    - - -

    114 sys_wait4 kernel/exit.c pid_t unsigned long * int optionsstructrusage *

    -

    115 sys_swapoff mm/swapfile.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/buffer.c unsigned int - - - -

    119 sys_sigreturnarch/i386/kernel/signal.c

    unsigned long - - - -

    120 sys_clonearch/i386/kernel/process.c

    struct pt_regs - - - -

    121 sys_setdomainname kernel/sys.c char * int - - -

    122 sys_newuname kernel/sys.cstructnew_utsname *

    - - - -

    123 sys_modify_ldt arch/i386/kernel/ldt.c int void *unsignedlong

    - -

    124 sys_adjtimex kernel/time.c struct timex * - - - -

    125 sys_mprotect mm/mprotect.c unsigned long size_tunsignedlong

    - -

    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.cstruct 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_bdflush fs/buffer.c int long - - -

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

    e 12 07/28/2012 02:49 PM

  • 7/26/2019 NASM e Syscall

    26/27

    135 sys_sysfs fs/super.c int unsigned longunsignedlong

    - -

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

    140 sys_llseek fs/read_write.c unsigned int unsigned longunsigned

    long

    loff_t *unsigned

    int141 sys_getdents fs/readdir.c unsigned int void * unsigned int - -

    142 sys_select fs/select.c int fd_set * fd_set * fd_set *structtimeval *

    143 sys_flock fs/locks.c unsigned int unsigned int - - -

    144 sys_msync mm/filemap.c unsigned long size_t int - -

    145 sys_readv fs/read_write.c unsigned longconst structiovec *

    unsignedlong

    - -

    146 sys_writev fs/read_write.c unsigned longconst structiovec *

    unsignedlong

    - -

    147 sys_getsid kernel/sys.c pid_t - - - -

    148 sys_fdatasync fs/buffer.c unsigned int - - - -

    149 sys_sysctl kernel/sysctl.cstruct

    __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_tstructsched_param *

    - - -

    155 sys_sched_getparam kernel/sched.c pid_tstructsched_param *

    - - -

    156 sys_sched_setscheduler kernel/sched.c pid_t intstructsched_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 longunsignedlong

    unsignedlong

    -

    164 sys_setresuid kernel/sys.c uid_t uid_t uid_t - -

    165 sys_getresuid kernel/sys.c uid_t * uid_t * uid_t * - -

    166 sys_vm86arch/i386/kernel/vm86.c

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

    169 sys_nfsservctl fs/filesystems.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 longunsignedlong

    unsignedlong

    unsignedlong

    173 sys_rt_sigreturnarch/i386/kernel/signal.c

    unsigned long - - - -

    174 sys_rt_sigaction kernel/signal.c intconst structsigaction *

    structsigaction *

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

    177 sys_rt_sigtimedwait kernel/signal.c const sigset_t * siginfo_t *const structtimespec *

    size_t -

    178 sys_rt_sigqueueinfo kernel/signal.c int int siginfo_t * - -

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

    e 12 07/28/2012 02:49 PM

  • 7/26/2019 NASM e Syscall

    27/27

    179 sys_rt_sigsuspendarch/i386/kernel/signal.c

    sigset_t * size_t - - -

    180 sys_pread fs/read_write.c unsigned int char * size_t loff_t -

    181 sys_pwrite fs/read_write.c unsigned int const char * size_t loff_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 cap_user_header_tconstcap_user_data_t

    - - -

    186 sys_sigaltstackarch/i386/kernel/signal.c

    const stack_t * stack_t * - - -

    187 sys_sendfile mm/filemap.c int int off_t * size_t -

    190 sys_vforkarch/i386/kernel/process.c

    struct pt_regs - - - -

    Note for sys_ipc(117): this syscall takes six arguments, so it can't fit into the five 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 arraycontaining 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) changesin 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.Sfor sys_call_table. The syscall numbers are offsets into thattable. Several spots in the table are occupied by the syscall sys_ni_syscall. This is a placeholder that either replaces an obsoletesyscall or reserves a spot for future syscalls.

    Incidentally, the system calls are called from the function system_callin the same file; in particular, they are called with theassembly instruction 'call *SYMBOL_NAME(sys_call_table)(,%eax,4)'. The part '*SYMBOL_NAME(sys_call_table)' just getsreplaced by a symbol name in sys_call_table. SYMBOL_NAMEis a macro defined in include/linux/linkage.h, and it justreplaces itself with its argument.

    Typedefs

    Here are the typedef declarations in the prototypes above:

    atomic_t include/asm/atomic.h:#ifdef __SMP__typedef struct { volatile int counter; } atomic_t;#elsetypedef struct { int counter; } atomic_t;#endif

    caddr_t 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 { __u32version; int pid;} *cap_user_header_t;

    cap_user_data_t include/linux/capability.h :typedef struct __user_cap_data_struct { __u32effective; __u32permitted; __u32inheritable;} *cap_user_data_t;

    clock_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#define __FD_SETSIZE 1024#define __NFDBITS (8 * sizeof(unsigned long))#define __FDSET_LONGS (__FD_SETSIZE/__NFDBITS)(==> __FDSET_LONGS == 32)

    typedef struct { unsigned long fds_bits [__FDSET_LONGS];

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