Estou tentando localizar uma exceção em algum código assembly ARM existente anteriormente. A linha em questão é:
ldr x0, [x21, x19, lsl #3]
O resultado da equação acima é x0
um endereço de memória inválido, que o código subsequente tenta usar.
Eu sei que ele lsl
está realizando um deslocamento para a esquerda 3, mas não tenho certeza no que ele está realmente realizando o deslocamento. Eu não vi valores à esquerda de uma mudança antes. Uma mudança normalmente é o valor a ser mudado, até que ponto e em que direção. Se a linha acima estiver usando x21 e x19, como eles estão sendo usados no turno? Um dos registradores tem os 32 bits inferiores e o outro os 32 bits superiores?
x19
atualmente é 0x0
x21
é atualmente um valor maior que 0x0
Não posso alterar a linha acima, mas posso alterar os valores de x19 e x21. Qualquer ajuda na interpretação disso seria apreciada.
Rastreei o código assembly, encontrei os valores de todos os registros e pesquisei na internet como decodificar a linha em questão
Não tenho certeza do que você quer dizer com equação de montagem, então não está claro o que está no lado direito disso.
Se a instrução fosse armazenar (que se refere a estar no lado esquerdo de
=
C, como ema[i]=v
), o modo de endereçamento estaria na mesma posição em assembly, como emstr x0, [x21, x19, lsl #3]
.Se a pergunta for sobre o segundo registro,
x19
esse é um índice que é deslocado, enquanto a basex21
não.Acho que você terá melhores resultados de pesquisa usando o termo modo de endereçamento em vez de equação de montagem. Veja aqui , por exemplo.
ARM de 64 bits possui vários modos de endereçamento indexados.
Em
ldr x0, [x21, x19, lsl #3]
, espera-se que o primeiro registro do modo de endereçamento,,x21
contenha um ponteiro de 64 bits. O segundo registro no modo de endereçamento,x19
contém um índice. Aqui é um índice de 64 bits e também é escalonado em 8, por meio dolsl #3
, antes de ser adicionado ao valor (não escalonado) do primeiro registro, para formar o endereço final de acesso à memória.O uso mais simples desta instrução seria o seguinte:
Portanto, o tipo de
a
é array ou ponteiro para long int (64 bits). A linguagem C será dimensionada automaticamentei
em 8, então não vemos isso quando a escrevemos em C, embora o código de máquina deva fazer isso.Nesse caso
v=a[i]
, o endereço base da matriz,a
está emx21
, e o índicei
está emx19
, enquantov
estáx0
.Entre outras coisas, o processador também pode tratar o registro de indexação como int de 32 bits assinado ou não assinado em vez de longo, o que é bom para código C que escolhe ser de
int
32 bits.