爱妃科技ARM汇编编程-算术运算 | | 爱妃科技
正在加载
请稍等

菜单

红楼飞雪 梦

15526773247

文章

Home android 嵌入式开发 ARM汇编编程-算术运算
Home android 嵌入式开发 ARM汇编编程-算术运算

ARM汇编编程-算术运算

android 嵌入式开发 by

 

;

; 1+2+3+…+100

;

; 定义代码段

AREA     sumCode,       CODE,    READONLY

;关键字 段名        代码段    只读属性

 

ENTRY                        ;程序入口

 

START

;初始化

MOV R0, #0                 ;初始化R0,用来保存结果

MOV R1, #1                 ;用来计数

 

LOOP

;求百内所有数的和

ADD R0, R0, R1           ;求和

ADD R1, R1, #1           ;计数加一

CMP R1, #101              ;比较是否加到一百,修改条件标志

BNE LOOP                   ;不等则跳转

 

STOP

;程序退出

MOV R0, #0X18

LDR R1, =0X20026

SWI 0X123456

 

END                                   ;标识源代码结束

;以下内容全部忽略

 

 

;

; 1-2+3-4+…-198+199

;

 

;定义代码段

AREA     MyCode,        CODE,           READONLY

;关键字 段名 代码段  只读属性

 

ENTRY                               ;程序入口

 

START

;初始化

MOV R0, #0                 ;用来保存结果

MOV R1, #1                 ;计数

 

LOOP

; 1-2+3-4+…-198+199

TST R1, #1                  ;判断是奇数还是偶数

ADDNE R0, R1, R0      ;奇数相加

SUBEQ R0, R0, R1       ;偶数相减

ADD R1, R1, #1           ;计数加一

CMP R1, #200              ;修改标志位

BNE LOOP                   ;跳转

 

STOP

;程序退出

MOV R0, #0X18

LDR R1, =0x20026

SWI 0x123456

 

END

 

 

;

;      计算 19!

;

 

;定义代码段

AREA     Code,      CODE

ENTRY

 

START

MOV R0, #1                 ;保存结果低16位

MOV R1, #0                 ;保存结果高16位

MOV R2, #19               ;计数

 

LOOP

UMULL R0, R3, R2, R0 ;无符号64位相乘

MLA   R1, R2, R1, R3 ;乘加

SUBS R2, R2, #1

BNE LOOP

 

STOP

;程序退出

MOV R0, #0X18

LDR R1, =0x20026

SWI 0x123456

 

END

 

;

;      ARM汇编编程-算术运算

;      使用ADD SUB AND ORR CMP TST 等指令完成数据加减运算及逻辑运算

;

 

X            EQU              11                         ; 定义X的值为11

Y           EQU       8                          ; 定义Y的值为8

 

BIT23     EQU              (1<<23)                ; 定义BIT23的值为0x00800000

 

AREA     MAIN, CODE               ; 声明代码段

ENTRY                                      ; 标识程序入口

CODE32                                    ; 声明32位ARM指令

 

START

; 使用MOV、ADD指令实现:R8 = R3 = X + Y

MOV R0, #X                              ; R0 <= X,X的值必须是8位图数据

MOV R1, #Y                              ; R1 <= Y,Y的值必须是8位图数据

ADD R3, R0, R1                         ; 即是R3 = X + Y

MOV R8, R3                              ; R8 <= R3

 

; 使用MVN、SUB指令实现:R5 = 0x5FFFFFF8 – R8 * 8

MVN R0, #0xA0000007               ; 0xA0000007的反码为0x5FFFFFF8

SUB R5, R0, R8, LSL #3              ; R8左移3位,结果即是 R8 * 8

 

; 使用CMP指令判断(5*Y/2)>(2*X)吗?若大于则R5 = R5&0xFFFF0000,否则R5 = R5|0x000000FF

MOV R0, #Y

ADD R0, R0, R0, LSL #2             ; 计算R0 = Y + 4*Y = 5*Y

MOV R0, R0, LSR #1                  ; 计算R0 = 5*Y/2

 

MOV R1, #X

MOV R1, R1, LSL #1                         ; 计算R1 = 2*X

 

CMP R0, R1                               ; 比较R0和R1,即(5*Y/2)和(2*X)进行比较

LDRHI R2, =0xFFFF0000           ; 若(5*Y/2)>(2*X),则R2 <= 0xFFFF0000

ANDHI R5, R5, R2                     ; 若(5*Y/2)>(2*X),则R5 = R5&R2

ORRLS R5, R5, #0xFF                ; 若(5*Y/2)≤(2*X),则R5 = R5|0x000000FF

 

; 使用TST指令测试R5的bit23是否为1,若是则将bit6位清零(使用BIC指令)

TST R5, #BIT23

BICNE R5, #0x40

 

END

 

 

12 2015-08

 

我要 分享

 

 

本文 作者

 

相关 文章