FB使用汇编模拟GoSub(子函数)功能

    在FB里不支持GoSub功能,在面对函数内简单又重复的操作,而所涉及变量又比较多的时候,再在外边定义一个函数就显得累赘,此时如果可以有一个函数内部的子函数,就显得方便多了。

    在汇编探索里发现,可以使用汇编来实现函数的子函数功能,但gcc编译的时候,会把子函数部分当做无效代码优化了,通过测试发现,只要用汇编跳转到函数末尾,则gcc编译器就不会直接优化子函数代码了。于是设置了3个宏,来实现FB的GoSub功能。

1、GotoSub(fn)

宏定义如下,用汇编的call来调用子函数,参数是函数名称。

#Macro GotoSub(fn)
Asmcall	fn
End Asm
#EndMacro

2、SubName(fn)

宏定义如下,就是定义一个函数的标签,参数是函数名称。(只能通过汇编来调用(call)或者跳转(jmp),goto是不行的)

#Macro SubName(fn)
Asm
fn:
End Asm
#EndMacro

3、RetSub

宏定义如下,就是汇编的返回(ret)。作为子函数时,必须要有返回,不然不能回到原来函数调用的地方。

#Macro RetSub
Asmret
End Asm
#EndMacro

具体实现过程如下:

#include Once "windows.bi"#Macro GotoSub(fn)
Asmcall	fn
End Asm
#EndMacro#Macro SubName(fn)
Asm
fn:
End Asm
#EndMacro#Macro RetSub
Asmret
End Asm
#EndMacroSub test()Dim a As Long = 10Dim b As Long = 5Dim c As Long = 0c = a + bGotoSub(test2) 		'打印输出GotoSub(test1)		'乘法计算GotoSub(test2) 		'打印输出
'--------------------------------------------------	
'跳到函数末尾
'  这里不能用exit sub,exit function,return和goto来结束函数,
'  因为如果使用gcc编译的时候,使用以上方法结束函数,子函数部分会被优化。
'  只能使用汇编来跳转到末尾GotoSub(testend) 	
'--------------------------------------------------
'子函数1 算乘法
SubName(test1)			'子函数名c = a * bRetSub				'必须有返回,不然就会顺序往下执行
'--------------------------------------------------
'子函数2 单纯的打印c功能
SubName(test2)Print "c = ";cRetSub
'--------------------------------------------------
'函数末尾	
SubName(testend)		
End Subtest()Sleep
End

必须注意:

1、如果使用子函数,必须有在原有函数主体程序末尾加一个跳转到函数结尾的调用。建议使用函数名+end实现。如GotoSub(testend) 。同时在函数末尾(end sub或者end function前)定义一个函数名,如SubName(testend)。此函数不返回。

2、其他子函数都是使用函数名SubName + 返回RetSub的方式来实现。

3、根据需要也可以不写,比如同时执行a函数+b函数,以及可以单独调用b函数时,a函数放前面,不返回,b函数返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/230697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20231218在微软官网下载WINDOWS10以及通过rufus-4.3p写入U盘作为安装盘

20231218在微软官网下载WINDOWS10以及通过rufus-4.3p写入U盘作为安装盘 2023/12/18 17:06 百度搜索:下载 windows10 https://www.microsoft.com/zh-cn/software-download/windows10 下载 Windows 10 更新之前,请参阅 Windows 版本信息状态中的已知问题&a…

企业要想成功就必须培养“支持说真话的文化”

大家好,欢迎来到我的博客。今天,我想和大家谈谈企业文化的重要性,特别是支持说真话的文化。 1. 为什么说真话很重要? 在当今社会,说真话似乎越来越难了。我们害怕得罪别人,害怕被孤立,害怕被认…

系统设计——系统安全

HTTPS 是如何工作的? 安全超文本传输​​协议(HTTPS)是超文本传输​​协议(HTTP)的扩展。HTTPS 使用传输层安全性(TLS)传输加密数据。如果数据在网上被劫持,劫持者得到的只是二进制…

php去掉数组的key,重组数组的方法

php去掉数组的key,重组数组的方法 方法一:foreach循环方法二:array_values()函数方法三:array_map()函数方法四:强制类型转换 方法一:foreach循环 使用foreach循环遍历数组时,可以只取出数组的…

TaxtArea中内嵌一张放松图片,该图片实现属性悬浮放大功能

TaxtArea中内嵌一张发送图片&#xff0c;该图片实现属性悬浮放大功能&#xff0c;离开还原效果&#xff0c;点击发送按钮后&#xff0c;发送图片变为loading&#xff0c; <div class"textarea-wrapper" ><a-textarearef"textArea"v-model.trim&q…

汇编语言学习(3)

更好的阅读体验&#xff0c;请点击 YinKai s Blog 。 内存段 ​ 上面讨论的汇编程序的三个部分&#xff0c;也代码各种内存段。 ​ 有趣的是&#xff0c;如果将 section 关键字替换为 segment&#xff0c;将会得到相同的结果&#xff0c;这是因为对于汇编器而言&#xff0c;这…

web应用开发技术的一些概念

一、Servlet 1.Servlet的工作过程&#xff1a; Servelt的工作流程示意图 &#xff08;1&#xff09;客户端发起一个Http请求到服务器&#xff0c;请求特定的资源或者是要执行特定的操作 &#xff08;2&#xff09;服务器在接收到请求后&#xff0c;根据请求相应的URL将请求分发…

PostgreSQL进阶操作

PostgreSQL进阶操作 SQL执行顺序 (9) SELECT (10) DISTINCT col1, [OVER()] (6) AGG_FUNC(col2) (1) FROM table1 (3) JOIN table2 (2) ON table1.col table2.col (4) WHERE constraint_expression (5) GROUP BY col (7) WITH CUBE|ROLLUP (8) HAVING constraint_expression…

21、同济、微软亚研院、西安电子科技大提出HPT:层次化提示调优,独属于提示学习的[安妮海瑟薇]

前言&#xff1a; 本论文由同济大学、微软亚洲研究院、西安电子科技大学&#xff0c;于2023年12月11日中了AAAI2024 论文&#xff1a; 《Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models》 地址&#xff1a; [2312.06323]…

C++泛型超详细合集-泛化的编程方式-程序员编写一个函数/类的代码让编译器去填补出不同的函数实现-供大家学习研究参考

以Add函数为例&#xff0c;在函数模板存在的同时&#xff0c;我们还可以单独写一个int类型的add函数。这都归功于函数重载的存在。 同时&#xff0c;我们还可以使用<int>来指定函数模板重载为已存在的Add函数。因为本质上这两个函数是不同的&#xff0c;并不会冲突。 下…

js 数据类型

js的八种数据类型&#xff1a; 基本类型&#xff08;基本类型&#xff09;&#xff1a;Number&#xff0c;String&#xff0c;Boolean&#xff0c;Undefined&#xff0c;Null&#xff0c;Symbol 引用数据类型&#xff08;对象类型&#xff09;&#xff1a;Object&#xff0c;…

mybatis中xml文件容易搞混的属性

目录 第一章、1.1&#xff09;MyBatis中resultMap标签1.2&#xff09;MyBatis的resultType1.3&#xff09;MyBatis的parameterType1.4&#xff09;type属性1.5&#xff09;jdbcType属性1.6&#xff09;javaType属性1.7&#xff09;ofType属性 友情提醒: 先看文章目录&#xff…

【k8s】--insecure-registry详解 ( 访问仓库、https、http)

文章目录 一、--insecure-registry是什么二、如何使用--insecure-registry三、--insecure-registry的安全风险四、--insecure-registry的替代方案五、总结参考 一、–insecure-registry是什么 --insecure-registry是docker中用来设置与docker registry通信的安全限制的一个参数…

猫粮哪个牌子好又安全?好又安全的主食冻干猫粮牌子推荐

现在越来越多的铲屎官关注猫咪的食品选择&#xff0c;而冻干猫粮一直是热门话题。其中主食冻干的肉含量很高&#xff0c;富含猫咪成长所需的蛋白质、维生素等营养物质。而且冻干工艺还保留了食材的原始风味&#xff0c;复水后可以恢复鲜肉的口感&#xff0c;猫咪很喜欢吃&#…

人工智能Keras图像分类器(CNN卷积神经网络的图片识别篇)

上期文章我们分享了人工智能Keras图像分类器(CNN卷积神经网络的图片识别的训练模型),本期我们使用预训练模型对图片进行识别:Keras CNN卷积神经网络模型训练 导入第三方库 from keras.preprocessing.image import img_to_array from keras.models import load_model impor…

.net web API的文件传输(上传和下载)客户端winform

防止反复造轮子&#xff0c;直接上代码。 客户端代码如下&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.IO.Compression; using System.Linq; using …

conda channel的镜像设置

目录 前言1 显示所有channel2 移除清华镜像3 添加可用的清华源4 下载opencv5 一些其他的conda指令参考文献 ———————————————— 版权声明&#xff1a;本文为CSDN博主「宇内虹游」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链…

关于“Python”的核心知识点整理大全27

目录 10.5 小结 第&#xff11;1 章 测试代码 11.1 测试函数 name_function.py 函数get_formatted_name()将名和姓合并成姓名&#xff0c;在名和姓之间加上一个空格&#xff0c;并将它们的 首字母都大写&#xff0c;再返回结果。为核实get_formatted_name()像期望的那样工…

arcgis javascript api4.x加载天地图cgs2000坐标系

需求&#xff1a;arcgis javascript api4.x加载天地图cgs2000坐标系 效果&#xff1a; 示例代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"wid…

《LeetCode力扣练习》代码随想录——双指针法(反转字符串---Java)

《LeetCode力扣练习》代码随想录——双指针法&#xff08;反转字符串—Java&#xff09; 刷题思路来源于 代码随想录 344. 反转字符串 相向双指针 class Solution {public void reverseString(char[] s) {if(s.length1){return;}int left0;int rights.length-1;while(left<r…