2015-12-18 5 views
3

Я просто пытаюсь загрузить значение myarray[0] в eax:ошибки сегментации при присвоении значения массива в EAX (AT & T синтаксис)

 .text 
     .data 

     # define an array of 3 words 
array_words:  .word 1, 2, 3 

     .globl main 

main: 
     # assign array_words[0] to eax 
     mov $0, %edi 
     lea array_words(,%edi,4), %eax 

Но когда я запускаю это, я получаю ошибку сегм. Не мог бы кто-нибудь указать, что я сделал не так?

+0

Является ли 'lea' последней инструкцией в вашем коде? Значит, есть ли вышеприведенный фрагмент всего, что у вас есть? –

ответ

3

Кажется, что метка main находится в разделе .data.

Это должно привести к ошибке сегментации, если система не позволяет выполнять коды в разделе .data.

Программный код должен быть в секции .text.

+0

Это решило мою проблему! Никогда бы не подумал, что такая вещь может вызвать «seg fault» ... на мой взгляд, seg fault обычно указывает, что у меня есть какая-то неинтегрированная переменная где-то –

+0

@OneTwoThree: память раздела данных отображается с чтением/записью, но не выполнить разрешение. Таким образом, код запуска C runtime вызывает segfault, когда он запускает команду 'call main '. Дополнительный бит разрешения для страниц памяти - это функция безопасности («NX»). –

2

Вам необходимо правильно завершить свою программу, например. на Linux x86_64, позвонив в sys_exit системного вызова:

... 
main: 
    # assign array_words[0] to eax 
    mov $0, %edi 
    lea array_words(,%edi,4), %eax 

    mov $60, %rax  # System-call "sys_exit" 
    mov $0, %rdi  # exit code 0 
    syscall 

В противном случае выполнение программы продолжается с содержимым памяти после последней инструкции, которые, скорее всего, во всех случаях недопустимых инструкции (или даже недействительные ячейки памяти).