CallR / RetR / CallRA / RetRA (només projectes ASMC, JWASM, MASM, POASM i UASM de 64 bits)


Atés que el compilador MASM de 64 bits (ml64) no suporta la instrucció Retn, l'Héctor A. Medina ha desenvolupat quatre pseudo-opcodes inclosos a l'Easy Code, CallR, RetR, CallRA i RetRA, que funcionen igual que Call i Retn. Aquests pseudo-opcodes s'utilitzen de la següent manera:

wndMainProcedure Proc hWnd:QWORD, uMsg:QWORD, wParam:QWORD, lParam:QWORD
    Mov hWnd, Rcx
    Mov uMsg, Rdx
    Mov wParam, R8
    Mov lParam, R9

    CallR Label
    ;RetR retorna aquí

    Ret

Label:
    RetR
wndMainProcedure EndP


A més, CallR i CallRA accepten un segon argument OPCIONAL com a adreça de retorn:

wndMainProcedure Proc hWnd:QWORD, uMsg:QWORD, wParam:QWORD, lParam:QWORD
    Mov hWnd, Rcx
    Mov uMsg, Rdx
    Mov wParam, R8
    Mov lParam, R9

    CallR Label, RetAddr
    ;Línia de codi
    ;Línia de codi

RetAddr:
    ;RetR retorna aquí

    Ret

Label:
    RetR
wndMainProcedure EndP


L’exemple de 64 bits ECClock per a MASM, a la carpeta EasyCode\Examples\Masm\x64, fa servir CallR i RetR.


IMPORTANT: En els exemples anteriors, es pot utilitzar CallR / RetR o CallRA / RetRA indistintament, però cal tenir en compte que CallRA / RetRA mantenen l'aliniació de la pila, mentre que CallR / RetR NO.

AVÍS: RetR i RetRA modifiquen el registre Rax.

OBSERVACIONS: CallR, RetR, CallRA i RetRA només estan disponibles per als projectes ASMC, JWASM, MASM, POASM i UASM de 64 bits. Tot i que els compiladors de 64 bits ASMC, JWASM, POASM i UASM suporten la instrucció Retn, CallR, RetR, CallRA i RetRA també estan disponibles com a complement.