汇编与C语言混合 实现的从小到大的冒泡排序

汇编实现的从小到大的冒泡排序

主函数由C语言实现,sort函数用汇编语言写

#include <stdio.h>


 int buffer[256];      //数据缓冲区
 int  bufferlen=0;     //数据缓冲区数据个数


extern sort(int *buffer,int bufferlen);    //汇编函数sort接口


//********从键盘录入数据********
int InputDataFromKeyBoard(int *pBuffer)
{
  int nCnt=0;
  int x;
  
 printf("数据输入开始:\n");
 while(1)
  {
   scanf("%d",&x);                //键盘输入整型数==〉x
   pBuffer[nCnt++]=x;             //x存入缓冲区
   if((x==(int)-1)||(nCnt>=256))  //输入数据为-1 结束输入
    {
    nCnt--;
    break;
    }
  }  
  printf("数据输入结束!\n");
  return nCnt;
}


//********向控制台输出buffer数据********
void OutputConsole()
{
  int i;
  printf("输出Buffer数据:\n"); // 向控制台输出数据
  for(i=0;i<bufferlen;i++)
  {  printf("%4d",buffer[i]); }
  printf("\n");


}






//********主函数********
int main()
{


  bufferlen=InputDataFromKeyBoard((int *)buffer);    //从键盘录入数据
  OutputConsole();                                   //将输入数据输出到控制台
  sort((int *)buffer,bufferlen);                     //对输入数据排序
  OutputConsole();                                   //输出排序数据 
 return 0;
}

汇编函数如下:

  EXPORT   sort       ;导出函数sort
   AREA  Exp103,CODE,READONLY
   
   CODE32




sort     ;函数名   
         ;入口参数 
         ;   R0<==buffer数据缓冲区首地址    
         ;   R1<==bufferlen 数据缓冲区数据个数

     

     
        SUBS R1,R1,#1      ;第一层循环    次数R1

         MOV R5,R1          ;R5等于要排序的数据数-1

       
L0      MOV R2,#0
        MOV R3,R1          ;第二层循环    次数R3
        CMP R1,R5            ;R1是不是等于总数-1.如果是就说明这是第一次,R0不必移位
        ADDNE R0,R0,#4      ;除了第一次外都要使R0移位,NE是不等于的意思
        
        
L1      LDR R6,[R0,R2]     ;R6<=[R0+R2]
        ADD R4,R2,#4
        LDR R7,[R0,R4]     ;R7<=[R0+R2+1]
        CMP R6,R7
        BLT L2


        STR R7,[R0,R2]     ;R6<R7交换
        STR R6,[R0,R4]


L2      ADD R2,R2,#4               
        SUBS  R3,R3,#1     ;二层循环控制
        BNE   L1    
        
        SUBS R1,R1,#1      ;一层循环控制
        BNE  L0     
EXIT    MOV PC,LR          ;函数返回    


   END

运行实例

数据输入开始:4 2 6 8 7 -1

数据输入结束!
输出Buffer数据:
   4   2   6   8   7
输出Buffer数据:
   2   4   6   7   8


好的,下面是汇编语言实现0-99从小到大冒泡排序的代码: ``` ; 0-99从小到大冒泡排序 ; 使用8086汇编语言实现 data segment array db 100 dup(0) ; 存储待排序的数组 len db 100 ; 数组长度 data ends code segment start: mov ax, data mov ds, ax ; 初始化数据段 ; 生成100个随机数 call generateRandomNumbers ; 冒泡排序 mov cx, len ; cx寄存器存储排序轮数 dec cx ; 最后一轮不需要排序 OuterLoop: mov si, 0 ; si寄存器存储当前排序的起始下标 mov di, si + 1 ; di寄存器存储当前排序的终止下标 InnerLoop: mov al, [array+si] cmp al, [array+di] jle NoSwap ; 如果前一个数小于等于后一个数,则不需要交换 ; 交换两个数 mov bl, [array+di] mov [array+di], al mov [array+si], bl NoSwap: inc si ; 移动到下一个数 inc di cmp di, len ; 如果已经到了数组末尾,则不需要继续排序 jne InnerLoop loop OuterLoop ; 输出排序后的数组 call printArray mov ah, 4ch int 21h ; 退出程序 ; 生成100个随机数 generateRandomNumbers: mov cx, len mov bx, 1 xor ax, ax RandomLoop: mov dl, bh mul dl mov [array+bx-1], al inc bx loop RandomLoop ret ; 输出数组 printArray: mov cx, len mov bx, 0 PrintLoop: mov dl, [array+bx] add dl, 30h ; 转换为ASCII码 mov ah, 2h int 21h ; 输出单个字符 inc bx loop PrintLoop ret code ends end start ``` 在这个代码中,我们首先定义了一个存储待排序的数组和数组长度的数据区。然后使用 `generateRandomNumbers` 过程生成100个随机数,并使用冒泡排序算法对数组进行排序。最后,我们使用 `printArray` 过程输出排序后的数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值