Assembly 如何在汇编语言中找到给定值的最大值和变量的地址?
我正在学习ARMv7,问题是如何实现这段代码:Assembly 如何在汇编语言中找到给定值的最大值和变量的地址?,assembly,arm,max,memory-address,Assembly,Arm,Max,Memory Address,我正在学习ARMv7,问题是如何实现这段代码: shvar = max(shvar, x) 变量x的值是R2,shvar的地址是R1。我的问题是,shvar本质上是一个指针吗?我需要去引用它,也就是获取它在内存中指向的值 我是这样做的: LDR R3, [R1] ... 旁注:我的导师说再次从记忆中读取R3中已有的值是不好的,我想知道他是否指的是这个 unsigned int max ( unsigned int, unsigned int ); unsigned int test (
shvar = max(shvar, x)
变量x的值是R2,shvar的地址是R1。我的问题是,shvar本质上是一个指针吗?我需要去引用它,也就是获取它在内存中指向的值
我是这样做的:
LDR R3, [R1]
...
旁注:我的导师说再次从记忆中读取R3中已有的值是不好的,我想知道他是否指的是这个
unsigned int max ( unsigned int, unsigned int );
unsigned int test ( void )
{
return(max(4,5)+1);
}
00000000 <test>:
0: e92d4010 push {r4, lr}
4: e3a01005 mov r1, #5
8: e3a00004 mov r0, #4
c: ebfffffe bl 0 <max>
10: e2800001 add r0, r0, #1
14: e8bd8010 pop {r4, pc}
但是在你的函数返回之前,无论你使用r3做什么,你都会想回到返回或者函数的任何功能中。因此,如果您想传递一个地址来表示基准,您可以这样做
unsigned int test ( unsigned int timerregaddress, unsigned int numloops );
你可以这样做
ldr r2,[r0] @ read timer
loop:
@ code under test
subs r1,r1,#1
bne loop
ldr r3,[r0] @ read timer
sub r0,r3,r2 @ compute difference in time
bx lr
如果被测试的代码没有很好地使用这些寄存器中的任何一个,几乎所有您使用的寄存器都需要在函数的开头和结尾被推送和弹出,那么r2和r3将是中间变量的自然选择
我怀疑该注释与您没有显示的代码有关,您可能重新使用了r3,丢失了您在加载时存储的内容
a = x + y;
a = 37 + z;
虽然编译器可能会生成第一行,但第二行会销毁变量a中的内容,与此相同
mov r3,#5
ldr r3,[r1]
因此,您需要查看所有代码,而不是您发送给我们的那一行。这里没有足够的信息,但是如果您有一个指向内存变量的指针,并且希望使用该变量的值,则可以通过指针加载它。一旦你加载了它,你就有了一个副本,你可以用它来比较或者其他任何东西。您不需要加载它两次,因此,如果您已经有了一个副本,则无需再创建另一个副本,除非它有可能发生更改(例如,您所做的更改)。在C中,变量名称会自动取消引用以获取内存中的值,但int arr[]={…}等数组变量除外。在asm中,符号名只是地址;你必须注意从他们那里装货。
unsigned int test ( unsigned int timerregaddress, unsigned int numloops );
ldr r2,[r0] @ read timer
loop:
@ code under test
subs r1,r1,#1
bne loop
ldr r3,[r0] @ read timer
sub r0,r3,r2 @ compute difference in time
bx lr
a = x + y;
a = 37 + z;
mov r3,#5
ldr r3,[r1]