Metin 2 Assembler

05/29/2014 22:22 Matkein#1
Ich will mit Assembler die Item Attribute auslesen, es werden in VS aber Fehler angezeigt:
Code:
std::pair<int,int> GetItemAttribute(DWORD ItemSlot,DWORD AttributeSlot)
{
	int AttributeNmbr;
	int AttributeWert;
	__asm
	{
		PUSH AttributeSlot  //Attribut 1-7
		MOV ECX,DWORD PTR DS:[0x7CE01C]
		PUSH ItemSlot //Slot des items
		CALL GetItemAttributeCall
		MOVSX EAX, WORD PTR SS:[LOCAL.2] //Inlineassembler:  Syntaxfehler in 'Zweiter Operand'; 'constant' gefunden
		MOVZX ECX, BYTE PTR SS:[LOCAL.3+3]//Hier das gleiche
	}
	std::pair <int,int> Tupel (AttributeNmbr,AttributeWert); 
	return Tupel;
}
Ich weis, dass ich den Wert in EAX und ECX einfach mit MOV in meine int variablen schreiben muss, allerdings kommen bei MOVSX und MOVZX die genannten Fehler. Woran liegt das?
05/30/2014 10:30 vwap#2
Du kannst 'LOCAL' nicht einfach so verwenden.
Du musst herausfinden, wofür sie stehen.
05/30/2014 12:47 ​Tension#3
movsx => signed value
movzx => unsigned value

btw. wird in deiner asm funktion nirgendswo ein Wert in AttributeNmbr und AttributeWert verschoben.
Und wie mein vwap schon gesagt hat, kannst du "LOCAL" nicht einfach so verwenden.
05/30/2014 15:41 Matkein#4
Danke, hier der (jetzt) funktionierende Code:

Code:
std::pair<int,int> GetItemAttribute(DWORD ItemSlot,DWORD AttributeSlot)
{
	DWORD GetItemAttributeCall = ADDRESSE;
	int AttributeNmbr;
	int AttributeWert;
	__asm
	{
		MOV ECX,DWORD PTR SS:[ESP+0x0C]
		LEA EDX,[ESP+8]
		PUSH EDX
		MOV EDX,DWORD PTR SS:[ESP+14]
		LEA EAX,[ESP+0B]
		PUSH EAX
		PUSH AttributeSlot
		MOV ECX,DWORD PTR DS:[0x7CE01C]
		PUSH ItemSlot
		CALL GetItemAttributeCall
		MOVSX EAX,WORD PTR SS:[ESP+8]
		MOVZX ECX,BYTE PTR SS:[ESP+7]
		MOV AttributeNmbr,EAX
		MOV AttributeWert,ECX
	}
	std::pair <int,int> Tupel (AttributeWert,AttributeNmbr); 
	return Tupel;
}