⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 伪指令.htm

📁 ARM指令集
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0052)http://www.linuxforum.net/books/mhss/arm/pseudo.html -->
<HTML><HEAD><TITLE>Pseduo-instructions</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></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>伪指令</FONT></H1></TD>
    <TD align=middle width=100></TD></TR></TBODY></TABLE>
<UL>
  <LI><A href="http://www.linuxforum.net/books/mhss/arm/pseudo.html#adr">ADR</A> 

  <LI><A 
  href="http://www.linuxforum.net/books/mhss/arm/pseudo.html#adrl">ADRL</A> 
  <LI><A 
  href="http://www.linuxforum.net/books/mhss/arm/pseudo.html#align">ALIGN</A> 
  <LI><A href="http://www.linuxforum.net/books/mhss/arm/pseudo.html#dcx">DCx</A> 

  <LI><A 
  href="http://www.linuxforum.net/books/mhss/arm/pseudo.html#equx">EQUx</A> 
  <LI><A href="http://www.linuxforum.net/books/mhss/arm/pseudo.html#opt">OPT</A> 
  </LI></UL>
<P>RISC OS 的 BASIC 汇编器提供了一组伪指令。它们不是处理器实际上能理解的指令,但可以转换成它能理解的某种东西。它们的存在能使你的程序更加简单。 

<P>&nbsp;</P>
<P><A name=adr></A>
<H2>ADR : 装载地址</H2>
<P>(load <FONT color=#0000ff>Ad</FONT>d<FONT color=#0000ff>r</FONT>ess)</P><PRE>   ADR{后缀} &lt;寄存器&gt;, &lt;标号&gt;
</PRE>它把参照的地址装载到给定寄存器中: <PRE>   00008FE4                    OPT     l%
   00008FE4 E28F0004           ADR     R0, text
   00008FE8 EF000002           SWI     "OS_Write0"
   00008FEC E1A0F00E           MOV     PC, R14
   00008FF0                    .text
   00008FF0                    EQUS    "Hello!" + CHR$13 + CHR$10 + CHR$0
   00008FFC                    ALIGN
</PRE>
<P>下列代码有完全相同的效果: <PRE>   00008FE4                    OPT     l%
   00008FE4 E28F0004           ADD     R0, R15, #4
   00008FE8 EF000002           SWI     "OS_Write0"
   00008FEC E1A0F00E           MOV     PC, R14
   00008FF0                    .text
   00008FF0                    EQUS    "Hello!" + CHR$13 + CHR$10 + CHR$0
   00008FFC                    ALIGN
</PRE>实际上,它们的反汇编将显示: <PRE>   *MemoryI 8FE4 +18
   00008FE4 :  E28F0004 : ..忊 : ADR     R0,&amp;00008FF0
   00008FE8 :  EF000002 : ...? : SWI     "OS_Write0"
   00008FEC :  E1A0F00E : .馉? : MOV     PC,R14
   00008FF0 :  6C6C6548 : Hell : STCVSTL CP5,C6,[R12],#-&amp;120 ; =288
   00008FF4 :  0A0D216F : o!.. : BEQ     &amp;003515B8
   00008FF8 :  00000000 : .... : DCD     &amp;00000000
</PRE>
<P>ADR 是一个很有用的指令,你不需要关心相对 R15 的偏移量(例如,我们为什么只加 4?),也不需要在一块代码上计算偏移量。可以简单的使用 
<CODE>ADR Rx, label</CODE> 而汇编器将设法为你使用 ADD、SUB、MOV 或 MVN 
中最恰当的那个指令。限制因素是你的引用范围只能是在 4096 字节中(不完全是真的,它典型的对 ADD 或 SUB 
使用被循环右移的立即值,但是为了参数的一致性,我们假定范围是 4K)。</P>  
<P><A name=adrl></A>&nbsp;</P>
<H2>ADRL : 装载长地址</H2>
<P>(load <FONT color=#0000ff>Ad</FONT>d<FONT color=#0000ff>r</FONT>ess <FONT 
color=#0000ff>L</FONT>ong)</P><PRE>   ADRL{后缀} &lt;寄存器&gt;, &lt;标号&gt;
</PRE>&nbsp;BASIC 汇编器不支持它,但一些扩展支持它。 
<P>ADRL 指令使用 ADR 和 ADD,或 ADR 和 SUB 
的一个组合,来生成一个更广大的可以到达的地址范围。但是它总是使用两个指令,所以可以尝试更加可运做的布置来重新组织你的那些可以使用普通的 ADR 代码。 
<P>还有,在一些汇编器中,用使用三个指令的 ADRX 来定位更大的地址。 
<P> </P>
<P><A name=align></A></P>
<H2>ALIGN : 对齐指针</H2>
<P>(<FONT color=#0000ff>ALIGN</FONT> pointers)</P><PRE>   ALIGN
</PRE>ALIGN 指令设置 <CODE>P%</CODE> (如果需要的话还有 
<CODE>O%</CODE>)来在一个字边界上对齐。通常要求它跟随着一个字符串或者一个或多个字节的数据,并切应当在更远的代码被汇编之前使用它。 
<P>BASIC 汇编器非常聪明并且有经验,如果你疏忽了,它能为你处理对齐问题... <PRE>   00008FF4                    OPT     l%
   00008FF4 E28F0004           ADR     R0, text
   00008FF8 EF000002           SWI     "OS_Write0"
   00008FFC EA000004           B       carryon
   00009000                    .text
   00009000                    EQUS    "unaligned text!!!" + CHR$0
   00009012                    .carryon
   00009014 E1A0F00E           MOV     PC, R14
</PRE>
<P><A name=dcx></A>
<H2>DCx : 初始化数据存储</H2><PRE>   DCx &lt;值&gt;
</PRE>没有 DCx 指令。小‘x’表示一个可能的范围。它们是: <PRE>   DCB    预备一个字节(8 位值)
   DCW    预备一个半字(16 位值)
   DCD    预备一个字(32 位值)
   DCS    按给出的字符串的要求预备直到 255 个的字符
</PRE>例如: <PRE>   .start_counter
     DCB     1

   .pointer
     DCD     0

   .error_block
     DCD     17
     DCS     "Uh-oh! It all went wrong!" + CHR$0
     ALIGN
 </PRE>
<P><A name=equx></A>
<H2>EQUx : 初始化数据存储</H2><PRE>   EQUx &lt;值&gt;
</PRE>没有 EQUx 指令,小‘x’表示一个可能的范围。它们是: <PRE>   EQUB   预备一个字节(8 位值)
   EQUW   预备一个半字(16 位值)
   EQUD   预备一个字(32 位值)
   EQUS   按给出的字符串的要求预备直到 255 个的字符
</PRE>简单的理解,除了名字不同之外与(上面的) DCx 完全一样。你可以使用‘<CODE>=</CODE>’作为 EQUB 的简写。 
<P>  
<P><A name=opt></A></P>
<H2>OPT : 设置汇编器选项</H2>
<P>(set assembler <FONT color=#0000ff>Opt</FONT>ions)</P><PRE>   OPT &lt;值&gt;
</PRE>它设置各种汇编器选项。&nbsp; 
<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 &copy; 2001 Richard Murray </ADDRESS></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -