2014-01-14 5 views
0

Для моего вопроса, когда я попытался создать пример NASM в 64-разрядной версии Ubuntu и выполнить его после сборки и соединения в ELF. Это возвращать сообщения об ошибках, как показано ниже, когда я исполняюСегментация Неисправность простого кода ASM

NASM -f elf64 -o firstasm.o firstasm.asm л.д. -o firstasm firstasm.o firstasm

вина Сегментация (основной сбрасывали)

Мой NASM код будет ниже, где я пытался выполнить простую запись() и функция выхода()

section .data ;Data segment 

msg db "This line is test", 0x0a 

section .text ;text segment 
global _start ;Default entry point for ELF linking 

_start: 

; SYSCALL : write (1,msg,14) 
xor rax,rax 
xor rbx,rbx 
xor rcx,rcx 
xor rdx,rdx 
mov rax,64 ; make a syscall write 4 
mov rbx,1 ; put 1 into rbx and also stdout is 1 
mov rcx,msg ;put address of string in rcx 
mov rdx,19 ; put length of string into rdx 
int 0x80 ; call kernel to made syscall 

; SYSCALL : exit(0) 
xor rax,rax 
xor rbx,rbx 
mov rax,93 ; make a syscall exit 93 
mov rbx, 0 ; store 0 argument into rbx, success to exit 
int 0x80 

Может кто-то указал мне, что проблема в моей NA SM и предложения по устранению проблемы «Ошибка сегментации (сбрасывание ядра)». Благодарим всех, кто может помочь.

ответ

0

Ух, где вы получаете номера системных вызовов? Вы вытаскиваете их из воздуха?

64-битной sys_exit = 60 32bit sys_exit = 1

64-битной sys_write = 1 32bit sys_write = 4

Linux 64-bit System Call List

Linux 32-bit System Call List

Linux System Call Table for x86_64

выше ссылка будет отображаться какие регистры используются для чего.

32-битный системный вызов - int 80 не использует 64-битные регистры, а параметры регистра различны. 64-битный системный вызов - syscall.

32 бит sys_exit:

mov  ebx, ERR_CODE 
mov  eax, sys_exit ; 1 
int  80h 

64 бит sys_exit:

mov  rdi, ERR_CODE 
mov  rax, sys_exit ; 60 
syscall 

увидеть разницу?

, если вы хотите создать файл вкл имен системных вызовов и номера для вашей системы (возможно, они отличаются по некоторым причинам)

grep __NR /usr/include/asm/unistd_64.h | grep define | sed -e 's/\#/\%/' -e 's/__NR_/sys_/' > unistd_64.inc 

конечно, настроить путь к unistd_64.h для вашего система. Это будет то же самое для 32 бит, но файл называется unistd_32.h Я считаю.

Теперь, когда я показал вам разницу между вызовом sys exit и предоставленными ссылками, вы можете исправить ваш системный вызов, чтобы быть правильным.

+0

Спасибо Gunner за помощь, но я обнаружил, что «syscall» не работает на 64-битном компьютере (x86_64) ubuntu. Можете ли вы указать мне, как использовать его? – user1884888

+0

Что означает «Не работает»? Покажите, как настроить параметры и использовать 'syscall' – Gunner

Смежные вопросы