📄 32 位规则.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0053)http://www.linuxforum.net/books/mhss/arm/32rules.html -->
<HTML><HEAD><TITLE>32 bit rules</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META http-equiv=Content-Language content=zh-cn>
<META content="MSHTML 6.00.2600.0" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId><!-- /assembler/32rules.html --><!-- --><!-- (C) Copyright 2001 Richard Murray --><!-- Designed by Richard Murray --><!-- rmurray@heyrick.co.uk --><!-- --></HEAD>
<BODY text=#000000 vLink=#002288 link=#0022dd bgColor=#f0f0f0>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD align=middle width=100></TD>
<TD>
<H1 align=center><FONT color=#800080>32 位规则</FONT></H1></TD>
<TD align=middle width=100></TD></TR></TBODY></TABLE>
<P>
<UL>
<LI>不要使用有 P 后缀的测试指令: TEQP、TSTP、CMPP、CMNP。
<LI>检查更改 PC、R14 的如 BIC 和 ORR 这样的指令,和把一个寄存器复制到 PC 的指令。例如,<CODE>ORRS PC, R14,
#1<<28</CODE> 将不能工作。实际上,不要使用带 S 标志设置的写到 PC 的任何指令。
<LI>在数据处理操作中不要使用 R15 (PC) 作为移位寄存器。
<LI>在 LDR/STR 中,不要使用 PC 作为寄存器偏移量并不要写回到它。
<LI>在过后变址 LDR/STR 中,Rm(变址)和 Rn(基址)不能是同一个寄存器。类似的,对于涉及写回的任何指令,Rm 和 Rn
都应该是不同的寄存器。
<LI>LDM/STM 在用户模式下不使用 S 位。这意味着,不要使用‘^’后缀(例如 <CODE>LDMFD R13!, {PC}^</CODE>)。
<LI>BL 不保存状态寄存器。这必须显式的进行,但是这样的代码将不能在 ARM2 或 ARM3 上运行,因为它们不支持 MRS/MSR 指令。
<LI>还要注意,<B>不可能</B>见到被调用者的标志,所以不应该恢复你不知道其状态的标志。你能做的最好的就是在进入的时候保护标志。 </LI></UL>
<P>
<P>任何带 S 位设置的到 R15 的 32-bit 写(MOVS、ORRS、TEQP、LDM...^) 将传送当前模式的 SPSR 到 CPSR
中。例如,假定我们在 irq_32 模式下: <PRE> MOVS PC, R14</PRE>将复制 R14 到 PC,并接着复制 SPSR_IRQ32 到 CPSR。
<P>这在 USR 模式下不是非常有用因为它没有 SPSR!
<P>
<HR SIZE=3>
<A href="http://www.linuxforum.net/books/mhss/arm/index.html">Return to
assembler index</A>
<HR SIZE=3>
<ADDRESS>Copyright © 2001 Richard Murray </ADDRESS></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -