例41简单分支程序。寄存器r0和r1中有两个正整数,求这两个数的最大公约数,结果存储在r0中。
程序代码:AREAexample1CODEENTRYMOVr015MOVr19
startCMPr0r1SUBLTr1r1r0SUBGTr0r0r1BNEstart
stopBstopEND
例42复杂分支程序。寄存器R0、R1和R2中有三个数,求其中最大的一个,结果存储在R3中。
程序代码:
AREAexample2
ENTRY
MOVR010
MOVR130
MOVR220
start
CMPR0R1
BLElbl_a
CMPR0R2
MOVGTR3R0
MOVLER3R2
B
lbl_b
lbl_a
CMPR1R2
MOVGTR3R1
MOVLER3R2
lbl_b
B
END
CODE
f例43利用跳转表实现分支转移。寄存器R1、R2中有两个数,若R0为0则求R1与R2的和,若R0为1则求R1与R2的差。结果存储在R0中C语言代码i
tDoAddi
tai
tb
retur
abi
tDoSubi
tai
tb
retur
abvoidmai
i
tR00i
tR13i
tR22i
tarithfu
cswithR0
case0arithfu
cDoAddR0arithfu
cR1R2break
case1arithfu
cDoSubR0arithfu
cR1R2break
defaultbreak
while1汇编S文件
AREAexample3CODEREADONLY
umEQU2
ENTRYStart
MOVR00MOVR13MOVR22BLfu
ctio
Bfu
ctio
CMPR0
um
fMOVHSPCLRADRR3JumpTableLDRPCR3R0LSL2JumpTableDCDFu
cAddDCDFu
cSubFu
cAddADDR0R1R2MOVPCLRFu
cSubSUBR0R1R2MOVPCLREND
例44中断向量表
AREAexample4CODEREADONLY
LDRPCReset_Addr
LDRPCU
defi
ed_Addr
LDRPCSWI_Addr
LDRPCPrefetch_Addr
LDRPCAbort_Addr
NOP
LDRPCIRQ_Addr
LDRPCFIQ_Addr
Reset_AddrDCDReset_Ha
dler
U
defi
ed_AddrDCDU
defi
ed_Ha
dler
SWI_Addr
DCDSWI_Ha
dler
Prefetch_AddrDCDPrefetch_Ha
dler
Abort_AddrDCDAbort_Ha
dler
DCD0
IRQ_Addr
DCDIRQ_Ha
dler
FIQ_Addr
DCDFIQ_Ha
dler
IMPORT__mai
Reset_Ha
dler
B__mai
U
defi
ed_Ha
dler
movpclr
SWI_Ha
dler
movpclr
Prefetch_Ha
dler
movpclr
Abort_Ha
dler
fmovpclrIRQ_Ha
dler
movpclrFIQ_Ha
dler
movpclrEND
例45数据块复制。编程实现将从地址src开始的
um个字的数据复制到地址dst去。汇编代码:
AREAexample5CODEREADONLY
umEQU25
ENTRYStart
LDRR0srcLDRR1dstmovR2
umBlockcopyMOVSR3R2LSR3BEQwordcopySTMFDSPR4R11copyLDMIAR0R4R11STMIAR1R4R11SUBSR3R31BNEcopy
wordcopyANDSR2R27BEQStop
CopyLoopLDRR3R04STRR3R14SUBSR2R21BNECopyLoop
StopBAREAoriDataDATAREADWRITE
fsrcDCD0123456789012345678901234
dstSPACE254END
例46多重循环,对
个数进行从小到大排序。汇编代码:
AREAexample6CODEREADONLY
umEQU10
ENTRYstart
LDRR0srcMOVR2
um1LOOP1LDRR4R0R2LSL2SUBSR3R21LOOP2LDRPLR5R0R3LSL2CMPR5R4STRGTR4R0R3LSL2STRGTR5R0R2LSL2MOVGTR4R5SUBSR3R31BPLLOOP2SUBSR2R21BHILOOP1BAREADataAreaDATAREADWRITEsrcDCD6198450732ENDr