1. 程式人生 > >第五章 【BX】和loop指令

第五章 【BX】和loop指令

完整描述一個記憶體單元的條件:①記憶體單元的地址。②記憶體單元的長度。

用符號“()”來表示一個暫存器或一個記憶體單元中的內容。eg:(ax)、(al)。“()”中表示的資料有兩種:①位元組;②字。是哪種型別由暫存器名或具體的運算決定。

注意:①()中的元素可以有3中型別:①暫存器名;②段暫存器名;③記憶體單元的實體地址(一個20位資料)

引入:以後可用idata表示常量。eg:mov ax,[idata]可表示mov ax,[0]、mov ax,[1]、mov ax,[2]等。

一、[BX]

 mov ax,[bx]與mov [bx],ax功能類似於mov ax,[0]和mov [0],ax.

inc bx作用是bx中內容加一。inc  記憶體單元。eg:inc byte ptr [3]-----ds:3 ← ((ds)×16 +3) + 1

二、Loop指令

格式:loop 標號。執行loop指令的兩個步驟:

①(cx)=(cx)-1

②判斷cx中的值,不為零則轉至標號處執行程式,如果為零則向下執行。

(cx中放的一般是迴圈的次數。

(eg:(loop指令的使用)

assume cs:code

code segment

       mov ax,2

       mov cx,11

     s:add ax,ax

       loop s

       mov ax,4c00h

       int 21h

code ends

end

其中標號s代表了一個地址,地址處的指令為:add ax,ax

執行時,實際是執行了兩步(①和②)主要的和迴圈相關的指令是:

       mov cx,11

    s:add ax,ax

       loop s)

三個要點:①在cx中存放迴圈的次數。

                  ②loop指令中的標號所標識的地址要在前面。

                  ③要迴圈執行的程式段,要寫在標號和loop指令的中間。

實現迴圈功能的框架:      mov  cx,迴圈次數

                                       s:迴圈執行的程式段

                                          loop s 

三、在Debug中跟蹤用loop指令實現的迴圈程式

注意:在彙編源程式中,資料不能以字母開頭,所以要在前面加0。

eg:mov AX,0ffffh

小結:

t命令:單步執行;遇loop會進入迴圈內部繼續單步執行; 遇int會進入中斷程式內繼續單步執行。

p命令:單步執行;遇loop或int會當做整體執行,不進入內部單步執行。(上一章實驗內用p命令執行int 21 的原因。)

g命令:執行到指定地址;或遇程式結束或int,則終止執行。

 四、Debug和彙編編譯器masm對指令的不同處理

①對於指令中的[idata]

Debug將它解釋為記憶體單元,idata是偏移地址,而編譯器將它解釋為idata(實數)。

解決方法:①在編譯器中,要在“[ ]”的前面加上段地址所在的段暫存器。eg:mov al,ds:[0]

                  ②在“[ ]”裡用的是暫存器,eg:bx。則段地址預設在ds中。也可以像①中給出段地址所在的段暫存器。

五、loop和[bx]的聯合應用(略)

六、段字首:用於顯示地指明記憶體單元的段地址的“ds:”、“cs:”、“ss:”、“es:”,在組合語言中稱為段字首。

七、安全空間

概念引出原因:防止改變空間內原本存放的重要的系統資料或程式碼,產生錯誤。

總結:

需要直接向一段記憶體寫入內容時,這段記憶體空間不應該存放系統或其他的程式的資料或者程式碼,否則很可能引發錯誤。在DOS方式下,一般情況下,0:200~0:2ff空間中沒有系統和其他程式的程式碼和資料。以後,需要時可以使用。

八、段字首的使用(略去,應用詳見實驗4)