2017-01-19 2 views
0

J'ai essayé d'apprendre à écrire du code d'assemblage pour le processeur AMD64. J'ai regardé le code généré par gcc. Finalement, j'ai commencé à voir des instructions telles que* devant l'opérande instruction, assemblage GNU, AMD64

call *(%rax) 

Que fait * devant l'opérande? Quelque chose comme ça est apparu dans le document System V ABI que je suis en train de lire, et la réponse à ce qui précède m'aidera à continuer. Voici un exemple de la syntaxe utilisée dans le contexte, extrait du document System V ABI lui-même:

// System V ABI suggested implementation of a 
    // C switch statement with case labels 0, 1, and 2, 
    // and a default label. 

    // Jump to the default case if the control variable is 
    // less than 0. 
     cmpl  $0, %eax 
     jl  .Ldefault 

    // Jump to the default case if the control variable is 
    // greater than 2. 
     cmp $2, %eax 
     jg .Ldefault 

     movabs $.Ltable, %r11 
     jmpq  *(%r11,%eax,8) /* Here is that syntax. */ 

     .section .lrodata,"aLM",@progbits,8 
     .align 8 
    .Ltable: .quad .Lcase0 
      .quad .Ldefault 
      .quad .Lcase2 
      .quad .previous 
    .Ldefault: 
     // Code for default case 
    .Lcase0: 
     // Code for case 0 
    .Lcase1: 
     // Code for case 1 
    .Lcase2: 
     // Code for case 2 
+1

Cela ressemble à un opérateur de déréférencement de pointeur. – mustaccio

+0

Lorsque vous avez assemblé une instruction avec et une sans et examiné le code de la machine, qu'avez-vous trouvé? –

+2

Copie possible de [Qu'est-ce que \ * adresse (trouvée dans printf) signifie dans l'assemblage?] (Http://stackoverflow.com/questions/2559849/what-does-addressfound-in-printf-mean-in-assembly) –

Répondre

4

Dans AT & T syntaxe, un appel saut indirect ou la fonction a son opérande préfixé par un astérisque * pour le distinguer à partir d'un appel direct ou d'un appel de fonction. Le but de ceci est de distinguer un appel à une fonction d'un appel indirect à un pointeur de fonction stocké dans une variable:

call function 
call *function_pointer