問題描述
我的氣泡代碼是彙編語言嗎? (is my code for bubble right at assembly language?)
org 100h
.Model SMALL
.Stack
.Data
Ar DB 06h,05h,04h,02h
Len DW ($‑Ar)
.CODE
Mov Ax,@Data
Mov Ds,Ax
Mov Bx,Len ;length of the array
Dec Bx ;total number of passes ( n‑1)
Nxtpass:
Mov Cx,Bx ;total number of comparison
Mov Si,0 ;index=0
Nxtcomp:Mov Al,Ar[Si] ;read 1st number
Inc Si ;update pointer
Cmp Al,Ar[Si] ;compare 1st number with 2nd number
Jb No_EXCG ;if same , noexchange
XCHG Al,Ar[Si]
Mov Ar[Si‑1],Al ; do exchange
No_EXCG:loop Nxtcomp ;repeat until comparison
Dec Bx
JNZ Nxtpass ;repeat untill pass = 0;
ret
參考解法
方法 1:
Your BubbleSort is good, but you could make it more secure if it could deal with an array of just one element, or even zero elements!
The code that will test for this can be combined with the outer loop logic:
jmp Start
Nxtpass:
...
Start:
sub bx, 1
jnbe Nxtpass
ret
If there are no elements, the sub bx, 1
instruction will make CF=1 aka "Below".
If there's but 1 element, the sub bx, 1
instruction will make ZF=1 aka "Equal".
The jnbe Nxtpass
instruction will only jump on the condition "NeitherBelowNorEqual" also known as "Above".
Cmp Al,Ar[Si] ;compare 1st number with 2nd number Jb No_EXCG ;if same , noexchange
The comment is misleading! Exchanging elements can be skipped on "Below" but also on "Equal". Better use jbe No_EXCG
.
Programming style is personal but writing the mnemonics and register names with a leading capital is very, very unusual.
.Model SMALL
.Stack
.Data
Ar db 06h, 05h, 04h, 02h
Len equ $‑Ar
.Code
mov ax, @Data
mov ds, ax
mov bx, Len
jmp Start
Nxtpass:
mov cx, bx
xor si, si
Nxtcomp:
mov al, Ar[si]
inc si
cmp al, Ar[si]
jbe No_EXCG
xchg al, Ar[si]
mov Ar[si‑1], al
No_EXCG:
loop Nxtcomp
Start:
sub bx, 1
jnbe Nxtpass
ret
(by Durjoy、Sep Roland)