You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />
2.9.2 无 符 号 整 数 除 法 的 宏 示 例<br />
示 例 2-14 给 出 了 一 个 执 行 无 符 号 整 数 除 法 的 宏 。 它 带 有 四 个 参 数 :<br />
$Bot 存 放 除 数 的 寄 存 器 。<br />
$Top 存 放 指 令 执 行 前 被 除 数 的 寄 存 器 。 执 行 指 令 之 后 , 它 存 放 余 数 。<br />
$Div 存 放 除 法 的 商 的 寄 存 器 。 如 果 只 需 求 余 数 , 它 可 以 是 NULL ("")。<br />
$Temp 计 算 时 使 用 的 临 时 寄 存 器 。<br />
示 例 2-14<br />
MACRO<br />
$Lab DivMod $Div,$Top,$Bot,$Temp<br />
ASSERT $Top $Bot<br />
; Produce an error message if the<br />
ASSERT $Top $Temp<br />
; registers supplied are<br />
ASSERT $Bot $Temp<br />
; not all different<br />
IF "$Div" ""<br />
ASSERT $Div $Top<br />
; These three only matter if $Div<br />
ASSERT $Div $Bot ; is not null ("")<br />
ASSERT $Div $Temp ;<br />
ENDIF<br />
$Lab<br />
MOV $Temp, $Bot ; Put divisor in $Temp<br />
CMP $Temp, $Top, LSR #1 ; double it until<br />
90 MOVLS $Temp, $Temp, LSL #1 ; 2 * $Temp > $Top<br />
CMP $Temp, $Top, LSR #1<br />
BLS %b90 ; The b means search backwards<br />
IF "$Div" "" ; Omit next instruction if $Div is<br />
null<br />
MOV $Div, #0 ; Initialize quotient<br />
ENDIF<br />
91 CMP $Top, $Temp ; Can we subtract $Temp?<br />
SUBCS $Top, $Top,$Temp ; If we can, do so<br />
IF "$Div" "" ; Omit next instruction if $Div is<br />
null<br />
ADC $Div, $Div, $Div ; Double $Div<br />
ENDIF<br />
MOV $Temp, $Temp, LSR #1 ; Halve $Temp,<br />
CMP $Temp, $Bot ; and loop until<br />
BHS %b91 ; less than divisor<br />
MEND<br />
<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-51