Fun 语言和汇编 ..

作者: 一了 <1liao3@funlang.org>
日期: 2019-08-08

Fun 语言内嵌汇编

嵌入汇编以取得机器的 CpuId.
use 'lib-asm-pro.fun';

var s = `#!asm
      pop ebx
      pop eax
      push eax
      push ebx

      push edi
      mov edi,eax

      mov eax,$00000001 ; cpuid
      cpuid
      push eax

      stosd
      mov eax,edx
      stosd

      pop eax
      pop edi
`;

var cpu = ' '.x(8 div charSize());
var asm = Assembly('i:i', s);
var ptr = cpu.toNum(-1);
?. int2hex(asm.Load().Run(ptr));
asm.Delete();
?. str2hex(cpu);
?. 'Ok';
E9060800
e9060800ffbbab0f
Ok

汇编回调 Fun 语言函数

在汇编内调用 Fun 语言代码.
use 'lib-asm-pro.fun';

fun inc2(a)
  ?. a;
  return a + 2;
end fun;

fun inc1(a)
  ?. a;
  return a + 1;
end fun;

var s = `#!asm
      push  dword ptr [esp+04] ; 参数
      mov   eax,         ; 函数地址
      call  eax
`; //?. s;

var asm = Assembly('i:i', s, [test: inc2.@toCallback(nil, 'i:i', true)]);
?. asm.Load().Run(100);
asm.Delete();
?. 'Ok';
100
102
Ok