Significado de (% eax) em AT & T sintaxe?
-
06-07-2019 - |
Pergunta
Você vai ter que me desculpar, eu sou novo para x86 montagem e montagem em geral.
Então, minha pergunta é, eu tenho algo como:
addl %edx,(%eax)
% eax é um registro que contém um ponteiro para algum inteiro. Vamos chamam xp
Isso significa que ele está dizendo: *xp = *xp + %edx
? (%edx
é um número inteiro)
Eu só estou confuso onde addl irá armazenar o resultado. Se %eax
é um ponteiro para um int, então (%eax)
deve ser o valor real do que int. Então, seria addl
armazenar o resultado de %edx+(%eax)
em *xp
? Eu realmente gostaria de alguém para explicar isso para mim!
Eu realmente aprecio qualquer ajuda!
Solução
Sim, esta instrução está fazendo exatamente o que você pensa que está fazendo.
A maioria x86 instruções aritméticas usam dois operandos: uma origem e um destino. Na AT & T sintaxe (usado aqui), o destino é sempre o operando direito. Assim, com uma instrução como:
addl %edx, %eax
os valores em edx
e eax
são somados e o resultado é armazenado em eax
. No entanto, no seu exemplo, (%eax)
é um operando de memória; Isso é o que parênteses média na sintaxe AT & T (como quadrados suportes na sintaxe NASM).
Isto significa que eax
é tratada como um apontador, de modo a operando direito é retirado do endereço apontado por eax
, e o resultado é armazenado para o mesmo endereço.