作者kmy3214 (3214)
看板ASM
标题Re: [问题] 系统程式里的组语
时间Fri Jan 6 23:45:57 2012
※ 引述《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