子程序调用与宏定义的异同_冒泡排序_汇编语言的子程序调用与宏定义实现

本文通过 ADS 环境,对比了子程序调用和宏定义两种方式在实现冒泡排序算法上的异同。在子程序中,详细展示了冒泡排序的流程,并使用全局变量进行计数。而在宏定义部分,通过宏展开实现了同样的排序功能,简化了代码重复。两种方法均给出了数据区域和长度定义。
摘要由CSDN通过智能技术生成

1 子程序

;环境为ADS 子程序调用

AREA MAIN,CODE,READONLY

ENTRY

CODE32

start

BL MAOPAO

stop

MOV R0,#0x18

LDR R1,=0x20026

SWI 0x123456

MAOPAO

MOV R4,#0 ;R4为全局变量

LDR R6,=src ;r6数组首地址

ADD R6,R6,#len-4 ;r6指向数组为地址

outer

LDR R1,=src ;r1 指向数组首地址

inner ;内层循环 一次冒泡过程

LDR R2,[R1] ;去数组前两个数值比较

LDR R3,[R1,#4]

CMP R2,R3

STRGT R3,[R1]

STRGT R2,[R1,#4] ;大了就交换到后面

ADD R1,R1,#4

CMP R1,R6 ;判断一次循环是否结束

BLT inner ;没有结束,继续本次冒泡

ADD R4,R4,#4 ;全局变量加1

CMP R4,#len ;判断外层是否结束

SUBLE R6,R6,#4

BLE outer

MOV PC,LR

AREA DATA,DATA,READWRITE

src DCD 15,-4,0,4,1,-1,16,32,-32,2

len EQU 10*4

END

2 宏定义

;环境为ADS,宏定义

MACRO

$label maopao $x,$y

MOV R4,#0 ;R4为全局变量

$label.outer

LDR R6,=$x ;r6数组首地址

ADD R6,R6,#$y-4

LDR R1,=$x ;r1 指向数组首地址

$label.inner ;内层循环 一次冒泡过程

LDR R2,[R1] ;去数组前两个数值比较

LDR R3,[R1,#4]

CMP R2,R3

STRGT R3,[R1]

STRGT R2,[R1,#4] ;大了就交换到后面

ADD R1,R1,#4

CMP R1,R6 ;判断一次循环是否结束

BLT $label.inner ;没有结束,继续本次冒泡

ADD R4,R4,#4 ;全局变量加1

CMP R4,#$y ;判断外层是否结束

SUBLE R6,R6,#4

BLE $label.outer

MEND

AREA MAIN,CODE,READONLY

ENTRY

CODE32

start

lable maopao src,len

stop

MOV R0,#0x18

LDR R1,=0x20026

SWI 0x123456

AREA DATA,DATA,READWRITE

src DCD 15,-4,0,4,1,-1,16,32,-32,2

len EQU 10*4

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值