Lazy loaded image
🗒️FIT 1047 ASM 2 笔记
Words 1678Read Time 5 min
2025-4-6
2025-4-8
type
status
date
slug
summary
tags
category
icon
password

前言

ASM 2 的难度确实比 ASM 1 高出不少,但是我们心不慌手不抖,解题跟着思路走。
 

Part 2

💯
Part 2 百分百

Task 1 反向编码

这一个Task要我们将Marie汇编好的代码转换成去,具体的转换方法可以参考如下步骤

1. 找到数字

在图片上 从0000开始一次读取四位数

2. 找到对应的表

notion image
打开网页上的”Instruction Set”找到对应的指令以及后面的内容
如:
数字为 1025 第一位是[1],所以搜索0x1,找到指令Load 后面三位是 [025],所以最终指令是 Load 025 数字为 302E 第一位是[3],所以搜索0x3,找到指令Add 后面三位是 [02E],所以最终指令是 Add 02E
💡
注意事项:
所有的[0000]可以用HEX 0来表达
在[7000]后面的所有指令都使用HEX + [四位数] 来表达
如: HEX FF23 或者 HEX 1032

3. 重复步骤1,2直到转换了最后一个不为[0000]编码

程序理解

在做完Task 1之后,以及在做Task 2 和 3 之前,我们先需要了解这个程序有什么用。

✅ 程序的核心功能总结

整个程序的作用就是:
“将内存中的一组整数逐个除以一个固定的除数,然后输出每个数的 余数 。”

🔄 数据流流程

  1. 初始化指针:程序一开始将 数据列表 的首地址存到 指针 中,用于后续访问数据。
  1. 读取当前元素:通过 LoadI 指针 取出当前整数值。
  1. 判断是否结束:如果该值为 0,说明到达列表末尾,程序终止。
  1. 计算余数:调用 除法 子程序,对该数除以 除数,获取余数。
  1. 输出结果:将余数通过 输出 指令输出。
  1. 指针后移:将 指针 加 1,移动到下一个元素。
  1. 重复步骤 2-6,直到遇到列表末尾。
 

Task 2

在了解以后,将每个硬编码地址修改成有意义的变量名。
变量名可以参考一下内容,(当然不能是中文,这里写中文是为了防止大家都写了一样的名字)
💡
多多观察JumpI JnS Jump 可以快速的找到方程 Add Subt Load 后面的则大部分为变量名
SkipCond 大部分为跳转条件 - 如:继续循环,返回函数 等

Load 25
值得注意的是这里的25是十六进制下的
对应的行数理应是 ,因为第1行实际上是”第0行”
结论: Load 25 其中 25因该被替换成的变量名理应与第38行的代码所对应。

Task 3

Task 3的批注,可以按照里面的思路,

可备注内容

  • 函数
    • 输入 / 输出
    • 用法
  • 参数
  • 判断条件
  • Loop循环

Part 3

请不要抄我的变量名!!!!!!!!!!!!!!!!!!!!!! 想象一下大家都看了这个攻略,都用了相同的变量名 😐 [都懒得喷] 为了自己,请不要抄变量名!!!

Task 1

需要把整个屏幕变成白色,参考下方伪代码
notion image
notion image
💡
第一个Task就是是一个简单的for循环,只需要理解题目意思就没有任何问题了。

Task 2

打印选定的输入字母
notion image
notion image
💡
第二个Task总体感觉下来是三个Task中最难的,难点在于同时追踪屏幕坐标以及字体颜色地址,同时还需要再循环中做出判断每四个需要换一行。

Task 3

notion image
notion image
💡
第三个Task只需要调用Task 2就可以了,由于Marie中没有sleep,所以在这个考试中写一个count down的sleep function就可以实现了

🔁 ASCII 到字体表的偏移怎么算?

  • 假设你的 Font 从字符 'a' 开始,对应 ASCII 97(十进制)
  • 所以字符 'a' 的偏移是 (charCode - 97)
  • 'b'(98 - 97) * 32 = 32,以此类推

Task 4

就做一个有创意的子函数[subroutine]就可以了,这里给大家提供一些例子:
  • 字体滚动【横向滚动,垂直滚动 etc】
  • 一面同时同时打印多个字
  • 字体变换颜色
老师也不会刁难你,只要不是写了一俩行的代码 老师们都愿意给分的!