Des Dollars... $$

Pour discuter de l'assembleur
Anonyme

Des Dollars... $$

Message par Anonyme »

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
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message 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.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

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

Message 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

Code : Tout sélectionner

segments_table - $$
C'est une soustraction d'adresse ? ou juste "je veut l'adresse de segments_table" ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message 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 :D

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 : Tout sélectionner

label:
  Addressedulabel = ?label


code nasm :

Code : Tout sélectionner

dd label - $$
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message 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
Répondre