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

📄 分支指令.htm

📁 ARM指令集
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0048)http://www.linuxforum.net/books/mhss/arm/bl.html -->
<HTML><HEAD><TITLE>Branch instructions</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<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/bl.html#b">B</A> 
  <LI><A href="http://www.linuxforum.net/books/mhss/arm/bl.html#bl">BL</A> 
</LI></UL>
<P><A 
href="http://www.linuxforum.net/books/mhss/arm/ARMinstrs.html#Branch">指令格式</A> 
<P><A name=b></A></P>
<H2>B : 分支</H2>
<P>(<FONT color=#0000ff>B</FONT>ranch)</P><PRE>  B{条件}  &lt;地址&gt;
</PRE><CODE>B</CODE> 是最简单的分支。一旦遇到一个 <CODE>B</CODE> 指令,ARM 
处理器将立即跳转到给定的地址,从那里继续执行。注意存储在分支指令中的实际的值是相对当前的 R15 
的值的一个偏移量;而不是一个绝对地址。它的值由汇编器来计算,它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(+/- 32 
M)。 
<P>在其他处理器上,你可能经常见到这样的指令: <PRE>  OPT 1
  LDA &amp;70
  CMP #0
  BEQ Zero
  STA &amp;72
 .Zero RTS
</PRE>(取自 Acorn Electron User Guide issue 1 page 213) 
<P>在 ARM 处理器上,它们将变成下面这些东西: <PRE>  OPT     1
  ADR     R1, #&amp;70
  LDR     R0, [R1]
  CMP     #0
  BEQ     Zero
  STR     R0, [R1, #2]
 .Zero
  MOV     PC, R14
</PRE>这不是一个很好的例子,但你可以构想如何更好的去条件执行而不是分支。另一方面,如果你有大段的代码或者你的代码使用状态标志,那么你可以使用条件执行来实现各类分支: 
这样一个单一的简单条件执行指令可以替代在其他处理器中存在的所有这些分支和跳转指令。 <PRE>  OPT     1
  ADR     R1, #&amp;70
  LDR     R0, [R1]
  CMP     R0, #0
  STRNE   R0, [R1, #2]
  MOV     PC, R14
</PRE>
<P><A name=bl></A> 
<H2>BL : 带连接的分支</H2>
<P>(<FONT color=#0000ff>B</FONT>ranch with <FONT color=#0000ff>L</FONT>ink)</P><PRE>  BL{条件}  &lt;地址&gt;
</PRE><CODE>BL</CODE> 是另一个分支指令。就在分支之前,在寄存器 14 中装载上 R15 的内容。你可以重新装载 R14 到 R15 
中来返回到在这个分支之后的那个指令,它是子例程的一个基本但强力的实现。它的作用在屏幕装载器 2 (例子 4)中得以很好的展现... <PRE>    .load_new_format
      BL     switch_screen_mode
      BL     get_screen_info
      BL     load_palette

    .new_loop
      MOV    R1, R5
      BL     read_byte
      CMP    R0, #255
      BLEQ   read_loop
      STRB   R0, [R2, #1]!
</PRE>...在这里我们见到在装载器循环之前调用了三个子例程。接着,一旦满足了条件执行就在循环中调用了 <I>read_byte</I> 子例程。 
<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; 1999 Richard Murray </ADDRESS></BODY></HTML>

⌨️ 快捷键说明

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