[Assembler] użycie funkcji strncpy

0

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"


0
Chory Szczur napisał(a):

ale źeś kurcze g**no je,bane wyt,łumaczył.

Strncpy kopiuje N znaków z src do dst.

strncpy(dst, src, N)

Z twojego opisu g**no wynika co ma się dziać.

   push ecx; // N
    add ebx, eax; // skopiowac chcę N znaków stringa z ebx, zaczynając od eax indeksu
    push ebx
    push edx; // w edx chcę otrzymać substringa
    call strncpy
    add esp, 12
0

Okej, program robi co miał robić, wrzucam kod gdyby ktoś miał podobny problem. Temat do zamknięcia.

//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]
	cmp dword ptr [ebp +8], 3
	jne end
	mov ebx, [eax+4]

	push ebx
	call atoi
	add esp, 4

	// zapamietujemy na stosie pobrane z linii zlecen "n"
	push eax
	cmp eax, 1
	jl end

	mov eax, [ebp+12]
	mov ebx, [eax+8]; //napis(arg2)

	push 32; //spacja
	push ebx
	call strrchr
	add esp, 8
	cmp eax, 0x00
	je oneWord

	sub eax, ebx; //indeks ostatniej spacji
	inc eax; //indeks poczatku substring-a
	
	add ebx, eax
	
	pop cx; //liczba(arg1)	

	loop:
		push cx
		// drugi argument printf-a
		push ebx	

		// pierwszy argument printf-a
		mov eax, offset komunikat
		push eax	

		call printf
		add esp, 8

		pop cx
		dec cx
	jnz loop

	jmp end

	oneWord:
	pop cx; //liczba(arg1)	
	loop2:
		push cx
		// drugi argument printf-a
		push ebx	

		// pierwszy argument printf-a
		mov eax, offset jednoSlowo
		push eax	

		call printf
		add esp, 8

		pop cx
		dec cx
	jnz loop2

	end:
	mov eax, offset nowaLinia
	push eax
	call printf
	add esp, 4
	
	mov eax, 0 ; // return 0
	
	mov esp, ebp
	pop ebp;
//	leave;

	ret

.data

komunikat:
.asciz "%s"
nowaLinia:
.asciz "\n"
jednoSlowo:
.asciz "%s"


1 użytkowników online, w tym zalogowanych: 0, gości: 1