彙編中的巢狀迴圈
阿新 • • 發佈:2019-02-18
先貼程式碼:
assume cs:code,ds:data
data segment
db 'ibm ' ;定義一個16個位元組的字串
db 'dec '
db 'dos '
db 'vax '
dw 0 ;定義一個記憶體區域用於儲存cx
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov cx,4
s0: mov ds:[40H],cx
mov si,0
mov cx,3
s: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
int si
loop s ;loop s的執行過程是先執行cx = cx - 1;在判斷cx是否為0若cx為0則進行 跳轉到 s處進行程式的執行
add bx,16
mov cx,ds:[40H]
loop s0
mov ax, 4 c00H
int 21H
code ends
end start
程式碼中使用 記憶體區域為[40+ds]的地方作為 儲存cx的值 以此來達到上層迴圈的計數器cx不會因為下層的cx值的改變而受到影響
當然也可以使用 dx等通用暫存器來儲存cx的值但是這樣做在內部迴圈中就無法使用dx通用暫存器 相比之下犧牲一個記憶體跟家的划算
上面的程式中,使用記憶體單元來儲存資料,可是上面的做法卻有寫麻煩,因為如果需要儲存的多個數據的時候,你就需要記住資料存放在哪個記憶體單元之中,這樣的程式容易引起混亂。
因此一般來說需要暫存資料的時候我們都應該使用棧,來進行資料的暫存。再次的個那個該以上的成需:
assume cs:code,ds:data,ss:stack
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0 ;定義一個段,用來做棧段,容量為16個位元組
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16 ;設定棧頂ss:sp指向stack:16 堆疊使用的時候要指向棧頂
mov ax,data
mov ds,ax ;資料的ds資料段指向上面定義的資料段
mov bx,0
mov cx,4
s0: push cx ;將外層迴圈的cx壓棧
mov si,0
mov cx,3 ;將cx設定成內層迴圈的次數
s: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
add bx,16
pop cx ;從棧頂將cx的值進行恢復
loop s0 ;外層迴圈的loop指令將cx中的計數值cx中的計數值減1
;執行過程 loop是先將 cx減1 再判斷 cx是否為0 若不為0則進行迴圈直到cx為零的時候為止
mov ax, 4c00H
int 21H
code ends
end start