我有这个保险箱1:
START:
PUSH AX
MOV word [0D5h], 0
MOV CX, 2
looper:
add [0D5h], AX
MOV AX, [0D5h]
MUL CX
INC CX
cmp word [0D5h], 0D287h
jne looper
POP AX
JMP START
而且我被困在如何找到 AX 上,因为我可以随时将
[0D5h]
设置为 0D287h
来打破内部循环,所以我知道框架可能会是这样的:
start:
;... get ax
mov word [0D5h], 0D287h
jmp start
至少我是这么理解的,请问有人有什么想法吗?
脚注1:安全挑战
对于那些不熟悉安全挑战的人,我先给出一个基本的解释:
你得到一个保险箱,它是 NASM 编译的汇编 8086 代码,它执行算术操作并且永远循环,为了赢得钥匙,它需要比保险箱运行更多的时间,这意味着它也必须永远循环,但也停止保险箱的循环。您可能会问,除了内存之外,钥匙和保险箱在所有方面都是分开的,例如,如果您想停止这个保险箱:
start:
mov [0DAh], ax
jmp start
这个保险箱的钥匙是:
start:
mov bx, [0DAh]
mov byte [bx], 0cch
jmp start
我从来不明白这些“安全挑战”是什么意思,但我立即看到了接下来的 2 个解决方案,它们阻止了保险箱的内循环,然后无限地重复:
jne looper
从未被采用jne looper
被取 1 次[0D5h]
处的字值依次变为x, 3x, 12x, 60x, 360x, ...