Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 臂-装载和存储装配说明_C_Assembly_Arm - Fatal编程技术网

C 臂-装载和存储装配说明

C 臂-装载和存储装配说明,c,assembly,arm,C,Assembly,Arm,我正在尝试从两个不同的arm寄存器加载和存储数据 int testing[64*1024] __attribute__ ((aligned (8192))); __asm__("MOV r0, %0" :: "r" (testing) : "r0"); __asm__("STR R5,[R0];"); 在我最初的尝试中,我试图将寄存器r0指向的一些数据存储到寄存器r5。绝对没有编译问题,但无法访问寄存器中的数据。 负载的情况也是如此 LDR R1,[R0] (gdb) info reg

我正在尝试从两个不同的
arm
寄存器
加载
存储
数据

int testing[64*1024]  __attribute__ ((aligned (8192)));
__asm__("MOV r0, %0" :: "r" (testing) : "r0");
__asm__("STR R5,[R0];");
在我最初的尝试中,我试图将寄存器
r0
指向的一些数据存储到寄存器
r5
。绝对没有编译问题,但无法访问寄存器中的数据。

负载
的情况也是如此

LDR R1,[R0]



(gdb) info registers
r0             0xb6000  745472
r1             0x1      1
r2             0x0      0
r3             0xb6000  745472
r4             0x8961   35169
r5             0x0      0
r6             0x0      0
r7             0xbeba9664       3199899236
r8             0x0      0
r9             0xefb9   61369
r10            0xf02d   61485
r11            0x0      0
r12            0x0      0
sp             0xbeba9664       0xbeba9664
lr             0x89cb   35275
pc             0xeace   0xeace <test48+14>
cpsr           0x60000030       1610612784
(gdb) bt
#0  0x0000eace in test48 ()
#1  0x000089ca in main ()
(gdb) x/x $r5
0x0:    Cannot access memory at address 0x0
(gdb) x/x $r0
0xb6000 <testing>: 0x00000000
LDR R1[R0]
(gdb)信息寄存器
r0 0xb6000 745472
r1 0x1 1
r2 0x0 0
r3 0xb6000 745472
r4 0x8961 35169
r5 0x0 0
r6 0x0 0
r7 0xbeba9664 3199899236
r8 0x0 0
r9 0xefb9 61369
r10 0xf02d 61485
r11 0x0 0
r12 0x0 0
sp 0xbeba9664 0xbeba9664
lr 0x89cb 35275
pc 0xeace 0xeace
cpsr 0x60000031610612784
(gdb)英国电信
#测试中的0 0x0000eace 48()
#1 0x000089ca在主管道中()
(gdb)x/x$r5
0x0:无法访问地址0x0处的内存
(gdb)x/x$r0
0xb6000:0x00000000
本质上,我正在尝试使用ldr和str实现一些内存内联寻址

我在树立自己的榜样时,得到了向导的帮助


知道我哪里出错了吗

您的评论和代码不匹配:

在我最初的尝试中,我试图将寄存器r0指向的一些数据存储到寄存器r5[…]
uuu asm_uuuu(“STR R5,[R0];”)

您编写的指令将
R5
的值存储到
R0
指向的内存位置。寄存器
R5
不指向任何内存位置-在您的示例中,其值为
0x00

\uu asm\uuu
语句不声明以任何方式使用的
R5
寄存器,因此编译器可以自由地在其中放入任何临时值或变量。这也解释了:

(gdb) x/x $r5
0x0:    Cannot access memory at address 0x0

您的gdb命令尝试访问
R5
指向的内存位置,但它不指向任何位置。

您的注释和代码不匹配:

在我最初的尝试中,我试图将寄存器r0指向的一些数据存储到寄存器r5[…]
uuu asm_uuuu(“STR R5,[R0];”)

您编写的指令将
R5
的值存储到
R0
指向的内存位置。寄存器
R5
不指向任何内存位置-在您的示例中,其值为
0x00

\uu asm\uuu
语句不声明以任何方式使用的
R5
寄存器,因此编译器可以自由地在其中放入任何临时值或变量。这也解释了:

(gdb) x/x $r5
0x0:    Cannot access memory at address 0x0

您的gdb命令尝试访问
R5
指向的内存位置,但它不指向任何位置。

我建议使用单个内联汇编块,并通知编译器您修改的所有寄存器(被删除的寄存器)。我只是尝试了这么做。没有变化。我仍然无法访问寄存器。我建议使用一个内联汇编块,并将您修改的所有寄存器(被删除的寄存器)通知编译器。我只是尝试过这样做。没有变化。我仍然无法访问寄存器。但我使用的是
AT&T
语法,即CMD DEST,SRC对于STR指令,语法是STR SRC,[DEST],正如您在问题中引用的指南中所解释的那样。抱歉。at&t只与x86有关,与arm完全无关。arm语法在arm体系结构参考手册中有描述,可从infocenter.arm.com免费下载。store指令是wierd指令,它不遵循其他指令的dest=src格式,它使用了Joe指出的ldr类型语法str src,[dest](ldr src,[dest])如果你想进行arm组装,你真的应该有一本arm体系结构参考手册,我推荐最古老的一本,它可能与armv5或ARMV6相关,但我使用的是
AT&T
语法,即CMD DEST,SRC对于STR指令,语法是STR SRC,[DEST],正如你在问题中引用的指南中所解释的那样。抱歉。at&t只与x86有关,与arm完全无关。arm语法在arm体系结构参考手册中有描述,可从infocenter.arm.com免费下载。store指令是wierd指令,它不遵循其他指令的dest=src格式,它使用ldr类型语法,正如Joe所指出的str src,[dest](ldr src,[dest]),如果你想进行arm组装,你真的应该有一本arm体系结构参考手册,我推荐最古老的可能与armv5或armv6相关