Endereço de memória no ASM
Pergunta
Estou aprendendo ASM e aqui está um dos meus (muitos) problemas: gostaria de alterar o valor de algum índice de uma matriz. Vamos dizer isso:
- %EAX contém meu novo valor
- O topo da pilha (ou seja (0)%ESP) contém o índice da matriz
- -4 (%EBP) contém o endereço da matriz.
eu tentei movl %eax, (-4(%ebp),0(%esp),4)
mas não funcionou. Pior, lança um erro de sintaxe: bobi.s: 15: erro: lixo `(%EBP), 0 (%esp), 4) 'após a expressão
Qual é a sintaxe correta?
Solução
Não há instrução única para fazer isso na montagem x86. Você precisa encontrar um registro disponível, use -o para armazenar o endereço da matriz de que você obtém -4(%ebp)
, encontre outro registro para manter o índice 0(%esp)
, e só então se torna possível acessar a célula em que você está interessado (e em mais assemblies do tipo RISC, você ainda precisará adicionar esses dois registros antes de poder fazer o acesso à memória).
Supondo que os registros estejam disponíveis, algo como:
movl -4(%ebp), %ebx
movl 0(%esp), %ecx
movl %eax, 0(%ebx,%ecx,4)
Deveria trabalhar.