Confusión acerca de ADR en ARM (código de ensamblaje)

0

Estoy confundido sobre lo que está pasando con ADR R14,cnt1 . ¿ cnt1 significa el final del programa? Y si es así, ¿cómo se llamará a B sumi ? En el manual de ARM, decía que ADR toma PC pero no lo veo aquí.

c ++:

s = 0;
for(i=1;i<=n;i++)
   s += i;

montaje:

sumi: 
MOV R0,#0 
MOV R1,#1

next:
CMP R1,R2 
BGT end
ADD R0,R0,R1 
ADD R1,R1,#1 
B next

end: MOV PC,R14
ADR R14,cnt1
B sumi 
cnt1: ; ...
    
pregunta stumped

1 respuesta

1

Al comienzo del programa, la pseudo-instrucción ADR R14, cnt1 de ARM carga una dirección ( cnt1 - final de esta parte del programa) en un registro ( R14 ). En la práctica, ADR se reemplaza por una instrucción ADD o SUB que involucra el contenido de la PC ( R15 ). El cálculo se basa en el desplazamiento entre la PC y la dirección en cuestión, teniendo en cuenta que el desplazamiento de la PC se debe a la operación de la tubería ARM. Es más fácil dejar que el ensamblador calcule las direcciones por ti. Si se cambia el código, las direcciones también, pero ADR se encargarán de esto cuando se vuelvan a ensamblar.

La instrucción B sumi es solo un salto incondicional a la dirección dada por sumi (inicio de la subrutina).

Al final del ciclo, se ejecuta la instrucción MOV PC,R14 , lo que hace que la PC se cargue con el contenido (una dirección) del registro R14 . Recuerde que esta última fue modificada previamente por la instrucción ADR . Entonces el programa continúa saltando a la dirección dada por la etiqueta cnt1 .

Cuando se programan las subrutinas en ensamblaje, generalmente se emplea una combinación de las instrucciones de salto B y BL ; esta última (rama y enlace) ya almacena la dirección de retorno en R14 (LR - registro de enlace).

    
respondido por el Dirceu Rodrigues Jr

Lea otras preguntas en las etiquetas