[ZLG-ARM] ARM指令集需要注意的地方

[复制链接]
1607|1
 楼主| reeper 发表于 2009-4-9 15:00 | 显示全部楼层 |阅读模式
一、ARM指令集是32位的,程序的启动都是从ARM指令集开始,包括所有异常中断都是自动转化为ARM状态,并且所有的指令都可以是有条件执行的。<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;二、ARM指令集是Load/Store型的,只能通过Load/Store指令实现对系统存储器的访问,而其他的指令都是基于处理器内部的寄存器操作完成的,这和INTEL汇编是不同的,初学者很不易理解。<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;三、指令的后缀:<br />&nbsp;&nbsp;&nbsp;&nbsp;'S'&nbsp;&nbsp;可选后缀,若指定S,则根据指令执行的结果更新CPSR中的条件码。很多初学着不知道怎么更新,若这条指令执行完以后,对ARM程序状态寄存器的条件码标志(N,Z,C,V)的影响。<br />&nbsp;&nbsp;&nbsp;&nbsp;'!&nbsp;'&nbsp;表示在完成数据操作以后,将更新基址寄存器,并且不消耗额外的时间。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如:LDR&nbsp;R0,&nbsp;[R1,&nbsp;#4]!&nbsp;他相当于&nbsp;R0&nbsp;&lt-&nbsp;mem32[R1+4]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1&nbsp;=&nbsp;R1+4;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;'^'&nbsp;&nbsp;LDMFD&nbsp;R13!,&nbsp;(R0-R3,&nbsp;PC)^&nbsp;//'^'表示一条特殊形式的指令。(在从存储器中装入PC的同时,CPSR也得到恢复)。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;四、#号后面加0x或&表示十六进制:#0xFF,&nbsp;#&FF<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#号后面加0b表示二进制。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#号后面加0d表示十进制。&nbsp;&nbsp;&nbsp;<br />*******************************************************************************<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;五、立即数寻址<br />&nbsp;&nbsp;&nbsp;&nbsp;每个立即数都是采用一个8位的常数循环右移偶数位间接得到。<br />&nbsp;&nbsp;&nbsp;&nbsp;初学者不易理解:一个32位的指令不可能全部用来保存32位的立即数,所以从指令的编码格式上分析,在指令编码中只分配了12位来存储立即数,其中4位用来保存右循环值,8位用来保存一个常数,所以并不是每一个32位的立即数都是合法的。<br />如果需要满足32位立即数占用指令编码格式:<br />一般通过8位立即数+循环右移来实现32位立即数指令编码。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;六、寄存器寻址<br />&nbsp;&nbsp;&nbsp;&nbsp;ADD&nbsp;R3,R2,R1,LSR&nbsp;#2&nbsp;//寄存器R1的内容右移了两位,但是注意本指令执行完毕以后R1的内容并不改变。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;七、前变址、自动变址和后变址<br />&nbsp;&nbsp;&nbsp;&nbsp;1、前变址:LDR&nbsp;R0,[R1,#4]&nbsp;&nbsp;&nbsp;//R1寄存器的内容先加4,然后执行操作,但操作完毕以后,R1的内容不变。<br />&nbsp;&nbsp;&nbsp;&nbsp;2、自动变址:上面总结指令后缀时提到'!',表示自动变址(参考上面三)。<br />&nbsp;&nbsp;&nbsp;&nbsp;3、后变址:LDR&nbsp;R0,[R1],#4&nbsp;&nbsp;&nbsp;//先进行操作然后R1+4-&gtR1,操作完毕后,R1&nbsp;=&nbsp;R1+4。不需要'!'号。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;八、堆栈寻址<br />&nbsp;&nbsp;&nbsp;&nbsp;一定要注意:堆栈操作总是要指定自动变址的,否则会覆盖以前保存的内容。<br />********************************************************************************<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;九、乘法指令<br />&nbsp;&nbsp;&nbsp;&nbsp;1、乘法指令不支持第二操作数为立即数。<br />&nbsp;&nbsp;&nbsp;&nbsp;2、结果寄存器不能同时作为第一源寄存器。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;32位:MUL&nbsp;Rd,Rm,Rs<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MUL&nbsp;Rd,Rm,Rs&nbsp;&nbsp;//Rd和Rm不能为同一寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;64位:MUL&nbsp;RdHi,RdLo,Rm,Rs&nbsp;//RdHi、RdLo和Rm不能为同一寄存器,RdHi和RdLo不能为同一寄存器。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;十、跳转指令<br />&nbsp;&nbsp;&nbsp;&nbsp;1、BL和BLX跳转是硬件自动将下一条指令地址保存到LR(R14)中,不需要自己写指令。<br />&nbsp;&nbsp;&nbsp;&nbsp;2、当指令跳转到32MB地址空间以外时,将产生不可预料的结果。<br /><br />
zcying 发表于 2009-4-9 15:01 | 显示全部楼层

现在基本都是C了,汇编只要能看懂就OK了!

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

185

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部