Page 1 sur 1
Des Dollars... $$
Publié : ven. 06/mars/2009 1:36
par Anonyme
Dans ce code nasm , j'ai l'opération entre la postion d'un label et des dollars $$ , quel valeur ont les dollars ?
Merci
Publié : ven. 06/mars/2009 11:08
par djes
$$ donne l'adresse de la ligne. Ca sert à faire un calcul relatif, là tu auras par exemple l'offset (la distance) entre le label et ta ligne.
Publié : ven. 06/mars/2009 11:59
par Anonyme
D'accord , l'adresse , par rapport au début du fichier ? donc fixe ?
ou est ce une commande du processeur qui renvois une adresse virtuelle ?
Merci.
Publié : ven. 06/mars/2009 13:13
par flaith
l'adresse est indiquée par rapport à l'endroit de ton "dd", c'est nasm qui fait le calcul de la différence.
Publié : ven. 06/mars/2009 13:47
par Anonyme
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
Quand je compile ca , et que je regarde la valeur de
dd segments_table - $$ ; Segments table offset in file
j'obtiens 52 , c'est effectivement la position de la segments_table en byte
dans le fichier , mais
C'est une soustraction d'adresse ? ou juste "je veut l'adresse de segments_table" ?
Publié : ven. 06/mars/2009 14:54
par djes
D'après le manuel de fasm (j'avais dit des bêtises) :
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.
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.
Publié : ven. 06/mars/2009 15:12
par Anonyme
Dans ce cas je ne comprends pas la soustraction :/
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:
En faisant le calcul
segments_table: il se trouve au 52 octets , et si je suis ce que tu me dis , $$ vaut 32 là ou il est mis
donc 52 - 32 = 20 , or j'ai 52 d'inscrit dans mon fichier :/
les dollars me trouble
ou alors , n'est pas un "tag" un peu comme le ? en pure qui permet d'avoir l'adresse d'un label ?
code pb
code nasm :
Publié : ven. 06/mars/2009 15:21
par djes
Non, en assembleur tu n'as pas besoin de ? pour savoir la pos d'un label, tout est label

Le $$ (deux $$) indique la position de début du segment (c'est à dire le début du code); donc si ton segment commence à 0, $$=0 ; comme segments_table est à la position 52, l'opération segments_table - $$ donne 52 - 0 = 52