日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 芯聞號 > 充電吧
[導讀]有這樣一個問題:已知程序執(zhí)行前有 A = 02H,SP = 52H,(51H) = FFH,(52H) = FFH。執(zhí)行下列程序:? ? POP ? DPH? ? POP ? DPL? ? MOV ?

有這樣一個問題:


已知程序執(zhí)行前有 A = 02H,SP = 52H,(51H) = FFH,(52H) = FFH。


執(zhí)行下列程序:


? ? POP ? DPH

? ? POP ? DPL

? ? MOV ? DPTR, #4000H ?

? ? RL ? ?A

? ? MOV ? B, A

? ? MOVC ?A, @A + DPTR

? ? PUSH ?A

? ? MOV ? A, B

? ? INC ? A

? ? MOVC ?A, @A + DPTR

? ? PUSH ?A

? ? RET


? ? ORG ? 4000H

? ? DB ? ?10H, 80H, 30H, 50H, 30H, 50H


求程序執(zhí)行后:


A=( ?)H、SP=( ?)H、(51H) =( ?)H、(52H)=( ?)H、PC=( ? ?)H。


------------------------------


這個問題,在百度知道出現(xiàn)過很多次,搜一下,就會出來幾十個鏈接。


但是回答正確的,確實不多。


有的提問者,好像是說,這是什么學校教材上的習題。


在這個程序中,寫錯了兩條指令:


非法指令:PUSH ?A

應該寫成:PUSH ?ACC


做為教材來說,這可是一個 BUG 啊,呵呵



這個程序,是利用 RET 指令來進行多路分支。


程序中,有兩條查表指令:MOVC ?A, @A + DPTR,


當 A = 0 時,將從 4000H 處,先后讀出 10H、80H;

當 A = 1 時,將從 4000H 處,先后讀出 30H、50H;

當 A = 2 時,將從 4000H 處,先后讀出 30H、50H。


本題目的條件已經給出:A = 02H,那么就是讀出了 30H、50H。


讀出數(shù)據(jù)后,先后壓棧,再執(zhí)行 RET。


RET 指令,就是把堆棧中的兩個字節(jié),送到 PC。


那么,PC = 5030H,就是這么來的。


全部的空格,填寫如下:

A=(50)H、SP=(50)H、(51H) =(30)H、(52H)=(50)H、PC=(5030)H。


------------------------------


本程序,是個子程序結構,應該用 CALL 指令來調用。


在本程序開始處,用 POP 指令,拋棄了 CALL 自動保存的返回地址。


騰出了兩個字節(jié)的堆棧空間,又壓入兩字節(jié)數(shù)據(jù),然后,再返回。


RET 返回指令,就會用剛剛壓入兩字節(jié)數(shù)據(jù),當做返回地址。


本程序,是屬于偷梁換柱,還是移花接木 ?


------------------------------


下面逐條解釋一下:


? ? POP ? DPH

? ? POP ? DPL ? ? ? ? ? ;彈出兩次,SP = SP - 2 = 50H


? ? MOV ? DPTR, #4000H ?

? ? RL ? ?A ? ? ? ? ? ? ;乘以2

? ? MOV ? B, A ? ? ? ? ?;B = 04H


? ? MOVC ?A, @A + DPTR ?;取出第4個字節(jié)30H

? ? PUSH ?ACC ? ? ? ? ? ;SP = SP + 1 = 51H, (51H)=30H


? ? MOV ? A, B

? ? INC ? A ? ? ? ? ? ? ;A = 05H

? ? MOVC ?A, @A + DPTR ?;取出第5個字節(jié)50H

? ? PUSH ?ACC ? ? ? ? ? ;SP = SP + 1 = 52H, (52H)=50H


? ? RET ? ? ? ? ? ? ? ? ;子程序返回指令



執(zhí)行 RET 指令時,是從堆棧中彈出兩個字節(jié)到 PC 的高、低八位。


即:

(SP) → PCH,然后 SP - 1 → SP;

(SP) → PCL,然后 SP - 1 → SP。


即:

(52H) = 50H → PCH,SP = 51H

(51H) = 30H → PCL,SP = 50H


那么,PC = 5030H,就是這么來的。


------------------------------


進行多路分支,還有簡單一點的方法。


如,利用指令:JMP ?@A + DPTR,就可以。


那么,前面的程序,可以改為:


? ? MOV ? DPTR, #4000H ?

? ? RL ? ?A

? ? MOV ? B, A

? ? MOVC ?A, @A + DPTR?

? ? XCH ? A, B


? ? INC ? A

? ? MOVC ?A, @A + DPTR ;先后讀出兩字節(jié)


? ? MOV ? DPH, A ? ? ? ;把讀出數(shù)據(jù)送到 DPTR

? ? MOV ? DPL, B


? ? CLR ? A ? ? ? ? ? ?;A=0

? ? JMP ? @A + DPTR ? ?;以 DPTR 內容為目的地,轉移


? ? ORG ? 4000H

? ? DB ? ?10H, 80H, 30H, 50H, 30H, 50H


程序這樣寫,就不涉及堆棧了,也就沒有前一個程序那么復雜的推導。


理解起來,可以輕松些。


這個程序,沒有使用 RET 指令,那么,就不要用 CALL 來調用了。


要用 JMP 指令來應用本程序。


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關閉