2
0

tasm23b.pp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. { %CPU=x86_64 }
  2. program tasm23b;
  3. {$ASMMODE INTEL}
  4. {$S-}
  5. const
  6. t_size = 25;
  7. procedure t; assembler;
  8. asm
  9. mov eax, [rbx[5]][rdi][54][-17][45][4] { mov eax, [rbx+rdi+5Bh] }
  10. mov eax, [[rbx+5]+[rdi+54]+[-17]+[45]+[4]] { mov eax, [rbx+rdi+5Bh] }
  11. mov ebx, [5[7]] { mov ebx, [000Ch] }
  12. mov ebx, [5+[7]] { mov ebx, [000Ch] }
  13. end;
  14. procedure t_verify; assembler;
  15. asm
  16. mov eax, [rbx+rdi+5Bh] { mov eax, [rbx[5]][rdi][54][-17][45][4] }
  17. mov eax, [rbx+rdi+5Bh] { mov eax, [[rbx+5]+[rdi+54]+[-17]+[45]+[4]] }
  18. mov ebx, [000Ch] { mov ebx, [5[7]] }
  19. mov ebx, [000Ch] { mov ebx, [5+[7]] }
  20. end;
  21. const
  22. t2_size = 37;
  23. procedure t2; assembler;
  24. var
  25. locl: longword;
  26. asm
  27. mov eax, locl { mov еax, [rbp-08] }
  28. mov eax, fs:locl { mov еax, fs:[rbp-04] }
  29. mov eax, [fs:locl] { mov еax, fs:[rbp-04] }
  30. mov eax, [fs:[locl]] { mov еax, fs:[rbp-04] }
  31. mov eax, fs:locl[5] { mov еax, fs:[rbp+01] }
  32. mov eax, fs:5[locl] { mov еax, fs:[rbp+01] }
  33. end;
  34. procedure t2_verify; assembler;
  35. var
  36. locl: longword;
  37. asm
  38. mov eax, [rbp-04] { mov еax, locl }
  39. mov eax, fs:[rbp-04] { mov еax, fs:locl }
  40. mov eax, fs:[rbp-04] { mov еax, [fs:locl] }
  41. mov eax, fs:[rbp-04] { mov еax, [fs:[locl]] }
  42. mov eax, fs:[rbp+01] { mov еax, fs:locl[5] }
  43. mov eax, fs:[rbp+01] { mov еax, fs:5[locl] }
  44. end;
  45. function CompareCode(cp, cp2: CodePointer; sz: Integer): Boolean;
  46. var
  47. lastbyte: Byte;
  48. begin
  49. if CompareByte(cp^, cp2^, sz) <> 0 then
  50. begin
  51. CompareCode := False;
  52. exit;
  53. end;
  54. { check also that the last byte is a retn instruction }
  55. { size differs at least between linux and windows, so leave the ret check away
  56. lastbyte:=PByte(cp)[sz-1];
  57. if lastbyte<>$C3 then
  58. begin
  59. CompareCode := False;
  60. exit;
  61. end;
  62. }
  63. CompareCode := True;
  64. end;
  65. procedure Error(N: Integer);
  66. begin
  67. Writeln('Error! ', N);
  68. Halt(1);
  69. end;
  70. begin
  71. if not CompareCode(CodePointer(@t), CodePointer(@t_verify), t_size) then
  72. Error(1);
  73. if not CompareCode(CodePointer(@t2), CodePointer(@t2_verify), t2_size) then
  74. Error(2);
  75. Writeln('Ok!');
  76. end.