data segment;定义数据段
org 2000
arr db 5,2,1,0,2,3,8,6,5,9
count equ $-arr
data ends
code segment;定义代码段
assume cs:code,ds:data
start:
;初始化待排序列
mov ax,seg data ;取段地址到ax
mov ds,ax ;将ax值置入ds
lea si,arr ;取数组arr的有效地址即段内偏移置入si
mov dx,count ;将数组元素个数置入dx
Foaming:
;不足两个元素,已有序
sub dx,1 ;外循环次数为count-1
jle endfoaming ;dx为1时结束外循环
xor bx,bx ;bx赋0
mov cx,dx ;内循环次数赋给计数器
Foaminglop:
;开始一趟排序
mov al,[si][bx] ;依次将数组元素赋给al (注:原程序用ax取8位数会导致错误结果 !)
cmp al,1[si][bx] ;与下一个元素比较
jle next ;小于等于则不用交换
;逆序则交换
swap:
mov ah,al ;将前一元素保存到ah (由于是8位,所以没有用栈操作)
mov al,1[si][bx] ;将后一元素置入al
mov [si][bx],al ;将al置入前一元素位置
mov 1[si][bx],ah ;将ah其置入后一元素位置
next:
;继续本趟排序
inc bx ;前一元素位置下移一格
loop Foaminglop ;
;开始下趟排序
jmp Foaming ;
endfoaming:
;结束排序
mov ax,4c00h
int 21h
code ends
end start;结束程序
================================================================
改错----你的程序还有错误,修改如下
DATA SEGMENT ;定义数据段
ORG 2000
ARR DB 5,2,1,0,2,3,8,6,5,9
COUNT EQU $-ARR
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA
START:
;初始化待排序列
MOV AX,SEG DATA ;取段地址到ax
MOV DS,AX ;将ax值置入ds
LEA SI,ARR ;取数组arr的有效地址即段内偏移置入si
MOV DX,COUNT ;将数组元素个数置入dx
FOAMING:
;不足两个元素,已有序
SUB DX,1 ;外循环次数为count-1
CMP DX,1
JLE ENDFOAMING ;dx为1时结束外循环
XOR BX,BX ;bx赋0
MOV CX,DX ;内循环次数赋给计数器
FOAMINGLOP:
;开始一趟排序
MOV AL,[SI][BX] ;依次将数组元素赋给al (注:原程序用ax取8位数会导致错误结果 !)
CMP AL,[SI][BX+1] ;与下一个元素比较
JLE NEXT ;小于等于则不用交换
;逆序则交换
SWAP:
MOV AH,AL ;将前一元素保存到ah (由于是8位,所以没有用栈操作)
MOV AL,[SI][BX+1] ;将后一元素置入al
MOV [SI][BX],AL ;将al置入前一元素位置
MOV [SI][BX+1],AH ;将ah其置入后一元素位置
NEXT:
;继续本趟排序
INC BX ;前一元素位置下移一格
LOOP FOAMINGLOP ;
;开始下趟排序
JMP FOAMING ;
ENDFOAMING:
;结束排序
LEA SI,ARR
MOV CX,COUNT
DISP:
MOV AL,[SI]
XOR AH,AH
CALL DISPAX
INC SI
LOOP DISP
MOV AX,4C00H
INT 21H
DISPAX PROC NEAR
; 以10进制数形式显示无符号字的值,要显示的值事先存 AX 中
PUSH BX
PUSH CX ;保存bx、cx、dx、si
PUSH DX
PUSH SI
PUSH DS
PUSH CS
POP DS
JMP NUMDEF
DIVARR DW 10000,1000,100,10,1
NZ DB 0
NUMDEF:
MOV BYTE PTR NZ,0 ; 状态,看是否已输出过非 0
PUSH AX
LEA SI,DIVARR
MOV CX,5
DISP1:
POP AX
MOV DX,0
MOV BX,[SI]
DIV BX
PUSH DX
CMP AL,0
JNE DISP2 ; 当 al不为0时输出
CMP BYTE PTR NZ,1 ; 当al 为0时,再比较nz 是否为 1
JE DISP2 ; 等于1 表示前面已输出过非 0 应将 0 输出
CMP CX,1 ; 当最后一位仍 为0 时 输出 0 而非空格
JE DISP2
MOV DL,20H
JMP DISP3
DISP2:
ADD AL,30H
MOV DL,AL
MOV BYTE PTR NZ,1
DISP3:
MOV AH,2
INT 21H
INC SI
INC SI
LOOP DISP1
POP DX
POP DS
POP SI ; 恢复bx、cx、dx、si
POP DX
POP CX
POP BX
RET
DISPAX ENDP
CODE ENDS
END START ;结束程序
已经有注释了,还注毛呢,不会连mov、push、inc都不知道吧。。。补充一下:
org 2000 ; 当前地址往后偏移2000字节
arr db 5,2,1,0,2,3,8,6,5,9
count equ $-arr ; 当前地址-arr变量的地址,这里表示arr的字节数。count只是一个常熟,不占内存地址