
data segment
myData db 0ah, 0fh, 0dh,1h, 2h, 3h, 4h, 0a3h, 0b1h, 0bbh
data ends
code segment
start proc
mov ax, data
mov ds, ax
lea ax, myData
mov di, ax
lea di, myData
lea si, myData
mov bx, 0
call bubble
hlt
start endp
bubble proc ; 冒泡排序,两层循环
mov al, [di] ; p=myData[0]
begin:
lea bp, [bx + si] ; q=myData[bx]
mov dl, [bp] ;
cmp al, dl ; al= p, dl =q
;jle lessequal ; 有符号数比较排序
jbe lessequal ; 无符号数比较排序 if( p <= q ) goto lessequal
xchg al, [bp] ; q = al, al =dl
mov [di], al ; p = al
lessequal: ;
inc bx ; q++
cmp bx, 10 ; if( bx == 10)
je next ; { goto next;}
jmp begin ; else { goto begin}
next: ;
inc di ; p++
mov bx, di ; q=p
sub bx, si ; if((q - myData)!=10)
cmp bx, 10 ; goto bubble;
jnz bubble ; else
ret ; return;
bubble endp
code ends
end start
设有三个字序无符号数存放在buffer缓冲器中,现要对其按从大到小的排列
程序如下:
dseg segment
buffer db 78,90,11 ;假设的三个无符号数
dseg ends
;
cseg segment
assume cs:cseg,ds:dseg
start: mov ax,dseg
mov ds,ax
;
mov si,offset buffer
mov al,[si]
cmp al,[si+1] ;第一个数与第二个数比较
jbe next1
xchg al,[si+1]
mov [si],al
next1: mov al,[si]
cmp al,[si+2] ;第一个数与第三个数比较
jbe next2
xchg al,[si+2]
mov [si],al
next2: mov al,[si+1]
cmp al,[si+2] ;第三个数与第三个数比较
jbe next3
xchg al,[si+2]
mov [si+1],al
next3: mov ah,4ch
int 21h
cseg ends
end start
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; 定义常量
Yes EQU 1
No EQU 0
; -----------------------------------------
; 定义结构类型
Bubb_Para Struc ; 冒泡排序法参数表
Carry DB No ; 是否带符号。Yes:有符号数;No:无符号数
Sort DB No ; 升序/降序。Yes:升序;No:降序
Arry_Addr DW ;数组地址
Arry_Type DB ;数组元素类型
Yes_No DB 73h,76h,7dh,7eh
Load DB 0ach,0adh
Comp DB 3ah,3bh
Exchange DB 86h,87h
Store DB 0aah,0abh
Bubb_Para EndS
; -----------------------------------------
; 功能:按要求对数组元素排序,能够对字节元素、字元素进行无符号数、有符号数的升序、降序排序。
; 子程序原型:对字节元素进行无符号升序排序。
; 入口:SI=冒泡排序法参数表地址
Bubbling Proc Near
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI
push ds
push es
; ------------------根据排序参数,修改排序指令
push cs
pop ds
push cs
pop es
LEA DI,@@Compare
MOV AL,[SIArry_Type]
DEC AL
PUSH AX
LEA BX,[SILoad]
XLAT
MOV [DI][2],AL
POP AX
PUSH AX
LEA BX,[SIComp]
XLAT
MOV [DI][3],AL
POP AX
PUSH AX
LEA BX,[SIExchange]
XLAT
MOV [DI][7],AL
POP AX
LEA BX,[SIStore]
XLAT
MOV [DI][9],AL
MOV AL,[SICarry]
SHL AL,1
OR AL,[SISort]
XOR AH,AH
LEA BX,[SIYes_No]
XLAT
MOV [DI][5],AL
; ------------------按要求排序
MOV SI,[SIArry_Addr] ;数组地址
pop es
pop ds
MOV CL,Buffer[1] ;字符串长度
XOR CH,CH
DEC CX ;外循环次数
CLD
@@Scanning: PUSH CX ;入栈保存外循环次数
PUSH SI ;入栈保存数组地址
@@Compare: PUSH SI
POP DI ;当前数组元素地址赋给目的变址寄存器,以备交换之用
LODSB ;将当前数组元素读入累加器
CMP AL,[SI] ;当前数组元素与相邻的下一个数组元素相比较
JBE @@NextOne ;若小于或等于,不作数据交换,处理下一个数组元素
XCHG AL,[SI] ;若大于,交换数组元素
STOSB ;保存数值较小者
@@NextOne: LOOP @@Compare ;处理下一个数组元素
POP SI ;数组地址出栈
POP CX ;外循环次数出栈
LOOP @@Scanning ;下一趟比较
; ------------------
POP DI
POP SI
POP CX
POP BX
POP AX
RET
Bubbling EndP
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:输出回车换行
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
ret
Output_CTLF 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
cld
@@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
; -----------------------------------------
letter dw ;字母个数
dight dw ;数字个数
other dw ;其它字符个数
Prompt_Str db 'Please input a string: $'
letter_sum db 13,10,13,10,'LETER: $'
dight_sum db 13,10,'DIGIT: $'
other_sum db 13,10,'OTHER: $'
Parameters Bubb_Para <No,Yes,Offset Buffer,Type Buffer>
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
; -----------------------------------------
; 从键盘上连续输入一行字符(字符个数不超过100个,该字符串用回车符结束)
Output Prompt_Str ;提示输入一串字符
lea dx,Buffer ;输入字符串缓冲区地址
mov ah,0ah ;从键盘接收字符串
int 21h
lea si,Buffer[1] ;实际输入的字符数地址
lodsb ;读入实际输入的字符数
test al,0ffh
jz Exit_Proc
call Output_CTLF ;输出一个回车、换行
call Output_CTLF ;输出一个回车、换行
; -----------------------------------------
; 将这些字符按照ASCII码由小到大顺序排序并显示
cld ;清方向标志,使变址寄存器增值
lea si,Parameters ;冒泡排序法参数表地址
call Bubbling ;将这些字符按照ASCII码由小到大顺序排序
lea si,Buffer[1] ;实际输入的字符数地址
lodsb ;读入实际输入的字符数
xor ah,ah
mov bx,ax
mov byte ptr [bx][si],'$'
Output Buffer[2] ;显示排序后的字符串
; -----------------------------------------
; 按字母、数字、其它字符分类统计计数
lea si,Buffer[1] ;实际输入的字符数地址
lodsb ;读入实际输入的字符数
xor ah,ah
mov cx,ax ;实际输入的字符数送计数器
Compare: lodsb ;当前字符→AL
mov ah,al ;al→ah,用于判断
and ah,0dfh ;屏蔽第5位,按大写字母处理
cmp ah,'Z' ;当前字符>'Z'
ja Other_Chr ;大于,转去按其它字符处理
cmp ah,'A' ;当前字符<'A'
jb Digit0_9 ;小于,转去判断是否数字
inc letter ;字母计数
jmp Next_One
Digit0_9: cmp al,'9' ;当前字符>'9'
ja Other_Chr ;大于,转去按其它字符处理
cmp al,'0' ;当前字符<'0'
jb Other_Chr ;小于,转去按其它字符处理
inc dight ;数字计数
jmp Next_One
Other_Chr: inc other ;其它字符计数
Next_One: loop Compare
; -----------------------------------------
; 显示分类统计结果
Output letter_sum
mov ax,letter
call Dec_ASCII
Output dight_sum
mov ax,dight
call Dec_ASCII
Output other_sum
mov ax,other
call Dec_ASCII
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Buffer db 100 ;输入字符串缓冲区
Code ENDS
END Start ;编译到此结束
以上就是关于帮忙写下汇编语言程序(以DATA1开始的10个数据从大到小排序)。。。感谢全部的内容,包括:帮忙写下汇编语言程序(以DATA1开始的10个数据从大到小排序)。。。感谢、用有符号数实现排序的汇编语言程序、汇编语言程序设计问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)