ASM x86 - 将值移入内存

ASM x86 - Move value into memory

我使用的是 32 位 Linux 系统,但我不明白如何将值放入内存。 这是一个例子:

str:    .asciz "AAA"
p:    .long 0

.text
.globl  main

main:
    movl $str, p    #Save the address of str into p (?)

我知道我可以 movl $str, %eax 将 str 地址存储在 eax 寄存器中,但我不能用 p 做同样的事情,因为我收到了分段错误。

我也试过这个替代方案,但结果总是分段错误:

main:
call self
self:
    pop %ebp
    movl $str, (p-self) (%ebp)

有人可以向我解释如何以正确的方式使用 mov 吗? 我还想知道是否可以在编译时将 str 地址存储到 p 中。

Can someone explain to me how to use mov in the right way?

这与 mov 无关。没关系。您需要指定一个部分来放入数据。在程序的最前面添加.data,将其放在.data段中。否则,数据默认放入 .text 部分,这在现代操作系统上是只读的。写入它会导致分段错误。

I'd like also to know if it's possible store the str address into p at compile time.

有可能:

p: .long str