汇编 正负数排列

汇编 正负数排列,第1张

题目名称:随机几个正负数, 输出要求是正数从大到小排列,负数从小到大排列

题目来源:http://zhidao.baidu.com/question/131775278.html

本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。

Code Segment

Assume CS:Code,DS:Code

-------------------------------------

功能:显示指定地址(Str_Addr)的字符串

入口:

Str_Addr=字符串地址(要求在数据段)

用法: Output Str_Addr

用法举例:Output PromptStr

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

-------------------------------------

功能:在当前光标位置显示一个字符

入口:dl=要显示的字符

Output_Chr proc Near

push ax

mov ah,2

int 21h

pop ax

ret

Output_Chr Endp

-------------------------------------

功能:把AX中的二进制有符号数转换成显式的十进制ASCII码,并送显示屏显示

入口:AX=二进制数

出口:在当前光标位置显示转换后的ASCII码数字

Sign_Dec_ASCII Proc Near

push ds

push cs

pop ds

push cs

pop es

push dx

push bx

push di

test ah,80h

jz @@Tran_ASCII

neg ax

push ax

mov dl,'-'

mov ah,2

int 21h

pop ax

@@Tran_ASCII: mov bx,10

lea di,@@Temp_SaveS[5]

mov BYTE ptr [di],'$'

dec di

cld

@@Divide_S: xor dx,dx

div bx

or dl,30h

mov [di],dl

dec di

test ax,0ffffh

jnz @@Divide_S

inc di

push di

pop dx

mov ah,9

int 21h

pop di

pop bx

pop dx

pop ds

ret

@@Temp_SaveS db 6 dup(?)

Sign_Dec_ASCII EndP

----卜铅---------------------------------

功能:冒泡排序法将数组元素升序或降序排序,显示排序结果

入口参数:SI=数组地址(第一个元素存放元素个数),AL=排序方向

Bubbling_Sort proc Near

push si

mov BYTE ptr @@Compare[5],al 修改排序方向

mov cl,[si] 数据个数

xor ch,ch

dec cx 外循环次数

inc si

cld

@@Scanning: push cx 入栈保存外循环次数

push si 入栈保存数组地址

@@Compare: mov di,si 当前数组元素地址赋给目的变址寄存器,以备交换之用

lodsb 将当前唯弊核数组元素读入累加器

cmp al,[si] 当前数组元素与相邻的下一个数组元素相比较

jae @@NextOne 若大于或等于,不作指掘数据交换,处理下一个数组元素

xchg al,[si] 若小于,交换数组元素

stosb 保存数值较小者

@@NextOne: loop @@Compare 处理下一个数组元素

pop si 数组地址出栈

pop cx 外循环次数出栈

loop @@Scanning 下一趟比较

mov cl,[si-1] 数据个数

xor ch,ch

@@List_Scores: lodsb

cbw 扩展为字

call Sign_Dec_ASCII 把AX中的二进制有符号数转换成显式的十进制ASCII码,并送显示屏显示

mov dl,20h

call Output_Chr 显示一个空格

loop @@List_Scores

pop si

ret

Bubbling_Sort Endp

-------------------------------------

Buffer db 23,-69,-89,35,-46,57,-68,79,-51,-81,98,-43,56,-67,123,-98,102,-87,-91,-100

Counter equ $-Buffer 数据个数

Press_Key db 13,10,10,10,'The complated. Press any key to exit...$'

Start:push cs

pop ds

push cs

pop es

xor dx,dx DH=正数数组元素计数器,DL=负数数组元素计数器

lea si,Buffer 取数组变量地址

lea di,Tmp_Buffer[1] 正数数组地址

mov bx,di

mov cx,Counter 元素个数

add bx,cx

inc bx 负数数组地址

cld

@@Statics: lodsb 读入一个元素

test al,80h 正数?

jz $+9 是

inc dl 负数计数

mov [bx],al 保存负数

inc bx

jmp $+5

inc dh 是,正数计数

stosb 保存正数

loop @@Statics

lea si,Tmp_Buffer 正数数组地址

mov [si],dh 保存正数数组元素个数

mov [si][21],dl 保存负数数组元素个数

mov al,73h 排序方向代码:降序

call Bubbling_Sort 排序并显示

mov ax,0e0dh

xor bx,bx

int 10h

mov al,10

int 10h

int 10h

add si,21 负数数组地址

mov al,76h 排序方向代码:升序

call Bubbling_Sort 排序并显示

-------------------------------------

Exit_Proc: Output Press_Key 提示 *** 作完成,按任意键结束程序

mov ah,1

int 21h

mov ah,4ch 结束程序

int 21h

Tmp_Buffer: 数据缓冲区

Code ENDS

END Start 编译到此结束

#include <stdio.h>

void sort(int a[],int n)

{int i,j,t

 for(i=0i<弯袜n-1i++)

   for(j=0j<n-1-ij++)

 世闹迅    if(a[j]>=0&&a[j+1]<0)

     {t=a[j]a[j]=a[j+1]a[j+1]=t}

}

int main()

{int i,n,a[10]

 搜此for(i=0i<10i++)

   scanf("%d",&a[i])

 sort(a,10)  

 for(i=0i<10i++)

   printf("%d ",a[i])

 printf("\n")  

 return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12474962.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-24
下一篇2023-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存