почему это дает ошибку сегментации?это должно просто выйти - PullRequest
0 голосов
/ 26 сентября 2010

Я пытаюсь освоить низкоуровневую разработку.Помещая 0 в ebx и 1 в eax (для системного вызова exit ()) и вызывая int 0x80, он должен выйти из программы.У меня есть простая программа на c, которая работает нормально, но когда я вставляю ее, вместо того, чтобы выйти, как ожидалось, я получаю ошибку сегментации.Почему это происходит?

СПАСИБО!

 __asm__ ("xor %ebx, %ebx;"
                 "mov %al, 1;"
                "int $80;"
);

edit: спасибо за совет, все же ничего, кроме ошибок сегмента.Вот изменения, которые я сделал:

  __asm__ ("xor %ebx, %ebx;"
           "xor %eax, %eax;"
                "mov $1, %eax;"
                "int $80;"
);

edit: после изменения этого примера с http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

asm("movl $1,%%eax;         /* SYS_exit is 1 */
             xorl %%ebx,%%ebx;      /* Argument is in ebx, it is 0 */
             int  $0x80"            /* Enter kernel mode */
             );

Это, наконец, сработало для меня:

asm("   movl $1,%eax;
        xorl %ebx,%ebx;
        int  $0x80
"
        );

спасибо за просмотр и предложение советов.

Ответы [ 2 ]

2 голосов
/ 26 сентября 2010

Вы уверены, что остаток eax очищен?Попробуйте переместить 1 в eax, а не просто al или хотя бы сначала очистить его.

__asm__ ("xor %ebx, %ebx;"
         "mov $1, %eax;"
         "int $0x80;"
);

edit: Если AndiDog прав насчет синтаксиса AT & T.

edit: Прошло много времени с тех пор, как я использовал газ, но 80 16 - это $0x80.$80 - это 80 10 .Это должно исправить последнее из этого.

1 голос
/ 26 сентября 2010

Это похоже на синтаксис ассемблера AT & T, поэтому операции выполняются в порядке «источник операции, цель», а не «цель операции, источник» в более распространенном синтаксисе Intel.

Зная это, mov %al, 1;пытается записать содержимое регистра al в ячейку памяти 1. Измените его на mov 1, %al;, и оно должно работать IMO.Обратите внимание, что я никогда не использовал синтаксис AT & T, поэтому я не уверен, правильно ли я его интерпретировал.

Редактировать: И Джефф М прав, номер системного вызова должен храниться в eax зарегистрируйтесь, поэтому убедитесь, что он очищен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...