Assembly 如何在汇编语言中找到给定值的最大值和变量的地址?

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 (

我正在学习ARMv7,问题是如何实现这段代码:

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]