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
Cela ressemble à un opérateur de déréférencement de pointeur. – mustaccio
Lorsque vous avez assemblé une instruction avec et une sans et examiné le code de la machine, qu'avez-vous trouvé? –
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) –