第五章 【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)