nandgame中的asm编程 Escape Labyrinth(逃离迷宫)

先翻译题目:

逃离迷宫

计算机被困在火星上的迷宫中。编写一个程序,让它逃离迷宫。

计算机配备了连接的轮子和前方障碍物探测器。与轮子和探测器的输入/输出是内存映射在地址7FFF上:

对外设的输出信号:
位	设置为1代表:
2	向前移动(1步)
3	向左转(90度)
4	向右转(90度)
移动/转向在位从0变为1时开始,但需要一段时间才能完成。

从外设输入:
位	当为18	前方探测到障碍物
9	设备正在转向
10	设备正在向前移动

帮助信息的翻译:

汇编语言快速参考
语法为 destination = calculation ; jump-condition 目标和跳转条件是可选的。
D 和 A 是两个寄存器。*A 表示 RAM 中地址所包含的值。

示例:
D=D+1   计算 D+1 并将结果存储在 D 中。
D-1;JGE 计算 D-1。如果结果大于 0,则跳转。(结果不被存储。)
A = 1234  将数字 1234 存储在 A 寄存器中。
# Hello   注释 - 编译器忽略

计算
D + A
D-A 或 A-D
D&A(按位与)
D|A(按位或)
A+1 或 D+1
A-1 或 D-1
-A 或 -D
~A 或 ~D(按位反转)
10-1
在所有情况下,可以使用 *A 代替 A。

目标
D、A 和 *A 的任意组合都可以用作目标。多个目标用逗号分隔,例如 D,A = 1。

跳转条件
    当计算结果为时跳转:
JEQ 等于       0
JNE 不等于     0
JGT 大于       0
JGE 大于或等于  0
JLT 小于       0
JLE 小于或等于  0
JMP 无条件跳转(不管计算结果如何)。

数字指令
可以直接将数字赋给 A。例如:A = 47。
十六进制数以 0x 为前缀,例如:A = 0x7FFF
二进制数以 0b 为前缀,例如:A = 0b010111。
可以使用下划线来分隔数字组,例如:A = 0b_0101_1100。

注释
以 # 开头的行会被编译器忽略。可以用于注释和文档。

标签
关键字 LABEL 后跟一个名称,使名称代表下一条指令的地址。可以在跳转之前将该地址分配给 A,例如:A = LOOP

定义
关键字 DEFINE 后跟名称和数字,当它出现在其他指令中时,会将名称替换为数字。例如,以下两行:
DEFINE foo 0X7FFF
A = foo
等同于:A = 0x7FFF

多目标
可以将结果分配给多个寄存器。
例如 D,A = D - *A 计算的结果将同时写入 A 和 D。可以指定 A、D 和 *A 的任意组合作为目标。

题目隐含的意思:
迷宫不会中途变更。
输出控制信号后,先得读取寄存器的值,判断是否已经执行完毕。

源码参考:
https://zhuanlan.zhihu.com/p/613188641
解题思路:一直直走,撞墙就左拐。
测试运行,检查结果是正确的。

界面说明:
Show Assembler Help 显示帮助信息
Reset state 可以重置程序
Check solution 检查结果,如果通过就是过关
computer区域,Tick按钮单步执行,Run直接跑,Reset重置机器状态。
最右边是robot的当前状态的文字显示,很像二十多年前的mud游戏。
在这里插入图片描述
跑完后的效果:
在这里插入图片描述

先简单注释下源码:

LOOP_FORWARD :
A = 0x7fff
D = *A
A = 0x0100  //判断bit8是否为1,前方是否有障碍。实际也判断了bit9、bit10是否为0
D = D - A
A = LOOP_TURN_LEFT
D; JEQ      //撞墙了,调左转函数
A = LOOP_RE_READ
D; JGT      //D大于0,说明bit9、bit10不为0,需要等待前面的动作执行完毕
A = 0x0004  //bit2设置为1,控制直走
D = A
A = 0x7fff
*A = D
A = LOOP_FORWARD
JMP

LOOP_TURN_LEFT : //左转函数
A = 0x0008  //bit3设置为1,控制左转
D = A
A = 0x7fff
*A = D
A = LOOP_FORWARD
JMP

LOOP_RE_READ :  //重新探测robot状态
A = 0x7fff
D = *A
A = LOOP_FORWARD  //寄存器为0时,控制直走
D; JEQ      
A = 0x7fff
D = *A
A = 0x0100  //判断前方是否有障碍
D = D - A
A = LOOP_TURN_LEFT
D; JEQ      //调左转
A = LOOP_RE_READ
JMP         //接着等前面的执行完毕

有三个LOOP,可以理解为三个函数
A = LOOP_FORWARD
JMP
就是无条件调用LOOP_FORWARD函数

A = LOOP_TURN_LEFT
D; JEQ
是指D寄存器中的值==0时,调用LOOP_TURN_LEFT函数

A = LOOP_RE_READ
D; JGT
同理,D寄存器中的值>0时,调用LOOP_RE_READ函数

如果语法错误
会被标红,无法执行,例如:
在这里插入图片描述
鼠标放在标红的错误代码上时,会有错误提示信息弹出窗。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高精度原边控制离线式PWM功率开关芯片D3820的特征和详细的工作原理介绍

D3820是一款高精度原边控制离线式PWM功率开关。本文主要介绍D3820的特征和详细的工作原理,对反激式隔离AC-DC开关电源提供较为详细的测试过程。 特 点 1、全电压范围CC/CV精度保持在5%以内 2、用原边控制,无需TL431和光耦 3、欠压锁定&#xff08…

2024mathorcup妈妈杯数学建模A题思路模型

2024mathorcup妈妈杯数学建模A题思路模型:比赛开始后第一时间更新,更新见文末名片,下面对2022年B题进行介绍: 2022Mathorcup B题题目介绍 ​ B题无人仓的搬运机器人调度问题本题考在无人仓内的仓库管理问题之一,搬运机…

mos管开关出现尖峰的原理? mos管开关的时候cs会出现尖峰,请问这是什么原因?

MOS管在开关过程中出现尖峰现象,通常是由于电路中的寄生参数和快速电压变化引起的。以下是一些导致尖峰出现的主要原因和原理: 寄生电容 在MOS管的源极(S)和漏极(D)之间存在寄生电容,这个电容在…

Vue3组件基础示例

组件是vue中最推崇的,也是最强大的功能之一,就是为了提高重用性,减少重复性的开发。 如何使用原生HTML方法实现组件化 在使用原生HTML开发时,我们也会遇到一些常见的功能、模块,那么如何在原生HTML中使用组件化呢&am…

IoT数采平台4:测试

IoT数采平台1:开篇IoT数采平台2:文档IoT数采平台3:功能IoT数采平台4:测试 Modbus RTU串口测试 OPC测试 HTTP测试 MQTT透传测试 MQTT网关测试及数据上报 TCP / UDP 监听,客户端连上后发送信息,客户端上报数据…

P4117 [Ynoi2018] 五彩斑斓的世界

分析第一个操作 朴素的做法,遍历一遍大于x就-x,极限复杂度O(mn) 分块做法 整块:我们维护一个最大值,从mx到x遍历一遍(减去x)用并查集操作merge(i,i-x),考虑mx100001,x1,极限复杂度O(mV) 我们可以分析 1.x>(mx/2),从mx到x遍…

LwIP TCP/IP

LWIP 架构 LwIP 符合 TCP/IP 模型架构,规定了数据的格式、传输、路由和接收,以实现端到端的通信。 此模型包括四个抽象层,用于根据涉及的网络范围,对所有相关协议排序(参见图 2)。这几层从低到高依次为&am…

【grpc】二、grpc入门,基本使用方法

上篇介绍了使用protobuf生成grpc相关代码,并实现了服务端方法,本篇介绍下具体的使用。 一、服务端 // server.gopackage mainimport ("google.golang.org/grpc""grpcDemo/calc""net" )func startServer(addr string) {//…

近距离共享数字化实战经验,深挖数据价值赋能千行百业

近期,思迈特软件积极投身于金融、制造、零售、医疗等多个行业的线下活动中,深度解析行业趋势,分享BI数字化创新解决方案,并与客户及合作伙伴进行深入交流。通过这些活动,不仅展示了思迈特软件在各领域的先进技术和成果…

【SpringCloud】Nacos 配置管理

目 录 一.统一配置管理1. 在 nacos 中添加配置文件2. 从微服务拉取配置 二.配置热更新1. 方式一2. 方式二 三.配置共享1. 添加一个环境共享配置2. 在 user-service 中读取共享配置3. 运行两个 UserApplication,使用不同的 profile4. 配置共享的优先级5. 多服务共享配…

【C语言】标准库ctype.h(判断和映射字符)

【C语言】标准库ctype.h&#xff1a;判断和映射字符。 #include <ctype.h> 标准库ctype.h&#xff1a; 函数中的参数&#xff1a;都是无符号字符转换为int值进行传递。 判断函数中的返回&#xff1a;若满足判断条件&#xff0c;返回非零值。若不满足判断条件&#xff0c…

计算机研究生规划

一、计算机研究生技术栈 两条腿走路: 左侧工程实践能力&#xff1a;要掌握python编程语言&#xff0c;它和机器学习、神经网络&#xff08;这两门几乎是必须掌握的技能&#xff09;的学习有很大关系 右侧学术创新能力 二、编程语言能力提升 左边基础&#xff0c;右边教你写…

区块链的网络架构有哪些?

区块链技术的兴起正在深刻地改变着互联网的格局。它不仅提供了去中心化、数据透明、难以篡改等优势&#xff0c;还为各种应用场景提供了新的可能性。为了更好地理解区块链&#xff0c;我们需要深入探讨其网络架构。 区块链网络架构主要由以下几个部分组成&#xff1a; 1. 区块…

数字信息化手术麻醉信息系统源码,自动生成各种医疗文书、集成HIS、EMR、LIS、PACS系统

手术麻醉信息系统可以实现手术室监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集&#xff0c;采集的数据能据如实准确地反映患者生命体征参数的变化&#xff0c;并实现信息高度共享&#xff0c;根据采集结果&#xff0c;综合其他患者数据&#xff0c;自动生成手术麻醉…

Vite+Vue3.0项目使用ant-design-vue <a-calendar>日期组件汉化

antd的弹框、日期等默认为英文&#xff0c;要把英文转为中文请看下文&#xff1a; 1.首先我们要在main.js中引入ant-design组件库并全局挂载&#xff1a; import App from ./App import Antd from ant-design-vue; import ant-design-vue/dist/antd.css;const app createApp(…

数据结构与算法:哈希表

目录 1.哈希表和哈希 1.1.知识引入 1.2.为什么需要哈希表呢&#xff1f; 2.简易的哈希表 2.1.哈希表的基础结构 2.2.如何实现基础的哈希表 2.2.1.增 2.2.2.删 2.2.3.查 2.3.泛型编程下的哈希表 3.简易的哈希桶 1.哈希表和哈希 1.1.知识引入 哈希表&#xff08;Hash …

算法打卡day36|动态规划篇04| 01背包理论基础、416. 分割等和子集

目录 01背包理论基础 01背包问题描述 01背包解法 二维数组 一维数组 算法题 Leetcode 416. 分割等和子集 个人思路 解法 动态规划 01背包理论基础 不同的背包种类&#xff0c;虽然有那么多中南背包&#xff0c;但其中01背包和完全背包是重中之重&#xff1b; 01背包问…

练习题(2024/4/8)

1 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()","()(())",…

GEE必须会教程—一文教会你GEE下载影像数据的方法

一、基本流程 A.平台进入&#xff1a;网站搜索&#xff1a;https://developers.google.com/earth-engine&#xff0c;进入Google Earth Engine 官网平台&#xff08;以下简称GEE平台&#xff09;&#xff0c;正常登录该平台需要利用邮箱进行申请&#xff0c;申请通过后可以正常…

图书馆自助借书机怎么借书

图书馆自助借书机借书流程如下&#xff1a; 1. 找到图书馆自助借书机&#xff0c;在机器上选择借书功能。 2. 输入自己的借书卡号或者身份证号码&#xff0c;如果是第一次借书&#xff0c;可能需要进行注册。 3. 输入图书的条形码号码&#xff0c;可以通过扫描条形码或者手动输…