Code : Tout sélectionner
dd phdr - $$
...
...
phdr:
Dans ce code nasm , j'ai l'opération entre la postion d'un label et des dollars $$ , quel valeur ont les dollars ?
Merci
Code : Tout sélectionner
dd phdr - $$
...
...
phdr:
Code : Tout sélectionner
.start
db 0x7F, "ELF" ; ELF signature -- constant
db 1 ; Architecture(1) -- 1 = 32 bits
db 1 ; Data enconding -- 1 = LSB-First
db 1 ; File version -- 1 = v1
db 0,0,0,0,0,0,0,0,0 ; 9 bytes padding -- should be zero
dw 2 ; Type -- 2 = executable
dw 3 ; Architecture(2) -- 3 = i386
dd 1 ; ELF Version -- 1 = ELF-v1
dd _start ; Entry point adress in memory -- virtual adress
dd segments_table - $$ ; Segments table offset in file
dd 0 ; Sections table offset in file -- 0 = none)
dd 0 ; File's flags
dw elf_header.size ; ELF Header's size
dw 32 ; Segments table entries's size
dw 1 ; Number of segment descriptors -- just one (code)
dw 0 ; Sections table entries's size -- 0 = none
dw 0 ; Number of sections descriptor -- 0 = none
dw 0 ; String table index -- 0 = none
.size equ $ - .start
segments_table:
code_segment_descriptor:
.start:
dd 1 ; Type -- 1 = loadable into memory
dd 0 ; Offset in file -- include ELF header and table
dd $$ ; Virtual address in memory
dd 0 ; Physical adress -- 0 = no physical address
dd code_size ; Size in file
dd code_size ; Size in memory
dd 5 ; Permission flags -- 0x4 + 0x1 = read and execute
dd 0x4 ; Alignment in memory (and in file)
.size equ $ - .start
j'obtiens 52 , c'est effectivement la position de la segments_table en bytedd segments_table - $$ ; Segments table offset in file
Code : Tout sélectionner
segments_table - $$
Donc $ (un seul) est l'offset, tandis que $$ donne l'adresse de base de l'espace d'adressage courant. Dans ton exemple, c'est effectivement une soustraction. Au moment de l'assemblage (sûrement en deux passes), le $$ est remplacé par sa valeur réelle (comme une macro), puis la soustraction est faite, et la valeur est stockée.There are also some special symbols that can be used inside the numerical expression. First is $, which is always equal to the value of current offset, while $$ is equal to base address of current addressing space.
The other one is %, which is the number of current repeat in parts of code
that are repeated using some special directives (see 2.2). There's also %t
symbol, which is always equal to the current time stamp.
Code : Tout sélectionner
.start
db 0x7F, "ELF" ; ELF signature -- constant
db 1 ; Architecture(1) -- 1 = 32 bits
db 1 ; Data enconding -- 1 = LSB-First
db 1 ; File version -- 1 = v1
db 0,0,0,0,0,0,0,0,0 ; 9 bytes padding -- should be zero
dw 2 ; Type -- 2 = executable
dw 3 ; Architecture(2) -- 3 = i386
dd 1 ; ELF Version -- 1 = ELF-v1
dd _start ; Entry point adress in memory -- virtual adress
dd segments_table - $$ ; Segments table offset in file
dd 0 ; Sections table offset in file -- 0 = none)
dd 0 ; File's flags
dw elf_header.size ; ELF Header's size
dw 32 ; Segments table entries's size
dw 1 ; Number of segment descriptors -- just one (code)
dw 0 ; Sections table entries's size -- 0 = none
dw 0 ; Number of sections descriptor -- 0 = none
dw 0 ; String table index -- 0 = none
.size equ $ - .start
segments_table:
Code : Tout sélectionner
label:
Addressedulabel = ?label
Code : Tout sélectionner
dd label - $$