本节书摘来自异步社区《例说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的内容相加,以结果为地址,再跳到该地址。