Cześć Wam
Chciałem z ciekawości zaimplementować sobie wydajnego quick sorta w asmie. Stwierdziłem, że będę zarządzał stosem bezpośrednio podczas przekazywania argumentów do funkcji zamiast używać instrukcji push
i rejestrów służących do zarządzania argumentami właśnie typu rdi, rsi, rdx, rcx
. No i pierwsze co to trzeba wydrukować jakiś tekst na standardowe wyjście. Okazało się, że bezpośrednie zarządzanie stosem przy architekturze x86-64
jest dość specyficzne być może i nie działa poprawnie.
Zobaczcie:
global main
extern printf
section .text
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov dword [rbp-16], type_size
call printf
leave
ret
section .rodata
type_size db "Type the size of an array: ", 0
Coś takiego generuje segmentation fault
. Test z kodem na 32 bitową architekturę:
global main
extern printf
section .text
main:
push ebp
mov ebp, esp
sub esp, 16
mov dword [ebp-16], type_size
call printf
leave
ret
section .rodata
type_size db "Type the size of an array: ", 0
Generuje poprawny wynik. Oto kompilacja i linkowanie, które przeprowadziłem dla architektury 64 bitowej:
nasm -f elf64 q_sort.asm
gcc q_sort.o -Wall -Wextra -o q_sort
A to dla architektury 32 bitowej:
nasm -f elf32 q_sort.asm
gcc q_sort.o -Wall -Wextra -m32 -o q_sort
Assembler to NASM. Czy ktoś ma pomysł skąd takie wyniki i dlaczego? O_o