type
status
date
slug
summary
tags
category
icon
password
前言
ASM 2 的难度确实比 ASM 1 高出不少,但是我们心不慌手不抖,解题跟着思路走。
Part 2
Part 2 百分百Task 1 反向编码
这一个Task要我们将Marie汇编好的代码转换成去,具体的转换方法可以参考如下步骤
1. 找到数字
在图片上 从0000开始一次读取四位数
2. 找到对应的表

打开网页上的”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 之前,我们先需要了解这个程序有什么用。
✅ 程序的核心功能总结
整个程序的作用就是:“将内存中的一组整数逐个除以一个固定的除数,然后输出每个数的余数
。”
🔄 数据流流程
- 初始化指针:程序一开始将
数据列表
的首地址存到指针
中,用于后续访问数据。
- 读取当前元素:通过
LoadI 指针
取出当前整数值。
- 判断是否结束:如果该值为
0
,说明到达列表末尾,程序终止。
- 计算余数:调用
除法
子程序,对该数除以除数
,获取余数。
- 输出结果:将余数通过
输出
指令输出。
- 指针后移:将
指针
加 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
需要把整个屏幕变成白色,参考下方伪代码


第一个Task就是是一个简单的for循环,只需要理解题目意思就没有任何问题了。
Task 2
打印选定的输入字母


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


第三个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】
- 一面同时同时打印多个字
- 字体变换颜色
等
老师也不会刁难你,只要不是写了一俩行的代码 老师们都愿意给分的!