
题目来源: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
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)