PureBasic

Forums PureBasic
Nous sommes le Ven 24/Mai/2013 11:21

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 8 messages ] 
Auteur Message
 Sujet du message: Des Dollars... $$
MessagePosté: Ven 06/Mar/2009 1:36 
Code:
     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


Haut
  
 
 Sujet du message:
MessagePosté: Ven 06/Mar/2009 11:08 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 3063
Localisation: Arras, France
$$ 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.

_________________
The shooting crew ~> http://www.shootingcrew.com
Bobble Puzzle ~> http://djes.free.fr


Haut
 Profil  
 
 Sujet du message:
MessagePosté: Ven 06/Mar/2009 11:59 
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.


Haut
  
 
 Sujet du message:
MessagePosté: Ven 06/Mar/2009 13:13 
En ligne
Avatar de l’utilisateur

Inscription: Jeu 07/Avr/2005 1:06
Messages: 1393
Localisation: Vietnam-HCMC
l'adresse est indiquée par rapport à l'endroit de ton "dd", c'est nasm qui fait le calcul de la différence.


Haut
 Profil  
 
 Sujet du message:
MessagePosté: Ven 06/Mar/2009 13:47 
Code:
.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

Citation:
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:
segments_table - $$


C'est une soustraction d'adresse ? ou juste "je veut l'adresse de segments_table" ?


Haut
  
 
 Sujet du message:
MessagePosté: Ven 06/Mar/2009 14:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 3063
Localisation: Arras, France
D'après le manuel de fasm (j'avais dit des bêtises) :
Citation:
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.

_________________
The shooting crew ~> http://www.shootingcrew.com
Bobble Puzzle ~> http://djes.free.fr


Haut
 Profil  
 
 Sujet du message:
MessagePosté: Ven 06/Mar/2009 15:12 
Dans ce cas je ne comprends pas la soustraction :/

Code:
.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:
label:
  Addressedulabel = ?label


code nasm :

Code:
dd label - $$


Haut
  
 
 Sujet du message:
MessagePosté: Ven 06/Mar/2009 15:21 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 11/Fév/2005 17:34
Messages: 3063
Localisation: Arras, France
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

_________________
The shooting crew ~> http://www.shootingcrew.com
Bobble Puzzle ~> http://djes.free.fr


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 8 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye