Deine Funktion versucht auf die Adresse Zahl + 2 zuzugreifen. Was du meinst ist die Adresse von Zahl + 2. Das kann so nicht funktionieren, egal wie du diese Assembleranweisung verpackst... denn der Parameter wird in einem Register übergeben. Da gibt es keine Adresse, die man erhöhen könnte...
Zudem liest du aus Zahl (also aus dem Register EAX) und schreibst in AX, also aus dem selben Register. Auch das geht nicht.
Wenn das früher mal ging, war das eine andere Aufrufkonvention, die die Parameter auf den Stack gelegt hat.
Gehen tut es so:
Delphi-Quellcode:
function HiWord(
const ANumber: Longint): Word;
assembler;
asm
shr ANumber, 16
end;
function LoWord(
const ANumber: Longint): Word;
assembler;
asm
and ANumber, $FF
end;
Oder du nutzt gleich Lo und Hi, die Delphi schon selbst kennt. Angesichts verschiedener Plattformen, die Delphi unterstützt, ist es auch die weit bessere Lösung ohne Assembler zu arbeiten wo das möglich ist.