nandgame中的Function(函数定义)传输传递、返回值

参考:https://zhuanlan.zhihu.com/p/613188641

函数函数宏定义了函数块的顶部。
它应该调整堆栈以为本地存储腾出空间。
本地存储的大小由占位符localsCount给出。名为占位符functionName的标签应该开始该块。
将LOCALS设置为当前SP。
通过将localsCount添加到当前SP值来
在堆栈上为本地数据腾出空间。
DEFINE LOCALS 2
DEFINE SP 0
functionName:    //函数定义,标签
A = SP
D = *A           //取到栈顶的地址
A = LOCALS       //本地值的存储地址
*A = D           //
A = localsCount  //本地个数加到栈顶D中
D = D + A      
A = SP           //修改栈顶值
*A = D

Return

Return返回Return宏定义了函数块的结束。
它应该将返回值存储在内存地址RETVAL中,
并恢复堆栈。从堆栈中弹出顶部值到RETVAL内存槽中。
将SP设置为LOCALS的值
从堆栈中弹出返回地址并跳转到它。
DEFINE ARGS 1
DEFINE LOCALS 2
DEFINE RETVAL 6
DEFINE SP 0
DEFINE TEMP 3
POP_STATIC RETVAL  //将返回值存储在内存地址RETVAL中
A = LOCALS
D = *A
A = SP
*A = D
POP_A
JMP

Push argument 压入参数(函数调用前)

Push argument将由ARGS +索引占位符给出的内存地址的当前内容推送到堆栈上。DEFINE ARGS 1
A = ARGS
D = *A
A = index
D = D + A
A = D
D = *A
PUSH_D

Pop argument 弹出参数(进入函数后)

Pop argument取出堆栈顶部的值,
并将其存储在由ARGS +索引占位符的值给出的内存地址处。DEFINE ARGS 1
DEFINE TEMP 3
A = ARGS
D = *A
A = index
D = D + A
A = TEMP
*A = D
POP_D
A = TEMP
A = *A
*A = D

Push local 将局部变量存入栈内

Push local取出由LOCALS +索引占位符给出的内存地址处的当前内容,并将其推送到堆栈上。DEFINE LOCALS 2
A = LOCALS
D = *A
A = index
D = D + A
A = D
D = *A
PUSH_D

Pop local 将栈内值弹出到本地

Pop local将堆栈顶部的值存储到由LOCALS +索引占位符给出的内存地址中。DEFINE LOCALS 2
DEFINE TEMP 3
A = LOCALS
D = *A
A = index
D = D + A
A = TEMP
*A = D
POP_D
A = TEMP
A = *A
*A = D

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

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

相关文章

《剑指 Offer》专项突破版 - 面试题 105 和 106 : 最大的岛屿和二分图(C++ 实现)

目录 面试题 105 : 最大的岛屿 面试题 106 : 二分图 面试题 105 : 最大的岛屿 题目: 海洋岛屿地图可以用由 0、1 组成的二维数组表示,水平或竖直方向相连的一组 1 表示一个岛屿,请计算最大的岛屿的面积(即岛屿中 1 的数目&…

uniapp实现文件和图片选择上传功能实现

主要介绍了uni-file-picker文件选择上传,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 上传一张: <template><view class="container example"><uni-forms ref="baseForm" …

数列求和 蓝桥杯 java

题目描述 给定 n 个数 Ai&#xff0c;问能满足 m! 为∑ni1(Ai!) 的因数的最大的 m 是多少。其中 m! 表示 m 的阶乘&#xff0c;即 1 2 3 m。 输入格式 输入的第一行包含一个整数 n 。 第二行包含 n 个整数&#xff0c;分别表示 Ai&#xff0c;相邻整数之间使用一个空…

【MATLAB】基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据(附代码)

基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据 WiFi指纹匹配是室内定位最为基础和常见的研究&#xff0c;但是WiFi指纹的采集可以称得上是labor-intensive和time-consuming。现在&#xff0c;给大家分享一下我们课题组之前在做WiFi指纹定位时的基于射线跟踪技术仿真WiFi…

chrome 浏览器 有自带的自动字幕功能,支持英文,控制您的音乐、视频等媒体内容

chrome 浏览器 有自带的自动字幕功能&#xff0c;支持英文&#xff0c;控制您的音乐、视频等媒体内容

【机器学习算法】决策树和随机森林在计算机视觉中的应用

前言 决策树和随机森林在计算机视觉中有着广泛的应用。决策树作为一种简单而强大的分类模型&#xff0c;可以用于图像分类、目标检测、特征提取等任务。它能够根据图像的特征逐层进行判断和分类&#xff0c;从而实现对图像数据的智能分析和理解。随机森林作为一种集成学习方法&…

SpringBoot3配置SpringSecurity6

访问1&#xff1a;localhost:8080/security&#xff0c;返回&#xff1a;需要先认证才能访问&#xff08;说明没有权限&#xff09; 访问2&#xff1a;localhost:8080/anonymous&#xff0c;返回&#xff1a;anonymous&#xff08;说明正常访问&#xff09; 相关文件如下&…

[dvwa] CSRF

CSRF 0x01 low 跨站&#xff0c;输入密码和确认密码直接写在url中&#xff0c;将连接分享给目标&#xff0c;点击后修改密码 社工方式让目标点击短链接 伪造404页&#xff0c;在图片中写路径为payload&#xff0c;目标载入网页自动请求构造链接&#xff0c;目标被攻击 http…

jupyter 重新下载与安装教程

jupyter 重新下载与安装教程 conda 卸载 要卸载 Jupyter&#xff0c;首先需要确定你是通过哪种方式安装的。由于你提到不确定是通过 conda 还是本地的 Python 安装的&#xff0c;我们可以分别检查并尝试卸载。 conda list jupyter这里选择你所有的jupyter 相关的包 conda r…

【STL】栈(stack)

笔者在做下面这道题的时候想到用栈&#xff0c;但写的很麻烦 代码&#xff1a; #include<bits/stdc.h> using namespace std; #define MAXC 255 typedef int SElemType; typedef struct StackNode {SElemType data;struct StackNode *next; }StackNode,*LinkStack; bool…

MathJax的基本使用

一、引言 MathJax引擎是一个开源的JavaScript库&#xff0c;它允许Web开发者在网页中嵌入高质量的数学公式。通过利用Web的最新技术&#xff0c;MathJax引擎可以解析LaTeX、MathML和AsciiMath等数学标记语言&#xff0c;并将其渲染为可视化的数学公式&#xff0c;这些公式可以…

多线程(43)Java中的内存屏障和它们的用途

Java内存模型(JMM)的目的是定义线程如何以及何时可以看到其他线程写入共享变量的结果&#xff0c;以及如何同步对这些变量的访问。在这个模型中&#xff0c;内存屏障&#xff08;Memory Barriers&#xff09;或内存栅栏是一个关键概念&#xff0c;它们帮助维护不同线程间的可见…

NPU float(“inf“) mask_fill 出现NAN

使用NPU时&#xff0c;采用mask_fill函数&#xff0c;会出错&#xff1a; tensors.masked_fill(mask.unsqueeze(-1), float(inf)) 无法直接使用表达式,会报错 NAN&#xff1a; 取一个较大的值替换即可&#xff1b; tensors.masked_fill(mask.unsqueeze(-1), float(1e10))

蓝桥杯刷题 二分-[364]跳石头(C++)

题目描述 一年一度的「跳石头」比赛又要开始了&#xff01; 这项比赛将在一条笔直的河道中进行&#xff0c;河道中分布着一些巨大岩石。组委会已经选择好了两块岩石 作为比赛起点和终点。在起点和终点之间&#xff0c;有 N 块岩石&#xff08;不含起点和终点的岩石&#xff…

Java中你见过带标签的for语句吗?

带标签的for循环&#xff0c;可用于break/continue跳出指定for循环 test:for(int i 1; i < 5; i) {for(int j 1; j < 5; j) {if (j % 2 0) {break test; // 默认是跳出内层for循环。这里指定让它跳出外层for循环// continue test; // 默认是跳出内层本次for循环&…

LeetCode算法——双指针篇

宫侑的发球最终进化为三刀流&#xff0c;那么我的题解也未必要循规蹈矩! 1、验证回文串 题目描述&#xff1a; 解法&#xff1a; 这题官方给的关于双指针的题解都用到了多个库函数&#xff0c;如 tolower(大写字母转小写)、isalnum(判断一个字符是否是 字母 或者 十进制数字 )…

LeetCode——622设计循环队列

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/design-circular-queue/ 1.题目 设计你的循环队列实现。 循环队列是一…

CSS-文字环绕浮动、行内块分页、三角强化妙用、伪元素选择器

文字环绕浮动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文字环绕浮动效果</title><s…

Vue+el-table 修改表格 单元格横线边框颜色及表格空数据时边框颜色

需求 目前 找到对应的css样式进行修改 修改后 css样式 >>>.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F !important;}>>>.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F …

Oracle ORA-28547:connection to server failed,probable Oracle Net admin error

使用Navicat连接oracle数据库时报ORA-28547错误 因为Navicat自带的oci.dll并不支持oracle11g&#xff0c;需要去官网下载支持的版本。 1.去oracle下载对应的oci.dll文件 下载地址&#xff1a;Oracle Instant Client Downloads 可以用 11.2.0.4 2. 复制刚下载下来的instant…