2010-07-10 89 views
4

这些说明有什么区别?以ARM9处理器为例,它不应该是:装配? LD&MOV

ASM: mov r0, 0 
C: r0 = 0; 

ASM: ld r0, 0 
C: r0 = 0; 

我不知道为什么要使用一个或其它:S

回答

8

它必须是:

ASM: mov r0, 0 
C: r0 = 0; 

ASM: ld r0, 0 
C: r0 = *(pc + 0); 

退房this参考卡,如果你正在为ARM上ASM发展必须具备的。

+0

哦所以用ld我得到了一个内存地址的内容......谢谢! – Puyover 2010-07-10 14:35:18

4

一般负载指令被用来从存储器(直接或间接)的数据加载到寄存器中,而移动指令“动作”(拷贝)数据从一个操作数的寄存器。在ARM情况下,源操作数是一个值(常量)或寄存器(在复制到目标寄存器之前,两者都可以移位/旋转)。

所以第一个(mov r0, #0?),设置为0的寄存器r0;第二个(ldr的伪操作)应该加载PC指向的数据(r15)加上偏移量0,所以相当于r0 = *(pc + 0)

+1

谢谢。我会更新我的答案。 – 2010-07-10 14:47:19

1

它是否被称为MOV或LD取决于特定的汇编语言。例如,Z80汇编语言对所有内容都使用LD,包括在寄存器之间进行赋值以及将立即值赋值给寄存器。

一般而言,您应该始终使用您正在使用的特定汇编语言来查找记忆法的含义。

+1

那么,实际上与ARM有两个指令,他们是非常不同的。 MOV将立即值(来自另一个寄存器,或者操作码中编码的值)加载到寄存器中 - 无内存访问。使用LDR时,寄存器将从内存中加载。我同意你最后一句话100%。 – Dan 2010-07-11 15:21:02

+0

我同意。装配的细节是它依赖于结构。每个架构可能拥有/拥有自己的机器代码命令/细节的原因。 – 2010-07-14 17:04:22