2015-10-19 3 views
0

Я использую 32-битную систему Linux, и я не могу понять, как добавить значение в память. Это пример:ASM x86 - Переместить значение в память

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

.text 
.globl main 

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

Я знаю, что я могу сделать movl $str, %eax, чтобы сохранить адрес ул внутри регистра EAX, но я не могу сделать то же самое с p, потому что я получаю ошибку ошибки сегментации.

Я попытался также этой альтернативой, но результат всегда ошибка сегментации:

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

Может кто-нибудь объяснить мне, как использовать mov в правильном направлении? Я также хотел бы знать, возможно ли сохранить адрес str в p во время компиляции.

ответ

0

Может кто-нибудь объяснить мне, как использовать mov в правильном направлении?

Речь идет не о mov. Хорошо. Вам нужно указать раздел для ввода данных. Добавьте .data в начале программы, чтобы поместить его в раздел .data. В противном случае данные помещаются в раздел .text по умолчанию, который доступен только для чтения в современных ОС. Запись на него приводит к ошибке сегментации.

Я хотел бы также узнать, возможно ли сохранить адрес str в p по адресу время компиляции.

Можно:

p: .long str