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
我使用的是 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