整理自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模式限制下如果資料,棧...