Macros de l'Easy Code 2 (tots els projectes)


L'Easy Code inclou algunes macros d'utilitat per als diferents assembladors suportats que es poden utilitzar a tots els projectes (visuals i clàssics) simplement marcant l'opció Macros de l'Easy Code a les Propietats del projecte. Els seus noms són acolorits com a paraules reservades de l'Easy Code (vegeu el menú Configuració) i podeu utilitzar-les quan vulgueu al llarg de tot el codi. Aquestes macros, que es troben al fitxer corresponent en funció de la configuració utilitzada, són a la carpeta \EasyCode\Macros i tenen la sintaxi següent:

Color byRed, byGreen, byBlue

Els arguments byRed, byGreen, byBlue han de ser valors de 8 bits (Byte). Torna un color RGB (un valor de 32 bits o COLORREF) al registre Eax.

Exemple:

Color 0AH, 0BH, 0CH

Torna 000C0B0AH al registre Eax


HiByte wValue

L'argument wValue ha de ser un valor de 16 bits (Word). Torna el byte alt (valor de 8 bits o Byte) de wValue al registre Al.

Exemple:

HiByte 0C0AH

Torna 0CH al registre Al


HiWord dwValue

L'argument dwValue ha de ser un valor de 32 bits (DWord). Torna la paraula alta (valor de 16 bits o Word) de dwValue al registre Ax.

Exemple:

HiWord 000C000AH

Torna 000CH al registre Ax


LoByte
wValue

L'argument wValue ha de ser un valor de 16 bits (Word). Torna el byte baix (valor de 8 bits o Byte) de wValue al registre Al.

Exemple:

LoByte 0C0AH

Torna 0AH al registre Al


LoWord dwValue

L'argument dwValue ha de ser un valor de 32 bits (DWord). Torna la paraula baixa (valor de 16 bits o Word) de dwValue al registre Ax.

Exemple:

LoWord 000C000AH

Torna 000AH al registre Ax


HiDWord dqValue (només per a projectes de 64 bits)

L'argument dqValue ha de ser un valor de 64 bits (QWord). Torna la doble paraula alta (valor de 32 bits o DWord) de dqValue al registre Eax.

Exemple:

HiDWord 00FFFFFF000C000AH

Torna 00FFFFFFH al registre Eax


LoDWord dqValue (només per a projectes de 64 bits)

L'argument dqValue ha de ser un valor de 64 bits (QWord). Torna la doble paraula baixa (valor de 32 bits o DWord) de dqValue al registre Eax.

Exemple:

LoDWord 00FFFFFF000C000AH

Torna 000C000AH al registre Eax


MakeWord
byLow, byHigh

Els arguments byLow i byHigh han de ser valors de 8 bits (Byte). Torna el valor resultant de 16 bits (Word) al registre Ax.

Exemple:

MakeWord 0CH, 0AH

Torna 0A0CH al registre Ax


MakeLong wLow, wHigh

Els arguments wLow i wHigh han de ser valors de 16 bits (Word).Torna la doble paraula resultant (DWord) al registre Eax.

Exemple:

MakeLong 0A0BH, 0C0DH

Torna 0C0D0A0BH al registre Eax


MakeQWord dwLow, dwHigh (només per a projectes de 64 bits)

Els arguments dwLow i dwHigh han de ser valors de 32 bits (DWord).Torna el valor de 64 bits resultant (QWord) al registre Rax.

Exemple:

MakeQWord 000C000AH, 00FFFFFFH

Torna 00FFFFFF000C000AH al registre Rax


Move dwValue1, dwValue2 (per a projectes de 32 bits)

Els arguments dwValue1 i dwValue2 han de ser valors de 32 bits (DWord), variables o registres.

Exemple:

Move dwMemPos1, dwMemPos2

Mou el valor de la variable o registre indicat per dwMemPos2 a la variable o registre indicat per dwMemPos1.

Aquesta macro no torna cap valor.


Move dqValue1, dqValue2 (per a projectes de 64 bits)

Els arguments dqValue1 i dqValue2 han de ser valors de 64 bits (QWord), variables o registres.

Exemple:

Move dqMemPos1, dqMemPos2

Mou el valor de la variable o registre indicat per dqMemPos2 a la variable o registre indicat per dqMemPos1.

Aquesta macro no torna cap valor.


Return dwValue (per a projectes de 32 bits)

L'argument dwValue ha de ser un valor de 32 bits (DWord). Carrega el valor dwValue al regsitre Eax i torna d'un procediment.

Exemple:

Return TRUE

Carrega el registre Eax amb el valor TRUE (1) i torna.


Return dqValue (per a projectes de 64 bits)

L'argument dqValue ha de ser un valor de 64 bits (QWord). Carrega el valor dqValue al regsitre Rax i torna d'un procediment.

Exemple:

Return TRUE

Carrega el registre Rax amb el valor TRUE (1) i torna.


Date lpszBuf

L'argument lpszBuf ha de ser l'adreça efectiva d'un buffer.

Exemple:

Date lpszDate

El buffer lpszDate s'omplirà amb una cadena de text ANSI que contindrà la data actual.


Now lpszBuf

L'argument lpszBuf ha de ser l'adreça efectiva d'un buffer.

Exemple:

Now lpszNow

El buffer lpszNow s'omplirà amb una cadena de text ANSI que contindrà la data i hora actuals.


Time lpszBuf

L'argument lpszBuf ha de ser l'adreça efectiva d'un buffer.

Exemple:

Time lpszTime

El buffer lpszTime s'omplirà amb una cadena de text ANSI que contindrà l'hora actual.


TextA Name, "quoted_text"

L'argument Name ha de ser un nom vàlid que identifiqui la cadena indicada pel segon argument, "quoted_text", que pot ser qualsevol text entre cometes.

Exemple:

TextA szBuffer, "Test string"

Després d'executar-se aquesta sentència tindreu un buffer amb la cadena de text especificada (acabada en zero). Recordeu que el valor tornat per TextA NO és l'adreça efectiva de la cadena, per tant, haureu d'utilitzar l'operador Addr per tal d'obtenir-la. Per exemple:

TextA, szTestA, "Test string"

Invoke lstrlen, Addr szTestA

Torna 11 (la lllargada de la cadena) al registre Eax/Rax


TextW Name, "quoted_text"

L'argument Name ha de ser un nom vàlid que identifiqui la cadena indicada pel segon argument, "quoted_text", que pot ser qualsevol text entre cometes.

Exemple:

TextW szBufferW, "Test string"

Després d'executar-se aquesta sentència tindreu un buffer amb la cadena de text especificada (acabada en zero) en format Unicode. Recordeu que el valor tornat per TextW NO és l'adreça efectiva de la cadena, per tant, haureu d'utilitzar l'operador Addr per tal d'obtenir-la. Per exemple:

TextW, szTestW, "Test string"

Invoke lstrlenW, Addr szTestW

Torna 11 (la lllargada de la cadena) al registre Eax/Rax

(Programada per Héctor A. Medina)


Text Name, ("quoted_text")

L'argument Name ha de ser un nom vàlid que identifiqui la cadena indicada pel segon argument, "quoted_text", que pot ser qualsevol text entre cometes.

Exemple:

Text szTest, ("Test string")

Després d'executar-se aquesta sentència tindreu un buffer amb la cadena de text acabada en zero, que estarà en format ANSI o Unicode depenent del mode en que estigui treballant l'aplicació. Si l'opció Aquest projecte s'executarà en mode Unicode (Windows NT o posterior) de les Propietats del projecte està marcada, i l'aplicació s'està executant en Windows NT o posterior, el text retornat serà Unicode, altrament serà ANSI. Recordeu que el valor tornat per Text NO és l'adreça efectiva de la cadena, per tant, haureu d'utilitzar l'operador Addr per tal d'obtenir-la (Addr szTest).


TextAddrA
("quoted_text")

L'argument "quoted_text" pot ser qualsevol text entre cometes.

Exemple:

TextAddrA ("Test string")

Després d'executar-se aquesta sentència tindreu l'adreça efectiva d'una cadena de text acabada en zero. Podeu utilitzar-la per passar-la com a argument a qualsevol rutina o funció de l'API. Recordeu que el valor tornat per TextAddrA és l'adreça efectiva, per tant, NO heu d'utilitzar l'operador Addr. Per exemple:

Invoke lstrlen, TextAddrA("Test string")

Torna 11 (la lllargada de la cadena) al registre Eax/Rax


TextAddrW
("quoted_text")

L'argument "quoted_text" pot ser qualsevol text entre cometes.

Exemple:

TextAddrW ("Test string")

Després d'executar-se aquesta sentència tindreu l'adreça efectiva d'una cadena de text Unicode acabada en zero. Podeu utilitzar-la per passar-la com a argument a qualsevol rutina o funció de l'API per a text Unicode. Recordeu que el valor tornat per TextAddrW és l'adreça efectiva, per tant, NO heu d'utilitzar l'operador Addr. Per exemple:

Invoke lstrlenW, TextAddrW("Test string")

Torna 11 (la lllargada, en caràcters, de la cadena) al registre Eax/Rax

(Programada per Héctor A. Medina)


TextAddr ("quoted_text")

L'argument "quoted_text" pot ser qualsevol text entre cometes.

Exemple:

TextAddr("Test string")

Després d'executar-se aquesta sentència tindreu l'adreça efectiva d'una cadena de text acabada en zero, que estarà en format ANSI o Unicode depenent del mode en que estigui treballant l'aplicació. Si l'opció Aquest projecte s'executarà en mode Unicode (Windows NT o posterior) de les Propietats del projecte està marcada, i l'aplicació s'està executant en Windows NT o posterior, el text retornat serà Unicode. Altrament, serà ANSI.


TextStrA ("quoted_text")

L'argument "quoted_text" pot ser qualsevol text entre cometes.

Exemple:

TextStrA("Test string")

Després d'executar-se aquesta sentència tindreu l'adreça efectiva d'una cadena de text ANSI acabada en zero. Recordeu que el valor tornat per TextStrA és l'adreça efectiva, per tant, NO heu d'utilitzar l'operador Addr.


TextStrW ("quoted_text")

L'argument "quoted_text" pot ser qualsevol text entre cometes.

Exemple:

TextStrW("Test string")

Després d'executar-se aquesta sentència tindreu l'adreça efectiva d'una cadena de text Unicode acabada en zero. Recordeu que el valor tornat per TextStrW és l'adreça efectiva, per tant, NO heu d'utilitzar l'operador Addr.


TextStr ("quoted_text")

L'argument "quoted_text" pot ser qualsevol text entre cometes.

Exemple:

TextStr("Test string")

Després d'executar-se aquesta sentència tindreu l'adreça efectiva d'una cadena de text acabada en zero, que estarà en format ANSI o Unicode depenent del mode en que estigui treballant l'aplicació. Si l'opció Aquest projecte s'executarà en mode Unicode (Windows NT o posterior) de les Propietats del projecte està marcada, i l'aplicació s'està executant en Windows NT o posterior, el text retornat serà Unicode. Altrament, serà ANSI.


MultiCat lpszDesPtr, lpszOrgPtr

Concatena dues o més cadenes de text. L'argument lpszDesPtr ha de ser l'adreça efectiva d'un buffer que rebrà les cadenes concatenades, mentre que lpszOrgPtr ha de ser l'adreça efectiva d'una o més cadenes de text acabades en zero i separades per comes. Com a mínim s'ha de passar una cadena com a segon argument.

Exemple:

MultiCat lpszDest, lpszStr1, lpszStr2, ..., lpszStrn

Les cadenes lpszStr1, lpszStr2, ... i lpszStrn són concatenades a lpszDest.


Swap dwValue1, dwValue2 (per a projectes de 32 bits)

Els arguments dwValue1 i dwValue2 han de ser variables o registres de 32 bits.

Exemple:

Swap dwVar1, dwVar2

Intercanvia els valors de les variables dwVar1 i dwVar2.


Swap dqValue1, dqValue2 (per a projectes de 64 bits)

Els arguments dqValue1 i dqValue2 han de ser variables o registres de 64 bits.

Exemple:

Swap dqVar1, dqVar2

Intercanvia els valors de les variables dqVar1 i dqVar2.



OBSERVACIONS: Recordeu que no cal afegir cap caràcter NULL de final de cadena atès que ja l'afegeixen les macros: Text, TextA, TextW, TextAddr, TextAddrA, TextAddrW TextStr, TextStrA i TextStrW. D'altra banda, TextW, TextAddrW i TextStrW (que tornen text Unicode) estan limitades a 243 caràcters, (incloent-hi el zero final afegit per les macros). Per tant, si es passen més de 242 caràcters es produiran errors.

IMPORTANT: Si no heu de fer servir cap d'aquestes macros (incloses per defecte), o els seus noms crean algun conflicte amb alguna variable, procediment o macro del projecte, podeu treure-les desmarcant l'opció Macros de l'EasyCode a les Propietats del projecte.