1. 程式人生 > >彙編中的巢狀迴圈

彙編中的巢狀迴圈

先貼程式碼:

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