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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top