Volanie funkcie z iného súboru v asembleri – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Volanie funkcie z iného súboru v asembleri – Assembler – Fórum – Programujte.comVolanie funkcie z iného súboru v asembleri – Assembler – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Kent0
Stálý člen
15. 3. 2016   #1
-
0
-

Ahojte,

mám súbor písaný v jazyku C, ktorý obsahuje funkciu:
 

void set_Assertion(int BID, int ID) {
	printf("ID: %d BID: %d\n",ID,BID);
	return;
}

ďalej mám asemblerovský kód, z ktorého časť je: 

_main:	
LFB9:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	andl	$-16, %esp
	movl	$200032, %eax
	call	___chkstk_ms
	subl	%eax, %esp
	call	___main
	movl	$0, 200028(%esp)
	jmp	L9
L10:
	call	_rand
	movl	%eax, %ecx
	movl	$351843721, %edx
	movl	%ecx, %eax
	imull	%edx
	sarl	$12, %edx
	movl	%ecx, %eax
	sarl	$31, %eax
	subl	%eax, %edx
	movl	%edx, %eax
	imull	$50000, %eax, %eax
	subl	%eax, %ecx
	movl	%ecx, %eax
	movl	200028(%esp), %edx
	movl	%eax, 28(%esp,%edx,4)
	addl	$1, 200028(%esp)
L9:
	movl 	$6, ID
	movl 	$4, BID
	pushl 	ID
	pushl 	BID
	call	_set_Assertion
	popl 	BID
	popl 	ID
	cmpl	$49999, 200028(%esp)
	jle	L10
	movl	$50000, 8(%esp)
	movl	$0, 4(%esp)
	leal	28(%esp), %eax
	movl	%eax, (%esp)
	call	_quicksort
	nop
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc

pričom inštrukcie za návestím L9
 

movl 	$6, ID
	movl 	$4, BID
	pushl 	ID
	pushl 	BID
	call	_set_Assertion
	popl 	BID
	popl 	ID

som pridal do programu manuálne.
ásledne tieto dva súbory zlinkujem a spustím ale pri zavolaní funkcie call _set_Assertion sa spustí nekonečný cyklus a vypisuje stále tie isté hodnoty dookola. Vedeli by ste mi poradiť? Myslím si ,že tam bude problém niekde s registrami, že je možné, že niektoré prepíšem len akosi sa mi nedarí na to prísť
Skúšal som si pomocou pusha uložiť všetky základné registre do stacku a potom ich pomocou popa vytiahnuť ale nepomohlo to. Skúšal som aj prerušenie pomocou int $0x80 ale ani to mi nepomohlo.

Za každú radu budem vďačný. 
 

Nahlásit jako SPAM
IP: 147.175.176.–
Kent0
Stálý člen
17. 3. 2016   #2
-
0
-

nakoniec som ten problém vyriešil ale pribudol mi ďalší
keď beriem do úvahy príklad hore a zavolám externú funkciu(upravenú):
 

void set_Assertion(int BID, int ID) {
	if(ID != BID) {
		//chcem aby sa cely program ukoncil
	}
	return;
}

ako dosiahnem ten cieľ aby som z tej funkcie vedel ukončiť celé vykonávanie programu? 

Nahlásit jako SPAM
IP: 147.175.176.–
KIIV
~ Moderátor
+43
God of flame
17. 3. 2016   #3
-
0
-
Nahlásit jako SPAM
IP: 212.47.3.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kent0
Stálý člen
17. 3. 2016   #4
-
0
-

#3 KIIV

 exit mi nefungoval myslel som si, že to pôjde inak a až teraz som si uvedomil, že som tam zabudol include stdlib .. ďakujem 

Nahlásit jako SPAM
IP: 147.175.176.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 178 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý