看板 NTUE-CS102 關於我們 聯絡資訊
#1CuCS0L4 (NTUE-CS102) 舊文再用超安心(?) 雖然說觀念一樣 寫成asm硬生生多個七十行實在很傷腦(抓頭) 所以這篇寫點code怎麼寫好了(?) 內建堆疊很方便,跨副程式用同一組有好有壞這樣 -- main開頭跟上份作業一樣讀字串、用esi當指標抓字串每byte裝什麼這樣 再來以下就能全部重新改寫了 首先是每個字元抓近來號開始比較是+-*/或(),中間只要是,就je到相關的處理部分 : '+'=43 '-'=45 '*'=42 '/'=47 '('=40 ')'=41 都不是,那就能直接往下寫個數字的輸出,一個WriteInt後inc esi解決抓下一個值 如果是+-*/,又分堆疊是不是空的或最頂端運算子優先全跟讀到的進行比較的結果是什麼 空的就直接PUSH edx就好,沒什麼問題....另外寫個變數紀錄stack高度就好(?) : 對不起我沒認真念書(跑 要比較優先權的話,就要另外寫個判斷.... 我是多設兩個mem變數,把stack裏頭抓出來的跟字串取得的值存進去 再把對應的優先權存到eax/edx裏頭,然後比較之後決定處理行為,再把值讀回來做處理 大概像這樣 -- movzx edx,BYTE PTR[esi] ... ... mov instring,edx cmp edx,43 ; (if edx==43) jmp strlow ;edx=1 je strlow cmp edx,45 ; (else if edx==45) jmp strlow ;edx=1 je strlow mov edx,2 ; (else) edx =2 jmp strover strlow: mov edx,1 strover: ... ... mov edx,instring 是說我覺得就是這種判斷式讓行數整個爆多-A- -- 對應'('是慣例的直接PUSH下去 ')'的話,另外寫個函式部分去取stack裏頭的東西直到抓到'('時跳出 配合一些特性大概寫成這樣算比較單純 POPOUTTO: sub stackheight,1 pop eax cmp eax,40 je POPOUTTO_END call WriteChar jmp POPOUTTO POPOUTTO_END: 最後抓完字串抓到EOL之後,再把stack裏頭的東西全部POP出來就結束了 嗯...比起上份來說,不難...嗎(?) -- 本命 ○楽園の巫女  博麗 霊夢 職業:博麗神社の巫女さん  Hakurei Reimu   能力:主に空を飛ぶ程度の能力 @東方project系列 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 120.127.47.30 ※ 編輯: game0416 來自: 120.127.47.30 (12/02 11:13)
dosomethnig:恭喜欺侮海成為第十人 12/02 13:18
pk873:遲來的人強真好 Q口Q 小弟太晚來跪安了 12/05 00:10
j2612280:遲來的人強真好 Q口Q 小弟太晚來跪安了 12/05 00:11