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

运行结果:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值