Assembly 臂组件-写入存储器-分段故障

Assembly 臂组件-写入存储器-分段故障,assembly,arm,raspberry-pi,Assembly,Arm,Raspberry Pi,使用ARM组件写入内存时出现问题 我使用的是Raspberry Pi(Raspbian)和GNU汇编程序 第一,s: .global main .func main main: ldr r5, =0x10000000 mov r1, #19 str r1, [r5] bx lr 当我运行上述程序时: pi@raspberrypi ~/assembly $ make first as -o first.o first.s gcc -o first first.

使用ARM组件写入内存时出现问题

我使用的是Raspberry Pi(Raspbian)和GNU汇编程序

第一,s:

.global main
.func main

main:
    ldr r5, =0x10000000
    mov r1, #19 
    str r1, [r5]
    bx lr
当我运行上述程序时:

pi@raspberrypi ~/assembly $ make first
as -o first.o first.s
gcc -o first first.o
pi@raspberrypi ~/assembly $ ./first ; echo $? > output.txt
Segmentation fault
如你所见,分割错误。output.txt文件包含值139,据我所知,该值表示分段错误。 内存地址无效吗?
我已经检查了,内存地址似乎正确。

有几种不同的“类型”内存空间。例如,在Windows系统上,存在未提交、保留、只读、可执行等。写入未标记为“保留”的内存部分或未指向有效内存地址的地址将导致seg故障。这是大多数现代系统的关键安全功能。我的猜测是,为了使你的努力取得成功,你需要在写之前保留内存


在程序集中保留内存的最简单方法是创建一个数据段。在许多汇编语言中,数据段是由.data进行的,但我已经很长时间没有使用ARM汇编来验证这一点了。一旦在数据段中保留了一点内存,您就可以很容易地获得“变量”的地址并将其写入,就像您在示例中所做的那样。

如果您在操作系统下运行,您只有一个虚拟地址,无法直接访问物理内存或内存映射设备。您是说我无法写入内存,还是说我的方式不对?无法写入任意物理内存。当然,你可以为你的东西分配内存,然后使用它。例如,您可以执行
.lcomm myint,4
,然后执行
ldr r5,=myint
@Jester,谢谢您的建议。我以前没有用过.lcomm,但我不确定它是否适合我的需要。我真正想做的是将寄存器的内容写入内存,然后从一个单独的C函数读取该内存位置的值。我假设职能部门没有办法知道LCOM已经预订的位置。。。为左转道歉。您有什么建议吗?然后您可以使用
.comm
,并在C代码中声明它
extern int myint
。当然,如果还标记变量
.global
,或者在C代码中定义int并从asm中引用它,则也可以切换到
.data
并使用各种数据定义指令。