; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。Code Segment Assume CS:Code,DS:CodeCR equ 000DHLF equ 000AHKBBack equ 0008H; -----------------------------漏纯搜--------; 功能:显示指定地址(Str_Addr)的字符串; 入口:; Str_Addr=字符串地址(要求在数据段); 用法: Output Str_Addr; 用法举例:Output PromptStrOutput MACRO Str_Addr lea dx,Str_Addr mov ah,9 int 21h EndM; -------------返历------------------------; 功能:输出一个字符 ; 入口:dl=要显示的字符 Output_Chr proc Near push ax mov ah,02h int 21h pop ax ret Output_Chr endp ; -------------------------------------; 功能:输出回车换行Output_CTLF proc Near push ax push dx mov ah,02h mov dl,0dh int 21h mov dl,0ah int 21h pop dx pop ax retOutput_CTLF endp ; -------------------------------------; 功能:取光标位置; 入口:无; 出口:DH=行号,DL=列号GetCursor Proc Near PUSH AX PUSH BX PUSH CX XOR BX,BX MOV AH,3 INT 10H MOV Cursor_Row,DH MOV Cursor_Col,DL POP CX POP BX POP AX RETCursor_Row DB ?Cursor_Col DB ?GetCursor EndP; -------------------------------------; 功能:置光标位置; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)SetCursor Proc Near PUSH CX PUSH BX PUSH AX MOV DH,Cursor_Row MOV DL,Cursor_Col XOR BX,BX MOV AH,2 INT 10H POP AX POP BX POP CX RETSetCursor EndP; ----------裤贺---------------------------; 功能:键盘输入一个指定位数的十进制数字,将其转换成二进制数并保存在指定的内存单元。; 由于限定最大数据类型为字,所以,数字位数最多:5,最大无符号数:65536; 约定:直接回车,视为数字0; 入口:@@Digits=数字位数;di=保存输入的数字首地址; @@Type_Data=保存的数据类型,B=字节类型,W=字类型。; 出口:转换后的二进制数保存在di所指的单元Input_Digit Proc Near push dx push cx push bx push di lea di,@@Save_Tmp push di cld mov cl,@@Digits xor ch,ch push cx@@Input: call GetCursor ;取光标位置 mov ah,1 ;从键盘接受一个字符 int 21h cmp al,CR ;若键入的是回车,已经键入的数字不足N位 jz @@ASC_Dec ;转去处理已经键入的数字 cmp al,KBBack jz @@KB_Back ;若是回空键,重新输入 cmp al,'0' jb @@KBBack ;若低于数字'0',重新输入 cmp al,'9' ja @@KBBack ;若低于数字'9',重新输入 jmp @@Save_Dig@@KB_Back: dec Cursor_Col inc cx dec di@@KBBack: call SetCursor ;置光标位置 jmp @@Input@@Save_Dig: and al,0fh ;转换成二进制数 stosb ;保存 loop @@Input ;接受下一个数字@@ASC_Dec: mov ax,cx pop cx pop si sub cx,ax ;实际输入的数字位数 xor bp,bp xor dx,dx xor ax,ax jcxz @@Save_Ret ;若直接回车,没有输入任何数字,按输入'0'处理 dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数 jcxz @@One_Digit ;若输入的数字只有一位,转去直接保存这个二进制数 mov bx,10@@Mul_Ten: lodsb cbw add ax,bp mul bx mov bp,ax loop @@Mul_Ten@@One_Digit: lodsb cbw add ax,bp@@Save_Ret: pop di cmp @@Type_Data,'B' ;字节类型? jz $+5 stosw jmp $+3 stosb pop bx pop cx pop dx ret@@Digits db ? ;十进制数字位数@@Type_Data db 'B' ;保存的数据类型。B=字节类型,W=字类型@@Save_Tmp db 16 dup(?)Input_Digit EndP; -------------------------------------; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示; 入口:AX=二进制数 ; 出口:在当前光标位置显示转换后的ASCII码数字 Dec_ASCII Proc Near push dx push bx push di mov bx,10 lea di,@@Temp_Save[6] mov byte ptr [di],'$' dec di @@Divide: xor dx,dx div bx or dl,30h mov [di],dl dec di test ax,0ffffh jnz @@Divide inc di push di pop dx mov ah,9 int 21h pop di pop bx pop dx ret @@Temp_Save db 7 dup(?)Dec_ASCII EndP; -------------------------------------Counter equ 10 ;数据个数Temp_Cursor dw ? ;输入数据时,当前数据光标位置prompt_Str db 'Please input the datas: $'Press_Key db CR,LF,CR,LF,'Press any key to exit...$' Start: push cs pop ds push cs pop es ;使数据段、附加段与代码段同段; -------------------------------------; 输入数据 Output prompt_Str ;提示输入数据 mov @@Digits,4 ;十进制数字位数 mov @@Type_Data,'W' ;保存的数据类型。B=字节类型,W=字类型 lea di,List_Datas ;数据存放地址 mov cx,CounterInput_Datas: call GetCursor ;取光标位置 mov dx,WORD ptr Cursor_Row mov Temp_Cursor,dx ;保存当前光标位置 call Input_Digit ;输入数据 cmp cx,1 je @@Next_One mov dx,Temp_Cursor add dh,4 mov Cursor_Row,dl mov Cursor_Col,dh call SetCursor ;置光标位置 mov dl,20h call Output_Chr ;显示一个字符@@Next_One: loop Input_Datas call Output_CTLF call Output_CTLF; -------------------------------------; 用冒泡排序法将字数据升序排序 lea si,List_Datas ;数据存放地址 mov cx,Counter ;字数据个数 dec cx ;准备用冒泡排序法排序@@Sorting: push cx ;入栈保存外循环次数 push si ;入栈保存数组地址@@Compare: push si pop di ;当前数组元素地址赋给目的变址寄存器,以备交换之用 lodsw ;读入当前字数据给AX cmp ax,[si] ;当前字数据与相邻的下一个字数据相比较 jbe $+5 ;若小于或等于,不作数据交换,处理下一个数组元素 xchg ax,[si] ;若大于,交换数据 stosw ;保存数值较小者 loop @@Compare ;处理下一个数组元素 pop si ;数组地址出栈 pop cx ;外循环次数出栈 loop @@Sorting ;下一趟比较; -------------------------------------; 显示排序结果 lea si,List_Datas ;数据存放地址 mov cx,Counter ;字数据个数@@List_Table: lodsw call Dec_ASCII ;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示 mov dl,20h call Output_Chr ;在当前光标位置显示一个字符 loop @@List_Table; -------------------------------------Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序 mov ah,1 int 21h mov ah,4ch ;结束程序 int 21hList_Datas: ;数据缓冲区Code ENDS END Start ;编译到此结束