FreeBasic内嵌汇编

         FB语言支持内嵌汇编,32位和64位汇编使用方式有所区别,例如函数调用,传参的方式不一样。在windows api中,32位使用stdcall约定,参数从右到左依次压入栈,而64位则使用fastcall约定,前面四个参数依次为rcx、rdx、r8、r9,四个以内参数按照四个寄存器顺序赋值,如果参数超过四个,则第五个开始使用栈来传入。

        MessageBox原型:

'A字符
declare function MessageBox alias "MessageBoxA"(byval hWnd as HWND, byval lpText as LPCSTR, byval lpCaption as LPCSTR, byval uType as UINT) as long
'W字符
declare function MessageBox alias "MessageBoxW"(byval hWnd as HWND, byval lpText as LPCWSTR, byval lpCaption as LPCWSTR, byval uType as UINT) as long

        32位程序需要按顺序将uType、lpCaption、lpText、hWnd入栈(从右到左),字符串可用lea指令获取指针,最后再call。

        64位程序需要将rcx、rdx、r8、r9四个寄存器分别存入对应参数(从左到右),字符串可用lea指令获取指针,其中使用xor rcx, rcx来使寄存器置0,会比mov rcx, 0更快。

        其中可使用 #ifdef __fb_64bit__ 来判断编译位数,以便写出兼容性代码,要注意32位和64位寄存器的区别。

#lang "FB" '表示为标准FB格式
#include Once "windows.bi"

Dim As ZString * 50 text = "Hello World!", title = "HelloWin"

Asm
   #ifdef __fb_64bit__
      '64位
      xor rcx, rcx  '句柄
      lea rdx, text '消息文本
      lea r8, title '标题
      mov r9, 1     '标志
      call MessageBox
   #else
      '32位
      push 1 '标志
      lea esi, title
      push esi '标题
      lea edi, text
      push edi '消息文本
      push 0   '句柄
      call MessageBox
   #endif
End Asm

Sleep

运行结果:

FreeBasic内嵌汇编_第1张图片

你可能感兴趣的:(FreeBasic,汇编,开源,windows)