asm-test.pwn 864 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #include "../asm"
  2. #include "../dynamic_call"
  3. forward HandleAsmError(ctx[AsmContext], AsmError:error);
  4. main() {
  5. // Have to use print() somewhere to make GetNativeAddressFromName() work.
  6. print("Doing #emit at runtime!");
  7. new code[10];
  8. new ctx[AsmContext];
  9. AsmInit(ctx, code);
  10. AsmSetErrorHandler(ctx, GetPublicAddressFromName("HandleAsmError"));
  11. // Build a function that prints a string and returns:
  12. //
  13. // PrintString(const string[]) {
  14. // printf(string);
  15. // }
  16. //
  17. // NOTE: "print" must be called somwhere else in order to for this work!
  18. @emit proc
  19. @emit push.arg 0
  20. @emit push.num.args 1
  21. @emit sysreq "print"
  22. @emit pop.args 1
  23. @emit retn
  24. if (AsmGetError(ctx) == ASM_ERROR_NONE) {
  25. CallFunction(AsmGetCode(ctx), ref("Hello!"));
  26. }
  27. }
  28. public HandleAsmError(ctx[AsmContext]) {
  29. printf("AsmError: %d", _:AsmGetError(ctx));
  30. }