📄 伪指令.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> </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{后缀} <寄存器>, <标号>
</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,&00008FF0
00008FE8 : EF000002 : ...? : SWI "OS_Write0"
00008FEC : E1A0F00E : .馉? : MOV PC,R14
00008FF0 : 6C6C6548 : Hell : STCVSTL CP5,C6,[R12],#-&120 ; =288
00008FF4 : 0A0D216F : o!.. : BEQ &003515B8
00008FF8 : 00000000 : .... : DCD &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> </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{后缀} <寄存器>, <标号>
</PRE> 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 <值>
</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 <值>
</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 <值>
</PRE>它设置各种汇编器选项。
<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 + -