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

📄 移位.htm

📁 ARM指令集
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0051)http://www.linuxforum.net/books/mhss/arm/shift.html -->
<HTML><HEAD><TITLE>Shift</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/shift.html#lsl">LSL</A> 
  <LI><A href="http://www.linuxforum.net/books/mhss/arm/shift.html#asl">ASL</A> 
  <LI><A href="http://www.linuxforum.net/books/mhss/arm/shift.html#lsr">LSR</A> 
  <LI><A href="http://www.linuxforum.net/books/mhss/arm/shift.html#asr">ASR</A> 
  <LI><A href="http://www.linuxforum.net/books/mhss/arm/shift.html#ror">ROR</A> 
  <LI><A href="http://www.linuxforum.net/books/mhss/arm/shift.html#rrx">RRX</A> 
  </LI></UL>
<P>ARM 
处理器组建了可以与数据处理指令(ADC、ADD、AND、BIC、CMN、CMP、EOR、MOV、MVN、ORR、RSB、SBC、SUB、TEQ、TST)一起使用的桶式移位器(barrel 
shifter)。你还可以使用桶式移位器影响在 LDR/STR 操作中的变址值。 
<P>译注:移位操作在 ARM 
指令集中不作为单独的指令使用,它是指令格式中是一个字段,在汇编语言中表示为指令中的选项。如果数据处理指令的第二个操作数或者单一数据传送指令中的变址是寄存器,则可以对它进行各种移位操作。如果数据处理指令的第二个操作数是立即值,在指令中用 
8 位立即值和 4 位循环移位来表示它,所以对大于 255 
的立即值,汇编器尝试通过在指令中设置循环移位数量来表示它,如果不能表示则生成一个错误。在逻辑类指令中,逻辑运算指令由指令中 S 
位的设置或清除来确定是否影响进位标志,而比较指令的 S 位总是设置的。在单一数据传送指令中指定移位的数量只能用立即值而不能用寄存器。</P>
<P>下面是给不同的移位类型的六个助记符: <PRE>  LSL  逻辑左移
  ASL  算术左移
  LSR  逻辑右移
  ASR  算术右移
  ROR  循环右移
  RRX  带扩展的循环右移
</PRE><CODE>ASL</CODE> 和 <CODE>LSL</CODE> 是等同的,可以自由互换。 
<P>你可以用一个立即值(从 0 到 31)指定移位数量,或用包含在 0 和 31 之间的一个值的寄存器指定移位数量。 
<P> 
<P><A name=lsl></A><A name=asl></A>
<H2>逻辑或算术左移</H2>
<P>(<FONT color=#0000ff>L</FONT>ogical or <FONT color=#0000ff>A</FONT>rithmetic 
<FONT color=#0000ff>S</FONT>hift <FONT color=#0000ff>L</FONT>eft)</P><PRE>  Rx, LSL #n    or
  Rx, ASL #n    or
  Rx, LSL Rn    or
  Rx, ASL Rn</PRE>接受 Rx 的内容并按用‘n’或在寄存器 Rn 中指定的数量向高有效位方向移位。最低有效位用零来填充。除了概念上的第 33 
位(就是被移出的最小的那位)之外丢弃移出最左端的高位,如果逻辑类指令中 S 位被设置了,则此位将成为从桶式移位器退出时进位标志的值。 
<P>考虑下列: <PRE>  MOV    R1, #12
  MOV    R0, R1, LSL#2</PRE>在退出时,R0 是 48。 这些指令形成的总和是 <CODE>R0 = #12, 
LSL#2</CODE> 等同于 BASIC 的 <CODE>R0 = 12 &lt;&lt; 2</CODE> 
<P> 
<P><A name=lsr></A>
<H2>逻辑右移</H2>
<P>(<FONT color=#0000ff>L</FONT>ogical <FONT color=#0000ff>S</FONT>hift <FONT 
color=#0000ff>R</FONT>ight)</P><PRE>  Rx, LSR #n    or
  Rx, LSR Rn</PRE>它在概念上与左移相对。把所有位向更低有效位方向移动。如果逻辑类指令中 S 
位被设置了,则把最后被移出最右端的那位放置到进位标志中。它同于 BASIC 的 <CODE>register = value &gt;&gt;&gt; 
shift</CODE>。 
<P> 
<P><A name=asr></A>
<H2>算术右移</H2>
<P>(<FONT color=#0000ff>A</FONT>rithmetic <FONT color=#0000ff>S</FONT>hift <FONT 
color=#0000ff>R</FONT>ight)</P><PRE>  Rx, ASR #n    or
  Rx, ASR Rn</PRE>类似于 LSR,但使用要被移位的寄存器(Rx)的第 31 位的值来填充高位,用来保护补码表示中的符号。如果逻辑类指令中 S 
位被设置了,则把最后被移出最右端的那位放置到进位标志中。它同于 BASIC 的 <CODE>register = value &gt;&gt; 
shift</CODE>。 
<P> 
<P><A name=ror></A>
<H2>循环右移</H2>
<P>(<FONT color=#0000ff>Ro</FONT>tate <FONT color=#0000ff>R</FONT>ight)</P><PRE>  Rx, ROR #n    or
  Rx, ROR Rn</PRE>循环右移类似于逻辑右移,但是把从右侧移出去的位放置到左侧,如果逻辑类指令中 S 
位被设置了,则同时放置到进位标志中,这就是位的‘循环’。一个移位量为 32 的操作将导致输出与输入完全一致,因为所有位都被移位了 32 
个位置,又回到了开始时的位置! 
<P> 
<P><A name=rrx></A>
<H2>带扩展的循环右移</H2>
<P>(<FONT color=#0000ff>R</FONT>otate <FONT color=#0000ff>R</FONT>ight with 
e<FONT color=#0000ff>x</FONT>tend)</P><PRE>  Rx, RRX</PRE>这是一个 ROR#0 操作,它向右移动一个位置 - 不同之处是,它使用处理器的进位标志来提供一个要被移位的 33 
位的数量。<BR><FONT size=-1>Thanks to <I>Ian Jeffray</I> for the correction.</FONT> 
<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 + -