本節書摘來自異步社群《例說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的内容相加,以結果為位址,再跳到該位址。