#4 編程(Part.4)密碼鎖


這一關(guān)也是屬于那種
可以很簡(jiǎn)單也可以很難的關(guān)
先上標(biāo)準(zhǔn)答案,最簡(jiǎn)單最無(wú)腦
從1開(kāi)始試直到正確答案,暴力窮舉法
總時(shí)鐘刻1029總用時(shí)61740
很炸裂的延遲


但是就在關(guān)卡說(shuō)明那里
也已經(jīng)三番四次地在說(shuō)
如果你猜的數(shù)字比他大就會(huì)嗶嗶叫(輸入1,否則0)
所以很顯然這關(guān)他想要的解法是要通過(guò)比較
我第一個(gè)想到的想法是二分法
先輸出128,比較,然后±64,接著比較±32,±16…直到出結(jié)果
最多比較7-8次就可以出結(jié)果,延遲應(yīng)該挺低的
但是我忽略了一個(gè)問(wèn)題
我的代碼寫(xiě)了將近90行
但是這是OVERTURE架構(gòu),立即數(shù)最大是63
也就是指令尋址最大不能超過(guò)63
那我63之后的代碼就無(wú)法被條件跳轉(zhuǎn)到
就很麻煩
(OVERTURE架構(gòu)真的難用,太喜歡LEG架構(gòu)了,速速學(xué)習(xí)?。?/p>
為此我決定寫(xiě)一個(gè)閹割版的二分法
直接上63,126,189,252
都比較一遍,然后找到小區(qū)間再-1-1-1
比如我找到數(shù)字再63-126之間
那我就126,125,124…不斷地往下輸出
我的二分只分兩次,分到63就不分了
這樣子把代碼壓縮到42行就能成功運(yùn)行
最終時(shí)鐘刻壓到了323,總用時(shí)19380
縮短到了窮舉法的1/3,很不錯(cuò)
雖然我覺(jué)得這個(gè)數(shù)字還不是很理想
但是我暫時(shí)沒(méi)有什么好的想法了
我想過(guò)把一開(kāi)始的二分步進(jìn)改成31/32
這樣子分多一次應(yīng)該就可以再少一點(diǎn)
但是在想怎么處理溢出,給我腦袋CPU干燒了
所以就作罷
只能說(shuō)OVERTURE架構(gòu),能力有限(大噓

下面放上代碼



OVERTURE架構(gòu)指令集:
最高兩位為操作碼,00立即數(shù)模式,01算術(shù)模式,10復(fù)制模式,11條件跳轉(zhuǎn)模式
立即數(shù)模式下,1-6位是立即數(shù),寫(xiě)入0號(hào)寄存器
算術(shù)模式下,1-3位為算術(shù)命令,000為OR,001為NAND, 010NOR, 011為AND, 100為ADD, 101為SUB, 110和111為UNUSED
復(fù)制模式下,1-3為目的,4-6為源,000-101對(duì)應(yīng)寄存器,110對(duì)應(yīng)輸入/輸出,111UNUSED
條件跳轉(zhuǎn)模式下,1-3位為條件,000為NEVER, 001為=0, 010為<0, 011為<=0, 100為ALWAYS, 101為!=0, 110為>=0, 111為>0
自定義匯編別名:
input/output: 00000110(6)
AND: 01000011(67)
add: 01000100(68)?
sub: 01000101(69)
copy: 10000000(128)
equal_0: 11000001(193)
less_0: 11000010(194)
always: 11000100(196)
greater_0: 11000111(199)
