彙編 實現氣泡排序 講解

2021-10-14 03:47:29 字數 2632 閱讀 9460

有乙個首位址為a的n字陣列,編寫程式採用氣泡排序使該陣列中的數按照從大到小的次序整序。

資料儲存在a的陣列中(即記憶體中),我們需要利用氣泡排序實現從大到小排序。

;description

data segment use16

a dw 8,16

,41,22

,50n equ ($-a)/2

data ends

;description

stack segment use16

dw 32

dup(?)

stack ends

;description

code segment use16

assume cs:code, ds:data, ss:stack

start:

mov ax,data

mov ds,ax

;儲存n-

1到cx

mov cx,n

dec cx

loop2:

;儲存cx到dx

mov dx,cx

shl dx,

1 mov si,

0 loop1:

mov ax,a[si]

cmp word ptr ax,a[si+2]

ja next

;bx相當於是中間變數,交換

mov bx,ax

mov ax,a[si+2]

mov a[si+2]

,bx mov a[si]

,ax next:

add si,

2 cmp si,dx

jnz loop1

loop loop2

mov ah,

4ch int

21hcode ends

end start

對於乙個陣列,我們的氣泡排序是這樣的:

比較相鄰兩項,將小的放在後面,重複n-1次,就能得到有序序列

這是一趟:

很明顯,我們這樣就能將最小的元素排在我們想要的位置。

然後進行第二輪,同理我們可以將第二小的元素排在合適的位置。

然後是第三輪、第四輪……,直到第n-1輪整體有序。

每一次最小的元素被選出來,就像是交換到了水面上,所以叫做氣泡排序。

這裡再做乙個優化,我們可以看出來,每一次需要排序的元素個數都會少乙個。

實現部分我是用cx暫存器儲存迴圈的n-1次,每一輪減一,剛好和需要排序的個數相同。

資料準備

首先,我們已知資料儲存在a陣列中,這裡我們計算元素個數的方式是採用了位址計數器"$",他的作用是儲存當前正在彙編的指令的偏移位址

還有偽指令equ,有一點像等號,其實就是乙個賦值操作,不過只能做一次。

在賦值的時候,位址計數器剛好將陣列存入記憶體,並且位址計數器儲存的是指令的第乙個位元組位置

圖示:(這裡的資料為十六進製制)

這樣我們用位址計數器減去a(這裡是乙個位址)就能得到該陣列包含的位元組個數,然後除以2就是字的個數了。

雙重迴圈

這裡的迴圈很明顯是兩層,如果都是loop指令就需要進行將cx暫存器壓棧,我們採用的是cx和dx分別作為外層和內層的計數器。

在外層迴圈中,我們需要將cx的值遞減(loop指令完成),同時需要給dx暫存器賦值,原因在上面說過了,我們想要優化一下排序次數。

因為陣列的資料型別為dw,所以si下標一次加2,我們需要將dx乘二(左移一位)從而和si比較

在內層迴圈中,需要比較a[si]和a[si+2],但是因為兩個不能都是記憶體定址,這裡我們先將a[si]放在ax中,然後和a[si+2]比較,注意在換的過程中是需要中間變數的,而且是修改陣列的值。(我個憨憨最開始就只修改了ax暫存器的值)

在每一次交換之後,將si暫存器內容加2,和dx的值比較一下,如果不同說明沒有達到最後,否則停止進入外層迴圈。

這裡宣告一下,記憶體中的資料都是以位元組為單位進行操作的,所以我們將si加2(dw型別)

因為懶得寫輸出結果,所以我就直接debug檢視記憶體了:

先使用g執行程式,然後找到儲存data段的位址,因為我們的陣列a是最開始的,所以偏移位址為0000。

因為位址從左到右是從低到高,所以3200表示的其實是0032,也就是十進位制的50,以此類推。

對debug感興趣的可以看這篇部落格。

彙編實現氣泡排序

感覺。實現一下還是有點意義的。用的是mips指令集,不造是不是過時了。然後參考資料 實現上不敢用保留暫存器,因為用完貌似需要恢復原暫存器的值,所以全部都用臨時暫存器的值 然後遇到了幾個問題 一 變數的定義 主要是在資料段裡幹,資料段用.data標識 然後定義方式是 變數名 變數型別 初始值 eg.a...

彙編 氣泡排序

在emu8086除錯過 assume cs code,ds data data segment array dw 49,38,65,97,76,13,27 要排序的數 count dw array 2 獲取排序數目 data ends code segment start mov ax,data m...

彙編 氣泡排序。。。

最近在學習彙編,也發現自己好長時間沒寫部落格了,就更新乙個昨天用彙編寫的氣泡排序吧 上個星期五開始學的彙編,寫的較挫,望見諒 有bug還望提出,一起討論 data segment buf db 10,4,6,55,30,90,78,88,69 n buf data ends code segment...