//addr :代表8位地址 addr16:代表16位地址 data :立即数
//移位指令
1. 算术左移指令ASL
符号码格式 | 指令操作码 | 寻址方式 |
ASL | 0A | 累加器寻址 |
ASL $data | 06 | 零页寻址 |
ASL $addr16 | 0E | 绝对寻址 |
ASL $addr,X | 16 | 零页X变址 |
ASL $addr16,X | 1E | 绝对X变址 |
ASL移位功能是将字节内各位依次向左移1位,最高位移进标志位C中,最底位补0
ASL执行结果相当于把移位前的数乘2
例如 //ASL的应用
2000:LDA #$20 //把立即数20送累加器A
2002:ASL //累加器A的内容算术左移
2003:STA $2100 //把累加器A的内容送地址2100
2006:ASL $2100 //地址2100的内容算术左移
2009:LDA $2100 //地址2100的内容送累加器A
200C:RTS //程序结束
2. 逻辑右移指令LSR
符号码格式 | 指令操作码 | 寻址方式 |
LSR | 4A | 累加器寻址 |
LSR $data | 46 | 零页寻址 |
LSR $addr16 | 4E | 绝对寻址 |
LSR $addr,X | 56 | 零页X变址 |
LSR $addr16,X | 5E | 绝对X变址 |
该指令功能是将字节内各位依次向右移1位,最低位移进标志位C,最高位补0.
该操作对于无符号数和正数相当于乘1/2
例: //拆字程序,将地址2100单元的高四位送地址2101的低四位,将地址2100单元的低四位送地址2102的底四位
并且清除地址2101和地址2102的高四位
2000:LDA $2100 //地址2100的内容送A
2003:AND #$0F //A和0F进行逻辑与运算,屏蔽了A的高四位
2005:STA $2102 //结果送地址2102
2008:LDA $2100
200B:LSR //将A的高四位挪到低四位,高四位补0
200C:LSR
200D:LSR
200E:LSR
200F:STA $2101 //结果送地址2101
2012:RTS
3. 循环左移指令ROL
符号码格式 | 指令操作码 | 寻址方式 |
ROL | 2A | 累加器寻址 |
ROL $data | 26 | 零页寻址 |
ROL $addr16 | 2E | 绝对寻址 |
ROL $addr,X | 36 | 零页X变址 |
ROL $addr16,X | 3E | 绝对X变址 |
ROL的移位功能是将字节内容连同进位C一起依次向左移1位
4. 循环右移指令ROR
符号码格式 | 指令操作码 | 寻址方式 |
ROR | 6A | 累加器寻址 |
ROR $data | 66 | 零页寻址 |
ROR $addr16 | 6E | 绝对寻址 |
ROR $addr,X | 76 | 零页X变址 |
ROR $addr16,X | 7E | 绝对X变址 |
ROR的移位功能是将字节内容连同进位C一起依次向右移1位