組合語言04 BX 和loop指令

2021-06-23 04:03:10 字數 3038 閱讀 7508

整理自fishcc論壇課件

首先展示乙個新的程式:

assume cs:codesg

codesg segment

start:mov ax,2000h

mov ds,ax

mov al,[0]

mov bl,[1]

mov cl,[2]

mov dl,[3]

mov ax,4c00h

int 21h

codesg ends

end start

使用masm進行編譯連線

這裡,debug中對於語句的解釋和masm中不同

在masm進行編譯時,mov al,[0]被解釋為將0放入al,和mov al,0等同

但是,當在debug中直接寫入**時,mov al,[0]被解釋為將段位址為ds中的值,偏移位址為0的位址中的資料放入al

loop

為了描述上的簡潔,在以後的課程中,我們將使用乙個描述性的符號 「() 」來表示乙個暫存器或乙個記憶體單元中的內容。

我們看一下(x)的應用,比如:

(1)ax中的內容為0010h,我們可以這樣來描述:(ax)=0010h;

(2)2000:1000 處的內容為0010h,我們可以這樣來描述:(21000h)=0010h;

(3)對於mov ax,[2]的功能,我們可以這樣來描述:(ax)=((ds)*16+2);

(4)對於mov [2],ax 的功能,我們可以這樣來描述:((ds)*16+2)=(ax);

(5)對於 add ax,2 的功能,我們可以這樣來描述:(ax)=(ax)+2;

(6)對於add ax,bx的功能,我們可以這樣來描述:(ax)=(ax)+(bx);

(7)對於push ax的功能,我們可以這樣來描述:

(sp) = (sp)-2

((ss)*16+(sp))=(ax)

(8)對於pop ax 的功能,我們可以這樣來描述:

(ax)=((ss)*16+(sp))

(sp)=(sp)+2

()可以理解為c語言中的指標取值的*

我們在debug 中寫過類似的指令:mov ax,[0],表示將 ds:0 處的資料送入ax中。指令中,在「[…]」裡用乙個常量0表示記憶體單元的偏移位址。

以後,我們用idata表示常量。

例如:mov ax,[idata] 就代表 mov ax,[1]、mov ax,[2]、mov ax,[3] 等。

mov bx,idata 就代表 mov bx,l、mov bx,2、mov bx,3 等。

mov ds,idata 就代表 mov ds,1、mov ds,2 等,它們都是非法指令。

指令的格式是:loop 標號,cpu 執行loop指令的時候,要進行兩步操作:

(cx)=(cx)-1;

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

從上面的描述中,我們可以看到,cx中的值影響著loop指令的執行結果。

通常(注意,我們說的是通常)我們用loop指令來實現迴圈功能,cx 中存放迴圈次數。

assumecs:

code

code

segment

movax

,2 mov

cx,11

s:addax,

axloop s

movax,4c00h

int 21h

code

ends

end

(1)標號在組合語言中,標號代表乙個位址,此程式中有乙個標號s 。它實際上標識了乙個位址,這個位址處有一條指令:add ax,ax。

(2)loop s

cpu 執行loop s的時候,要進行兩步操作:

(cx)=(cx)-1;

判斷cx 中的值,不為0 則轉至標號s 所標識的位址處執行(這裡的指令是「add ax,ax),如果為零則執行下一條指令(下一條指令是mov ax,4c00h)。

(3)以下三條指令

mov cx,11

s: add ax,ax

loop s

執行loop s時,首先要將(cx)減1,然後若(cx)不為0,則向前轉至s處執行add ax,ax。所以,我們可以利用cx來控制add ax,ax的執行次數。

(1)在cx中存放迴圈次數;

(2)loop 指令中的標號所標識位址要在前面;

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

mov cx,迴圈次數

s: 迴圈執行的程式段

loop s

(1)運算後的結果是否會超出dx所能儲存的範圍?

ffff:0006 單元中的數是乙個位元組型的資料,範圍在0~255之間,則用它和3相乘結果不會大於65535,可以在dx 中存放下。

(2)我們用迴圈累加來實現乘法,用哪個暫存器進行累加?

我們將ffff:0006單元中的數賦值給ax,用dx進行累加。先設(dx)=0,然後做3次(dx)=(dx)+(ax)。

(3) ffff:0006單元是乙個位元組單元,ax是乙個 16 位暫存器,資料長度不一樣,如何賦值?

注意,我們說的是「賦值」,就是說,讓 ax 中的資料的值(資料的大小)和ffff:0006 單元中的資料的值(資料的大小)相等。

8位資料01h和16位資料0001h的資料長度不一樣,但它們的值是相等的。

ffff:0006單元中的資料是xxh,若要ax中的值和ffff:0006單元中的相等,ax中的資料應為00xxh。

所以,若實現ffff:0006單元向ax 賦值,我們應該令(ah)=0,(al)=(ffff6h)。

實現計算ffff:0006單元中的數乘以3,結果儲存在dx中的程式**。

注意程式中的第一條指令mov ax,0ffffh。

我們知道大於9fffh的十六進製制資料a000h、a001h、…… 、c000h、c001h、……、fffeh、ffffh等,在書寫的時候都是以字母開頭的。而在彙編源程式中,資料不能以字母開頭,所以要在前面加0。

debug中的p命令:

用來結束程式,用來結束迴圈

debug中的g命令:

用來跳過迴圈

組合語言 筆記 BX 和loop指令

符號mov ax,bx inc bx 功能 bx中的內容加1 loop指令的格式為 loop 標號 cpu執行loop指令時,進行兩步操作 程式設計計算2 12 assume cs code code segment mov ax,2 mov cx,11 s add ax,ax loop s mov...

組合語言 bx 和loop指令和多個段

要完成描述乙個記憶體單元,需要兩種資訊 記憶體單元的長度 型別 loop指令和cx相配合實現迴圈功能的,cx中存放迴圈的次數。loop指令的格式是 loop 標號,cpu執行loop指令的時候,要進行兩步操作 mov cx,迴圈次數 s 迴圈執行的程式段 loop s在8086模式限制下如果資料,棧...

組合語言 bx 和loop指令和多個段

要完成描述乙個記憶體單元,需要兩種資訊 記憶體單元的長度 型別 loop指令和cx相配合實現迴圈功能的,cx中存放迴圈的次數。loop指令的格式是 loop 標號,cpu執行loop指令的時候,要進行兩步操作 mov cx,迴圈次數 s 迴圈執行的程式段 loop s在8086模式限制下如果資料,棧...