Witam,
w komentarzu na początku poniższego programu opisane jest co ma on robić. Problem leży we fragmencie który oznaczyłem //!!!blad!!!...//!!!koniec!!!, ma on zostawić w edx substringa, zamiast tego serwuje "Naruszenie ochrony pamięci (zrzut pamięci)". Proszę o pomoc.
//Napisac program pobierajacy z linii zlecen dwa argumenty x i y tak, aby na ekranie
//terminala po jego uruchomieniu wypisane zostalo po sobie x ostatnich slów z lancucha
//y (slowa sa to ciagi znaków alfanumerycznych oddzielonych od siebie dowolna liczba spacji).
//Np. w przypadku gdy x = ”7”, a y = ”ax ab” efektem dzialania programu powinno byc: ababababababab
.intel_syntax noprefix
.global main
.text
main:
push ebp;
mov ebp, esp;
mov eax, [ebp+12]
mov ebx, [eax+4]
push ebx
call atoi
add esp, 4
// zapamietujemy na stosie pobrane z linii zlecen "n"
push eax
mov eax, [ebp+12]
mov ebx, [eax+8]; //napis(arg2)
push ebx
call strlen
mov ecx, eax; // dlugosc stringa
add esp, 4
push 32; //spacja
push ebx
call strrchr
add esp, 8
sub eax, ebx; //indeks ostatniej spacji
inc eax; //indeks poczatku substring-a
sub ecx, eax; // dlugosc substring-a
//!!!blad!!!
push ecx
add ebx, eax
push ebx
push edx
call strncpy
add esp, 12
//!!!koniec!!!
pop ebx; //liczba(arg1)
dec ebx
loop:
// drugi argument printf-a
push edx
// pierwszy argument printf-a
mov ecx, offset komunikat
push ecx
call printf
add esp, 12
dec ebx
jnz loop
mov eax, 0 ; // return 0
mov esp, ebp
pop ebp;
// leave;
ret
.data
komunikat:
.asciz "%s\n"