當前位置:編程學習大全網 - 編程語言 - 看看這道單片機題

看看這道單片機題

堆棧介紹:日常生活中,我們都註意到過這樣的現象,家裏洗的碗,壹只壹只摞起來,最晚放上去的放在最上面,而最早放上去的則放在最下面,在取的時候正好相反,先從最上面取,這種現象我們用壹句話來概括:“先進後出,後進先出”。請大家想想,還有什麽地方有這種現象?其實比比皆是,建築工地上堆放的磚頭、材料,倉庫裏放的貨物,都是“先進後出,後進先出”,這實際是壹種存取物品的規則,我們稱之為“堆棧”。

在單片機中,我們也能在RAM中構造這樣壹個區域,用來存放數據,這個區域存放數據的規則就是“先進後出,後進先出”,我們稱之為“堆棧”。為什麽需要這樣來存放數據呢?存儲器本身不是能按地址來存放數據嗎?對,知道了地址的確就能知道裏面的內容,但如果我們需要存放的是壹批數據,每壹個數據都需要知道地址那不是麻煩嗎?如果我們讓數據壹個接壹個地放置,那麽我們只要知道第壹個數據所在地址單元就能了(看圖2)如果第壹個數據在27H,那麽第二、三個就在28H、29H了。所以利用堆棧這種辦法來放數據能簡化操作

那麽51中堆棧什麽地方呢?單片機中能存放數據的區域有限,我們不能夠專門分配壹塊地方做堆棧,所以就在內存(RAM)中開辟壹塊地方,用於堆棧,但是用內存的哪壹塊呢?還是不好定,因為51是壹種通用的單片機,各人的實際需求各不相同,有人需要多壹些堆棧,而有人則不需要那麽多,所以怎麽分配都不合適,怎樣來解決這個問題?分不好幹脆就不分了,把分的權利給用戶(編程者),根據自已的需要去定吧,所以51單片機中堆棧的位置是能變化的。而這種變化就體現在SP中值的變化,看圖2,SP中的值等於27H不就相當於是壹個指針指向27H單元嗎?當然在真正的51機中,開始指針所指的位置並非就是數據存放的位置,而是數據存放的前壹個位置,比如壹開始指針是指向27H單元的,那麽第壹個數據的位置是28H單元,而不是27H單元,為什麽會這樣,我們在學堆棧命令時再說明。其它的SFR,我們在用到時再介紹。

push是壓入。 pop就是彈出

DPTR是數據指針,16位。 DPH,HE DPL分別是他的高低位。

POP DPH sp指向52H,所以把52裏的內容送給DPH,DPH=0FFH,然後sp減1

POP DPL 指向51H,所以把51裏的內容送給DPL=0FFH,然後sp減1

MOV DPTR,#4000H 把4000H送給0FFFF地址,也就是片外存儲器

RL A 左移A 00000010變為00000100,變為04H

MOV B,A 把A送給B寄存器,此時B為04H

MOVC A,@A+DPTR DPTR=4000H,A=04H,把他們相加的地址裏的內容送給A,為30H

PUSH A 然後壓入堆棧,此時SP雖然為50H,但存儲的地址需+1,為51H

MOV A,B 重新把B的內容04H送還給A,A重新變為04H

INC A 加1指令,A=04H

MOVC A,@A+DPTR DPTR=4000H,A=05H,把他們相加的地址裏的內容送給A,為50H

PUSH A 再壓入A

RET 返回

ORG 4000H

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

4000H 4001H 4002H 4003H 4004H 4005H

說的夠明白了,答案妳自己思考

我知道這裏對於新手來說是壹道坎,

  • 上一篇:求電腦配置
  • 下一篇:二叉樹怎麽刪除節點?
  • copyright 2024編程學習大全網