Inline ASM ve VS - Jumptable – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Inline ASM ve VS - Jumptable – Assembler – Fórum – Programujte.comInline ASM ve VS - Jumptable – Assembler – Fórum – Programujte.com

 

MilanL+1
Grafoman
17. 7. 2017   #1
-
0
-

 Ahoj, potřeboval bych poradit jak ve Visual studiu v ASM vytvořit skokovou tabulku pro rozsáhlé case sekvenčně po hodnoty 0-100+, vím že tím zdrojový soubor celkem naroste, ale ve výsledku by to mělo být efektivnější a hlavně rychlejší než case. Jedná se o kontrolu  multiplayeru zda zadaný typ munice odpovídá druhu zbraně.

__asm
	{
		PUSH EAX
		PUSH ECX
		MOV result, 1
		MOV EAX, DruhID
		CMP EAX, 120
		JA  W_END
		MOV ECX, TypID
		JMP[JTable + EAX * 4]

	JTable:
		dw  W_END, W1, W_END, W3, W4, W5, W6, W7, W8, W9, W10, W11, W12, W_END, W_END, W15, W16, W17, W18, W19 //....

		//W0:
	W1:
		CMP ECX, 32
		JE  W_FALSE
		JMP W_END
		//W2:
	W3:		
		CMP ECX, 23
		JE	W_FALSE
		CMP ECX, 84
		JE  W_FALSE
		JMP W_END
	W4:
		CMP ECX, 64
		JE  W_FALSE
                JMP W_END
...
        W_FALSE:
                MOV return, 0
	W_END:

Vahazuje mi to rerror C2400: inline assembler syntax error in 'opcode'; found 'W_END' na tom řádku pod JTABLE:
Nemůžu přijít na chybu  jediný co mě napadá je bud chybné umístění nebo jestli to není třeba zadávat na samostatné řádky nebo s nějakým extra znakem. at jsem hledal co jsme hledal jendiný co jsem našel bylo něco jako
 .long  W_END      s každým labelem na samostatné řádce.

nebo třeba ještě nějaká direktiva, umístění na začátku/konci celého kodu, nebo označení oblasti jako

.data

Nahlásit jako SPAM
IP: 185.112.167.–
gna
~ Anonymní uživatel
1891 příspěvků
18. 7. 2017   #2
-
0
-

V inline assembleru ve VC nejde použít DW a spol.

Nebude to rychlejší, klidně to napiš v céčku.

Nahlásit jako SPAM
IP: 213.211.51.–
KIIV
~ Moderátor
+43
God of flame
18. 7. 2017   #3
-
0
-

Jeste muzes pouvazovat i o poli (nebo mape) funkcnich objektu nebo tak. Hlavne si over nejakym profilerem, jestli je neco rychlejsi nebo ne.

Nahlásit jako SPAM
IP: 217.196.214.–
Program vždy dělá to co naprogramujete, ne to co chcete...
MilanL+1
Grafoman
18. 7. 2017   #4
-
0
-

#2 gna
dík,

 #3 KIIV

kod mám hotovej, srovnání rychlostí je připravený.

no myslím, že něco by se mělo ušetřit hlavně u ID v horní polovině, pokud vím case skáče od jedné hodnoty k druhé takže min CMP a JNE instrukce navíc (x hodnota ID) proti přímému skoku podle hodnoty ID.

No další 2 varianty co mě dnes napadli jsou:

- v Jumptable: mít skokové instrukce a skákat na ně pomocí jmp near AX (AX=ID x (počet B na 1 jump)

- druhá varianta je C switch - se seřazením zbraní podle používání nejčastejší nahoru (z analýzy používání)

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Grafoman
18. 7. 2017   #5
-
0
-

další nápad co to v C rozdělit na úseky po 15-20 ID 

if (idZbraně < 20)
 switch idzbraně of
    case 0: .... case 19:
else if (idZbraně < 40)
 switch idzbraně of
    case 20: .... case 39:
else if (idZbraně < 60)
 switch idzbraně of
    case 40: .... case 59:
atd..

ta kontrola ID z prvního úseku by se možná drobátko zpomalila, ale ostatní by se měli zrychlit.
Navíc by ty prováděcí časy, pak měli bejt téměř stejné

Nahlásit jako SPAM
IP: 91.139.9.–
gna
~ Anonymní uživatel
1891 příspěvků
19. 7. 2017   #6
-
0
-

Dělení intervalu i jump table překladač umí a podle efektivity použije. MSC je špičkový překladač a všechno, co tě napadne, už hodně chytří lidé řešili před tebou :)

Dneska jde hlavně o předvídatelnost a paralelizovatelnost kódu a data v cache. Bez toho jsou dnešní rychlé procesory ve skutečnosti trapně pomalé. Takže algoritmy a struktury. Tady nic moc nevymyslíš.

Nahlásit jako SPAM
IP: 213.211.51.–
MilanL+1
Grafoman
19. 7. 2017   #7
-
0
-

#6 gna
no kvůli kompatiblitě je to dělané v hodně staré verzi VS6.
 

Jinak včera jsme to udělali a rozdělení Ify na úseky po 15 zrychlilo původní kod ve smyčce s 1.000.000 provedení o cca 10ms +-2ms

Nahlásit jako SPAM
IP: 91.139.9.–
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, 88 hostů

Podobná vlákna

Asm v C++ — založil Sir_E

Inline — založil Alyx_Vance

Podminka v ASM — založil Mutagen

Asm 8086: OUT DX,AX — založil Mircosoft

 

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