.. Kenneth Lee 版权所有 2017-2020
:Authors: Kenneth Lee :Version: 1.0
指令寻址模式
昨天有人私信问我,怎么区分不同汇编指令的寻址模式。我自己读书的时候学汇编,被这 个烂概念影响了很久,所以简单描述一下,让初学者不要陷入我当初一样的陷阱。
其实寻址模式根本就不是汇编写作人员的问题,而是指令实现者的问题,教汇编的人把这 种问题引进来,完全不着边际。属于以己昏昏而欲使人昭昭,把问题搞乱。
指令设计需要规整,否则相应的电路就会复杂,所以RISC的基本设计是最有效的,即使作 为CISC的代表的x86构架,现在在微码设计上也是类RISC的。RISC常常让每条指令都定长, 也是类似的目的。比如ARMv/7/v8的指令,都是32位的(我们先忽略Thumb一类的优化)。
好了,现在比如你要做一个计算,add r1, r2, 100,这表示r1=r2+100。你要表示这个指 令需要占用其中几位,比如我用8位,这可以表示256条指令,不多,对付着用吧。
然后你要表示两个寄存器,假设我们有32个寄存器,这样就要占5位,指令中有两个寄存器 ,就要10位了。剩下的,我们全部给那个100来用,就剩下14位了,所以这个加法指令最多 就能加一个不大于16K的数字,如果这个数字还需要有符号,就只有8K了。
更大的数根本就放不进去。
如果你非要放这么大的数,那只能把这个东西放到寄存器里面,比如我们可以支持这样来 写这条指令:add r1, r2, r3,这样3个寄存器只需要15位,还多出一些位来用的。但这样 你想加一个普通的数字,就要这样写:::
ldh r3, 0x1234 ;加载上半段
ldl r3, 0x4567 ;加载下半段
add r1, r2, r3
就是因为指令设计上的这种限制,所以才引入了所谓的:
立即数寻址:直接在指令中指定数据
寄存器寻址:指令中指定寄存器
寄存器基址寻址:指令中指定寄存器,用寄存器的内容作为内存的地址得到数据
寄存器基变址寻址:指令中指定寄存器和立即数,用寄存器的内容加上立即数作为地址得 到数据
对学写汇编的人来说,引入这些概念毛用没有,直接说指令的语义就够了。