Как я написал в комментарии, x86_64 использует другой метод для системных вызовов, чем 32-битный linux.В частности, int $0x80
больше не является способом сделать это (хотя это может оказаться неполной работой, если у вас установлены 32-битные библиотеки ....).Смотрите, например, это предыдущее обсуждение .
Где на 32-битном x86 вы бы сделали:
mov eax, SYSCALL_NUMBER
mov ebx, first_param
mov ecx, second_param
mov edx, third_param
int 0x80
На x86_64 вам нужно сделать следующее:
mov rax, SYSCALL_NUMBER_64 ; This is usually different from the 32-bit version!
mov rdi, first_param
mov rsi, second_param
mov rdx, third_param
syscall
Чтобы напечатать название программы, измените вашЗапрограммируйте следующее, и оно должно работать.Для всех, кто интересуется, как выглядит программная среда при запуске, см. здесь .
section .text
global _start
_start:
mov rax, [rsp+8]
push rax
call strlen
add rsp, 8
mov rdi, 1 ; fd = stdout
mov rsi, [rsp+8] ; buf = addr to string
mov rdx, rax ; count = strlen(string)
mov rax, 1 ; write
syscall
mov rdi, 0 ; status = 0
mov rax, 60 ; exit
syscall
strlen:
mov rax, 0
mov rbx, [rsp+8]
strlen_loop:
cmp byte [rbx+rax], 0
je strlen_end
inc rax
jmp strlen_loop
strlen_end:
ret ; len in rax
Скомпилировано с использованием:
nasm -g -f elf64 -o sc.o sc.asm
gcc -nostartfiles -o sc sc.o