汇编语言实现排序

在这里插入图片描述

		ORG 0000H
START:	             
		CLR 00H
		CLR C
		MOV R7, #09H		
		MOV R0, #30H		
		MOV A, @R0		;(30H)->A
LOOP: 		
		INC R0			;R0 = 31H
		MOV R2, A		;(30H)->R2  暂存(30H)
		SUBB A, @R0		;(30H)-(31H), if (30H)>=(31H) C=0; else C=1
		MOV A, R2		;(30H)->A
		JC 	NEXT		;(30H)>=(31H) 顺序; (30H)<(31H) 跳
		SETB 00H		;进行了交换,00H置位
		XCH A, @R0      ;(30H)->(31H), (31H)->A
		DEC R0			;R0 = 30H
		XCH A, @R0		;(31H)->(30H)
		INC R0			;R0 = 31H
NEXT:					;无需交换
		MOV A, @R0		;(31H)->A
		DJNZ R7,LOOP	;完成一次判断,继续下一次,共9次
		JB 00H, START	;如果进行了交换,需要进行下一次排序;如果未进行交换,则排序结束
		SJMP $ 
		END
  • 6
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
由于汇编语言是一种底层的机器语言,所以实现排序需要用到具体的机器指令。 以下是一种简单的汇编程序,实现冒泡排序并控制led交替亮灭表示排序完成: ``` .section .data #定义数据段 array: .byte 5, 3, 8, 4, 2, 7, 1, 6 #待排序的数组 .section .text #定义代码段 .globl _start #程序的起始点 _start: movl $8, %ecx outer_loop: movl $0, %ebx jmp inner_loop #跳转到内部循环 inner_loop: cmp %ecx, %ebx jge end_inner_loop #如果已经遍历到数组的末尾,则跳出内部循环 mov array(,%ebx,1), %eax #将当前位置的值存入eax寄存器 cmp array(,%ebx,1), array(,%ebx,1) #比较当前位置的值和下一个位置的值大小 jle not_swap #如果前一个值比后一个值小,则不交换位置 xchg array(,%ebx,1), array(,%ebx+1,1) #交换位置 movl $1, %edx #设置变量,表示有数据交换过 not_swap: addl $1, %ebx jmp inner_loop #跳转到下一次循环 end_inner_loop: testl %edx, %edx jne outer_loop #如果有数据交换过,则继续循环 jmp end_sorting #如果没有数据交换,则跳出排序循环 end_sorting: #控制led交替亮灭,表示排序完成 movb $0xff, %al movb %al, 0x1000 movb $0x00, %al movb %al, 0x1000 movl $1, %eax #退出程序 xorl %ebx, %ebx int $0x80 ``` 程序首先定义了一个字节数组array,里面存放了待排序的数字。在主函数_start中使用了嵌套循环,外部循环控制遍历的次数,内部循环控制比较和交换操作。在每次交换后,程序会标记变量edx为1,表示有数据交换过。如果没有数据交换,则说明已经排好序,跳出排序循环并控制led交替亮灭表示排序完成。 由于led的控制方式不同,实现方法也不同。在以上程序中,控制led使用了movb指令,将指定的值分别存入内存地址0x1000中,即可达到交替亮灭的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43964993

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值