天天看點

《例說8051:單片機程式設計案例教程》——2-5 尋址方式

本節書摘來自異步社群《例說8051:單片機程式設計案例教程》一書中的第2章,第2-5節,作者 張義和,陳敵北,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

所謂“尋址”,簡單地講,就是找到操作數位址的方法。8051提供5種尋址方式,說明如下。

直接尋址

直接尋址(direct addressing)是直接在操作數字段裡,指定操作數所在位置的位址,包括特殊功能寄存器(如p1、p2、psw等),例如:

将存儲器40h位址的内容加到acc裡。又如:

将acc的内容複制到存儲器30h位址裡。

間接尋址

間接尋址(indirect addressing)是利用間接寄存器(index register,r1或r0,标示為r_i)、基址寄存器(sp或dptr)間接訓示操作數所在位置的位址,而在間接寄存器或基址寄存器之左要加上“@”符号,例如:

以r0的内容為位址,将存儲器該位址的内容加1。又如:

以dptr的内容為位址,将acc的内容複制到外部存儲器該位址裡。

寄存器尋址

寄存器尋址(register addressing)是以寄存器(即r0到r7)的内容為操作數,例如:

将r5的内容與acc的内容進行and運算,其結果放入acc裡。又如:

将r7的内容減1,若其結果不等于0,則跳到loop處;若其結果等于0,則執行下一條指令。

立即尋址

立即尋址(immediate addressing)是直接在操作數字段裡放置操作數,而在操作數左邊必須放置一個“#”符号,例如:

将0fh與acc的内容進行or運算,其結果放入acc裡。又如:

若acc的内容不等于10,則跳到loop處;若acc的内容等于10,則執行下一條指令。

變址尋址

變址尋址(index addressing)與間接尋址有點類似,不過,變址尋址同時使用變址寄存器與基址寄存器,使用acc作為變址寄存器,以存儲偏移(offset)、pc或dptr為基址寄存器。将基址與偏移相加後,才是操作數所在位置的位址,例如:

先将pc的内容與acc的内容相加,以其結果為位址,再将該位址的内容複制到acc裡。又如:

先将dptr的内容與acc的内容相加,以結果為位址,再跳到該位址。