Re: [問題] 系統程式裡的組語

看板ASM (組合語言)作者 (3214)時間13年前 (2012/01/06 23:46), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《denille (阿丹)》之銘言: : 這是系統程式書裡,其中一章在介紹組語的,是在介紹多層次的副程式呼叫 : 順便附上我的想法...不知道對不對... : 程式碼: : LD R2, x 將x值載入R2暫存器 : PUSH R2 將R2推入堆疊 : CALL f1 呼叫副程式f1 : ST R1, y 將R1暫存器的內容存到y裡(雖然我不知道存了什麼...) : RET : x: WORD 1 x有一個字組的空間 : y: RESW 1 y保留了一個字組空間 (x和y差在哪?) : f1: : POP R2 將R2推出來 : PUSH LR 將LR推入以返回位址 : ST R2, t 將R2暫存器的值存到t裡 : LD R3, pt 將pt載入R3,因為pt就是t,所以R3的值現在是x?不懂幹麻要分pt跟t? : PUSH R3 將R3推入 : CALL f2 呼叫f2 : ST R1, b 把R1暫存器的值存到b裡 : ADD R1, R1, R1 把R1的值變成二倍 : POP LR 將LR推出 : RET : t:RESW 1 : b:RESW 1 : pt:WORD t : f2: : POP R2 將R2推出,但剛剛在f1不是推出來了?可以再推一次? POP的定義是把堆疊中最上面的拿出來,放到你所指定的記憶體位置 這邊你是用R2暫存器來存。 而根據你之前的程式來看,call f2前有先PUSH R3, 所以這段應該是把之前的R3放到R2。 那為何要如此做呢?這邊我記不太清楚,好像是呼叫時暫存器要存入你起始位置 當程式看到RET就會回到你原來的位置。 : LD R3, [R2] 將R2記憶體值裡的內容載入到R3,但剛剛R2的值不是存到t裡了? : 現在R2裡還有資料? 接著把R2的內容在放到R3,所以這邊這可以取回呼叫前R3的值。 : LDI R4, 5 將數值5載入R4 : ADD R1, R3, R4 R3和R4值相加,載入R1 : ST R1, r 將R1的值存入r : RET : r:RESW 1 : 另外,為什麼要pt: WORD t 再 t: RESW 1呢? : pt: WORD t 代表pt的初始值為t,t也是一個變數,有1個字組的空間? : 那為什麼在f1裡,ST R2, t 不寫成 ST R2, t 呢? : LD R3, pt LD R3, t : 好像pt跟t都各是獨立的空間? 我猜是只任意兩個不同記憶體區間 : 請大家教教小弟吧! 我直接回覆在上面了,其他地方我沒細看,也不知你在說什麼? 另外你貼這種程式一般很難看懂吧, 首先你要先說你哪些是暫存器(R)、哪些是副程式(f)、哪些是記憶體位置 要不然別人光看程式就頭大,然後懶得看了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 49.158.23.163
文章代碼(AID): #1F1nSuoo (ASM)
討論串 (同標題文章)
文章代碼(AID): #1F1nSuoo (ASM)