Witam,
postanowiłem sobie, że zrobię taką prymitywną implementację funkcji printf w Asemblerze. Napisałem program główny w C a własną implementację printf() w wstawce w NASMie. Oczywiście nic nie działa (no jakże by inaczej). Program jest kompilowany GCC pod Linuksem. Oto i kod źródłowy:
Plik testuj.c
#include <stdio.h>
extern void myPrintF(char * string, unsigned int n);
int main()
{
char msg[20] = {0};
unsigned int dlugosc = 20;
printf("Przykladowe dzialanie wstawki asemblera.\nPodaj napis do wyswietlenia:");
scanf("%19s", msg);
myPrintF(msg, dlugosc);
printf("Po pracy wstawki koncze dzialanie\n");
return 0;
}
a teraz plik Test.asm (ten z funkcją):
;UŻYCIE:
;[EBP + 4] = adres powrotu z funcji (tego nie ruszać)
;[EBP + 8] = wskaźnik na tablicę znaków
;[EBP + 12] = ilość znaków do wypisania
global myPrintF
section .text
myPrintF:
mov ebp,esp
push ebp
mov ecx, [ebp + 12]
mov dword [msgOff], ecx
xor edi, edi
mov esi, 8
kopiowanie:
mov bl, byte [ebp + esi]
mov byte [msg + edi], bl
inc esi
inc edi
loop kopiowanie
wyswietl:
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, [msgOff]
int 80h
koniec:
pop ebp
mov esp, ebp
ret
section .data
msg: times 40 db 0
msgOff equ $ - msg
Chciałem zrobić tak, że funkcja tworzy wewnętrzny bufor na 40 bajtów, i kopiuje z podanego na stosie adresu cały ciąg do wewnętrznego bufora, jednak gdy to wszystko skompiluję i zlinkuje przy pomocy takie pliku Makefile
testuj: test.o testuj.o
gcc test.o testuj.o -o testuj
testuj.o: testuj.c
gcc -c testuj.c -o testuj.o
test.o: test.asm
nasm -f elf test.asm -o test.o
To mam wybitnie nieciekawy wynik w konsoli:
bartek@bartek-laptop:~$ ./testuj
Przykladowe dzialanie wstawki asemblera.
Podaj napis do wyswietlenia:blablabla
Segmentation fault (core dumped)
Kompletnie nie mam zielonego pojęcia co jest błędne, bo jak na moje oko samo kopiowanie danych i ich wyświetlenie w test.asm jest bardzo dobrze napisane i nie widzę żadnych błędów.