汇编语言中数组的冒泡排序
Bubble sort on array on Assembly Language
我需要对一个包含 7 个整数的无组织数组进行冒泡排序,使其看起来像 9,6,5,4,3,2,1。
我 运行 我的代码通过编译器,它说
我不明白这段代码有什么问题:
code segment
assume ds:code,cs:code
start:
mov ax,code
mov ds,ax ;code start
ARR: dw 1,2,4,3,6,5,9
mov ch,0h
mov cl,1h
mov bh 7h
jmp assign_nums
restart:
mov ch,0h
mov cl,1h
dec bh
jmp assign_nums
swap:
mov ch,dl
mov cl,dh
jmp next
next:
cmp bh,cl
je restart
add ch,1h
add cl,1h
jmp assign_nums
assign_nums:
cmp bh,0h
je done
mov dh,[ARR+ch]
mov dl,[ARR+cl]
cmp dh,dl
jl swap
jnl next
done:
nop
code ends
end start
对于第一个错误,您忘记在寄存器和立即数之间输入逗号。
对于第二个和第三个错误,CH 和 CL 寄存器不能用于寻址内存。请改用 SI、DI 或 BX。
由于您的数组被定义为单词,因此您必须这样对待它!
更改
mov dh,[ARR+ch]
mov dl,[ARR+cl]
变成类似的东西(取决于你做出的其他选择)
mov ax,[ARR+si]
mov dx,[ARR+di]
请注意,您将数组放在说明中。一旦您设法编译它,这将使您的程序崩溃。要么将数组放在程序的单独数据段中,要么跳过这一行。
start:
mov ax,code
mov ds,ax
jmp start2
ARR: dw 1,2,4,3,6,5,9
start2:
mov ch,0h
这是冒泡排序的简单代码
iclude'emu8086.inc'
org 100h
.data
array db 9,6,5,4,3,2,1
count dw 7
.code
mov cx,count
dec cx ; outer loop iteration count
nextscan: ; do { // outer loop
mov bx,cx
mov si,0
nextcomp:
mov al,array[si]
mov dl,array[si+1]
cmp al,dl
jnc noswap
mov array[si],dl
mov array[si+1],al
noswap:
inc si
dec bx
jnz nextcomp
loop nextscan ; } while(--cx);
;;; this loop to display elements on the screen
mov cx,7
mov si,0
print:
Mov al,array[si]
Add al,30h
Mov ah,0eh
Int 10h
MOV AH,2
Mov DL , ' '
INT 21H
inc si
Loop print
ret
;使用冒泡排序算法对数组进行排序
.MODEL SMALL
.STACK 100H
.DATA
N DB 44H,22H,11H,55H,33H ; N is an array
LEN DW 5 ; LENGTH OF ARRAY N
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV CX,LEN ;Cx is counter for OUTERLOOP CX=5
DEC CX ; CX = 4
OUTERLOOP:
MOV SI,0 ; SI is the index of array N
MOV DX,CX ; Dx is counter for INNERLOOP
INNERLOOP:
MOV AH,N[SI] ; assign the number N[SI] into reg.AH
MOV AL,N[SI+1] ; assign the next number N[SI+1] into reg.AL
CMP AH,AL ; Compare between N[SI] and N[SI+1] <BR>
JC CARRY ; if AL > AH => Carry Flag =1 ,THEN jump to carry
MOV N[SI] , AL ; else , Do Switching bteween N[SI] and N[SI+1]
MOV N[SI+1] ,AH
CARRY:
INC SI
DEC DX
JNZ INNERLOOP
LOOP OUTERLOOP
;exit
MOV AH,4CH ;service number
INT 21H ; interrupt
MAIN ENDP
END
.model small
.data
arr1 db 6, 5, 8, 3, 9
len1 equ $-arr1
.code
mov ax, @data
mov ds, ax
mov ch, len1-1
a1:
mov cl, ch
lea si, arr1
rept1:
mov al, [si]
inc si
cmp al, [si]
jbe next1
xchg al, [si]
mov [si-1], al
next1:
dec cl
jnz rept1
dec ch
jnz a1
mov ah, 4ch
int 21h
end
我需要对一个包含 7 个整数的无组织数组进行冒泡排序,使其看起来像 9,6,5,4,3,2,1。
我 运行 我的代码通过编译器,它说
我不明白这段代码有什么问题:
code segment
assume ds:code,cs:code
start:
mov ax,code
mov ds,ax ;code start
ARR: dw 1,2,4,3,6,5,9
mov ch,0h
mov cl,1h
mov bh 7h
jmp assign_nums
restart:
mov ch,0h
mov cl,1h
dec bh
jmp assign_nums
swap:
mov ch,dl
mov cl,dh
jmp next
next:
cmp bh,cl
je restart
add ch,1h
add cl,1h
jmp assign_nums
assign_nums:
cmp bh,0h
je done
mov dh,[ARR+ch]
mov dl,[ARR+cl]
cmp dh,dl
jl swap
jnl next
done:
nop
code ends
end start
对于第一个错误,您忘记在寄存器和立即数之间输入逗号。
对于第二个和第三个错误,CH 和 CL 寄存器不能用于寻址内存。请改用 SI、DI 或 BX。
由于您的数组被定义为单词,因此您必须这样对待它!
更改
mov dh,[ARR+ch]
mov dl,[ARR+cl]
变成类似的东西(取决于你做出的其他选择)
mov ax,[ARR+si]
mov dx,[ARR+di]
请注意,您将数组放在说明中。一旦您设法编译它,这将使您的程序崩溃。要么将数组放在程序的单独数据段中,要么跳过这一行。
start:
mov ax,code
mov ds,ax
jmp start2
ARR: dw 1,2,4,3,6,5,9
start2:
mov ch,0h
这是冒泡排序的简单代码
iclude'emu8086.inc'
org 100h
.data
array db 9,6,5,4,3,2,1
count dw 7
.code
mov cx,count
dec cx ; outer loop iteration count
nextscan: ; do { // outer loop
mov bx,cx
mov si,0
nextcomp:
mov al,array[si]
mov dl,array[si+1]
cmp al,dl
jnc noswap
mov array[si],dl
mov array[si+1],al
noswap:
inc si
dec bx
jnz nextcomp
loop nextscan ; } while(--cx);
;;; this loop to display elements on the screen
mov cx,7
mov si,0
print:
Mov al,array[si]
Add al,30h
Mov ah,0eh
Int 10h
MOV AH,2
Mov DL , ' '
INT 21H
inc si
Loop print
ret
;使用冒泡排序算法对数组进行排序
.MODEL SMALL
.STACK 100H
.DATA
N DB 44H,22H,11H,55H,33H ; N is an array
LEN DW 5 ; LENGTH OF ARRAY N
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV CX,LEN ;Cx is counter for OUTERLOOP CX=5
DEC CX ; CX = 4
OUTERLOOP:
MOV SI,0 ; SI is the index of array N
MOV DX,CX ; Dx is counter for INNERLOOP
INNERLOOP:
MOV AH,N[SI] ; assign the number N[SI] into reg.AH
MOV AL,N[SI+1] ; assign the next number N[SI+1] into reg.AL
CMP AH,AL ; Compare between N[SI] and N[SI+1] <BR>
JC CARRY ; if AL > AH => Carry Flag =1 ,THEN jump to carry
MOV N[SI] , AL ; else , Do Switching bteween N[SI] and N[SI+1]
MOV N[SI+1] ,AH
CARRY:
INC SI
DEC DX
JNZ INNERLOOP
LOOP OUTERLOOP
;exit
MOV AH,4CH ;service number
INT 21H ; interrupt
MAIN ENDP
END
.model small
.data
arr1 db 6, 5, 8, 3, 9
len1 equ $-arr1
.code
mov ax, @data
mov ds, ax
mov ch, len1-1
a1:
mov cl, ch
lea si, arr1
rept1:
mov al, [si]
inc si
cmp al, [si]
jbe next1
xchg al, [si]
mov [si-1], al
next1:
dec cl
jnz rept1
dec ch
jnz a1
mov ah, 4ch
int 21h
end