




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章匯編語言程序設計初步3.1系統功能調用3.2匯編語言源程序的設計的基本步驟3.3分支結構的匯編語言源程序的編寫3.4循環結構的匯編語言源程序的編寫開始第3章匯編語言程序設計初步3.1系統功能調用開3.1
系統功能調用3.1.1系統功能調用概述3.1.2基本I/O調用返回本章首頁3.1系統功能調用3.1.1系統功能調用概述返回本章3.1.1系統功能調用概述
我們在編制匯編源程序時,常常要與外部設備發生關系,如希望能從鍵盤輸入字符或在顯示器上顯示出程序運行的結果,但由于計算機機種的不同、外部設備型號的差異,控制它們工作的程序也會有差異。如果每次都需要根據自己的工作環境來設計“控制這些外設工作的程序”,則必須要先弄清楚與之有關的設備、電路、接口等各方面的情況,是一件既復雜,效率又低的事情,并且沒有通用性。如果把這些控制過程預先編寫成一個一個子3.1.1系統功能調用概述我們在編制匯編程序,作為操作系統的一部分事先放在系統盤上,用戶在需要時只要按規定的格式設置好參數,直接調用這些子程序即可。美國MICROSOFT公司為我們提供的磁盤操作系統(DOS)就具有這種功能,稱為“利用操作系統的標準功能調用(簡稱系統功能調用)”,編號從0~62H(3.0版),主要分為設備管理(如鍵盤、顯示器、打印機、磁盤等的管理)、文件管理、目錄管理及其他功能調用4大類。程序,作為操作系統的一部分事先放在系統盤上,用戶在需要時只要●系統功能調用的基本方法采用一條軟中斷指令INTn。所謂中斷,是指當計算機正在執行正常的程序時,計算機系統中的某個部分突然出現某些異常情況或特殊請求,CPU這時就中止(暫停)它正在執行的程序,而轉去執行申請中斷的那個設備或事件的中斷服務程序,執行完這個服務程序后,再自動返回到程序斷點執行原來中斷了的正常程序。這個過程或這種功能就叫做中斷。軟中斷是以指令方式產生的中斷,n是中斷類型號,不同的n將轉入不同的中斷處理程序。系統功能調用是21號軟中斷。●系統功能調用的基本方法采用一條軟中斷指令I常用的系統功能調用表:表3-1最常用的系統功能調用表常用的系統功能調用表:表3-1最常用的系統功能調用表●系統功能調用的步驟:1)將調用參數裝入指定的寄存器。2)如需要功能調用號(即欲調用的子程序編號),把它裝入寄存器AH。3)如需要子功能調用號,把它裝入AL。4)按中斷號調用DOS(發出中斷指令:INT21H)。5)檢查返回參數是否正確。●系統功能調用的步驟:1)將調用參數裝入指定的寄存器。
3.1.2基本I/O調用1.01H號調用
功能:從標準輸入設備上(通常為鍵盤)讀取字符,并在標準輸出設備上(通常為顯示器)回顯。
格式:MOVAH01H INT21H
說明:輸入字符的ASCII碼送入AL中,如果讀到的字符是Ctrl+C或Ctrl+Break,則結束程序。2.02H號調用
功能:通過標準輸出設備(多為顯示器)輸出字符。 3.1.2基本I/O調用1.01H號調用
格式:MOVDL,
X;(X為要輸出顯示的ASCII字符代碼)
MOVAH,02H
INT
21H
說明:DL寄存器中的內容等于要輸出字符的ASCII碼,在顯示輸出時檢查到的字符是Ctrl+C或Ctrl+Break鍵的,則結束程序。3.09H號調用
功能:在標準輸出上(通常為顯示器)顯示一個字符串。字符串要以字符“$”為結束標志。
格式:MOVAH09H
INT
21H說明:要輸出顯示的字符串的首地址送到DS、DX兩個寄存器中,其中段地址送DS寄存器,格式:MOVDL,X;(X為要輸出顯示偏移地址送DX寄存器。4.0AH號調用功能:從標準輸入設備上(通常為鍵盤)讀一個字符串,存入內存,直到按回車鍵為止。格式:MOVAH,0AH INT21H說明:此項操作,要求事先定義一個輸入緩沖區,它的緩沖區首地址送到DS、DX兩個寄存器中,其中段地址送DS寄存器,偏移地址送DX寄存器。偏移地址送DX寄存器。【例3-1】在顯示器上顯示字符串WelcometoTianHecollege!DATASSEGMENT;/數據段定義開始
STRINGDB'WelcometoTianHecollege!',0AH,0DH,'$';/定義字符串,0AH,0DH表示顯示字符串后,光標可自動
回車換行,字符串必須以$結束。
DATASENDS;/數據段定義結束CODESSEGMENT
;/代碼段定義開始ASSUMECS:CODES,DS:DATAS,SS:STACKS;
/說明段和段寄存器之間的關系START:
MOVAX,DATAS;/將數據段的段地址送寄存器AX
MOVDS,AX;/將AX內容送DS寄存器,即初始化DS
LEADX,STRING;/將STRING的偏移地址送DX寄存器
【例3-1】在顯示器上顯示字符串WelcometoTi
MOVAH,9
;/字符串顯示子功能,9號系統功能調用
INT21H;/系統調用
MOVAH,4CH;/返回DOS
INT21H
;/系統調用CODESENDS;/代碼段定義結束ENDSTART【例3-2】從鍵盤輸入字符串,把它放到緩沖區中存儲起來。DATASEGMENT
MAXLENDB100
;/定義緩沖區的最大容量
ACLENDB?
;/定義實際讀入的字符數
STRINGDB100DUP(?);/定義接收字符串空間DATAENDSMOVAH,9;/字符串顯示子功能,9號系CODESEGMENT
MOVAX,DATA
MOVDS,AX
;/數據段初始化
LEADX,MAXLEN
;/送
MAXLEN的偏移地址到寄存器DX
MOVAH,10;/10號系統功能調用
INT21H;/系統調用CODEENDS運行程序時,若從鍵盤輸入“Thankyou!”(共計10個字符),則輸入緩沖區MAXLEN各單元的內容如圖3-1所示。圖3-1存儲空間分配示意CODESEGMENT圖3-1存儲空間分配示意
3.2
匯編語言源程序的設計的基本步驟3.2.1源程序的基本框架3.2.2匯編語言源程序設計的基本步驟3.2.3順序結構的匯編語言源程序的編寫返回本章首頁 3.2匯編語言源程序的設計的基本步驟3.2.1源程序3.2.1源程序的基本框架
一個匯編語言源程序由兩大部分組成的。其中主要部分就是指令,位于代碼段內,代碼段可以有好幾個。其他部分是為指令服務的,包括數據的準備,存儲區域的劃分和地址的標注。其他部分由數據段、堆棧段和擴展段組成。也各可以有好幾個。段之間的順序可以隨意安排。但通常是其他部分(數據段、堆棧段和擴展段等)在前,代碼段在后。雖然可以定義多個段,但由于段首址存放在CPU的寄存器中,所以可以同時使用6個段:代碼段(CS)、數據段(DS)、堆棧段(SS)和3個擴展段(ES、FS和GS)。擴展段其實也是數據段,只是段地址在寄存器ES、FS和GS中。程序通過修改段寄存器的值實現段的切換。3.2.1源程序的基本框架一個匯編語言源程一個程序至少包含一個代碼段和END指令。其他段的設置由程序的具體功能需要而定。程序較小時,可以不設置堆棧段。操作系統在裝載不含堆棧段的程序時,會指定一個段作為堆棧段使用。這樣,程序連接時,LINK會產生一條警告信息: WARNING:NOSTACKSEGMENT
但不會影響程序的運行,可以忽略它。
程序中的段名可以是唯一的,也可以與其它段同名。在同一模塊中,如果有兩個段同名,則后者被認為是前段的后續,這樣,它們就屬同一段。當同一模塊出現兩個同名段時,則后者的可選項屬性要么與前者相同,要么不寫其屬性而選用前者的段屬性。一個程序至少包含一個代碼段和END指令。其他段的設置由程序的【例3-4】段寄存器與段的對應方法1:用一個段寄存器對應兩個數據段DATA1SEGMENT;/定義第一個數據段
b1DB10h
;/定義變量DATA1,字節變量DATA1ENDS
;/第一個數據段結束DATA2SEGMENT
;/定義第二個數據段
b1DB23h
;/定義變量DATA2,字節變量DATA2ENDS
;/第二個數據段結束CODE1SEGMENT
;/定義第一個代碼段ASSUMECS:CODE1,DS:DATA1;/指定段寄存器START:MOVAX,DATA1;/指令開始,
MOVDS,AX;/把數據段DATA1的段首址賦給段寄存器DS【例3-4】段寄存器與段的對應方法1:用一個段寄存器對應兩個………………
MOVBL,b1;/引用DS來訪問DATA1中的變量b1………………ASSUMEDS:DATA2;/說明DS與DATA2建立聯系MOVAX,DATA2;MOVDS,AX;/把數據段DATA2的段值賦給段寄存器DS………………
/實現段的切換MOVAL,b2;/引用DS來訪問DATA2中的變量b2………………CODE1ENDS;/代碼段CODE1結束ENDSTART;/程序結束
在方法1中,因為只使用一個段寄存器DS來對應兩個數據段,所以,需要切換DS的對應關系。但我們也可以用段寄存器DS和ES來分別對應段DATA1和DATA2,這樣,方法1就可變成方法2。………………方法2:用兩個段寄存器對應兩個數據段DATA1SEGMENT;/定義第一個數據段
b1DB10h;/定義變量DATA1,字節變量DATA1ENDS;/第一個數據段結束DATA2SEGMENT;/定義第二個數據段
b2DB23h;/定義變量DATA2,字節變量DATA2ENDS;/第二個數據段結束CODE1SEGMENT;/定義第一個代碼段ASSUMECS:CODE1,DS:DATA1,ES:DATA2;/指定段寄存器START:MOVAX,DATA1;/指令開始,
MOVDS,AX;/把數據段DATA1的段首址賦給段寄存器DS
MOVAX,DATA2
MOVES,AX;/把數據段DATA2的段首址賦給段寄存器ES………………
方法2:用兩個段寄存器對應兩個數據段
MOVBL,b1;/引用DS來訪問DATA1中的變量b1………………
MOVAL,b2;/引用ES來訪問DATA2中的變量b2………………
CODE1ENDS;/代碼段CODE1結束ENDSTART;/程序結束
我們還可以用“段組”來簡化段寄存器的使用,把段DATA1和DATA2組成一個數據段。所以,把方法2再改寫成方法3的形式。方法3:用一個段組組成兩個數據段GSEGGROUPDATA1,DATA2;/定義段組DATA1SEGMENT;/定義第一個數據段MOVBL,b1
b1DB10h;/定義變量DATA1,字節變量DATA1ENDS;/第一個數據段結束DATA2SEGMENT;/定義第二個數據段
b2DB23h;/定義變量DATA2,字節變量DATA2ENDS;/第二個數據段結束CODE1SEGMENT;/定義第一個代碼段
ASSUMECS:CODE1,DS:GSEGSTART:MOVAX,GSEG;/指令開始,
MOVDS,AX;/把段組GSEG的段值賦給段寄存器DS………………
MOVBL,b1;/引用DS來訪問DATA1中的變量b1………………
MOVAL,b2;/引用DS來訪問DATA2中的變量b2………………b1DB10h………………
CODE1ENDS;/代碼段CODE1結束ENDSTART;/程序結束
定義段組后,段組內各段所定義的標號和變量,除了與定義它們的段起始點相關外,還與段組的起始點相關。規定如下:
如果在ASSUME偽指令中說明段組與段寄存器相對應,那么,有關標號或變量的偏移量就相對于段組起點計算;
如果在ASSUME偽指令中說明段組內的某段與段寄存器相對應,那么,有關標號或變量的偏移量就相對于該段的起點。
所以,在使用段組后,程序員要謹慎使用ASSUME偽指令,并保證段寄存器的值與段組或段相一致。………………定義段組后,段組內各段所定義
3.2.2匯編語言源程序設計的基本步驟1.匯編語言源程序的主要基本結構:
順序結構
分支結構
循環結構2.好程序的要求一個好的程序,首先應該能正常運行,實現預定的功能。還應該滿足:結構簡明,明白易懂,調試方便,修改容易。執行速度快(程序執行時間短,程序語句行數盡量少)。占用內存空間少。 3.2.2匯編語言源程序設計的基本步驟1.匯編語言源程3.基本步驟分析問題,從中抽象出恰當的數學模型。確定解決問題的合理算法。畫出程序流程圖,根據算法,細化并找出解決問題的思路和具體方法。確定匯編語言程序的基本框架:各個存儲段的定義,存儲空間的分配,寄存器的配置,指針和計數器的選擇。根據程序流程圖確定程序的基本結構,并編寫程序。3.基本步驟3.2.3順序結構的匯編語言源程序的編寫
順序結構是最簡單的程序結構,沒有分支,沒有循環,程序的執行順序就是指令的編寫順序,所以,又稱直線程序。因此,安排指令的先后次序就顯得至關重要。另外,在編程序時,還要妥善保存已得到的處理結果,為后面的進一步處理直接提供前面的處理結果,從而避免不必要的重復操作。3.2.3順序結構的匯編語言源程序的編寫順序結構【例3-5】兩個64位無符號數相加●分析問題:在8086/8088CPU中,只有8位或16位運算指令,沒有32位和64位以上的運算指令。●確定算法:要進行64位的加法運算,可以確定算法:利用16位加法指令分別相加4次來實現。●畫程序流程圖:本問題簡單,無需畫程序流程圖。●確定匯編語言程序的基本框架:可見,匯編語言程序的基本框架至少要兩個段:數據段和代碼段。數據段中至少定義3個變量:兩個加數N1、N2,還有一個和數SUM,都是DW類型。和數SUM尚屬未知,故應定義一個5個字長(比64位字長富余一點)的緩沖區。因為要加4次,需要一個計數器或指針,可選寄存器BX充當。●編寫程序,可以想得到,需要MOV、ADD、ADC和INC等指令。具體程序如下:【例3-5】兩個64位無符號數相加●分析問題:在8086/8DATASEGMENT;/定義數據段 N1DW1234H,5678H,9ABCH,0DEF0H;/定義字變量N1
N2DW1971H,0313H,1968H,1123H;/定義字變量N2
SUMDW5DUP(?);/定義緩沖區SUMDATA1END;/數據段結束CODESEGMENT;/定義第一個代碼段
ASSUMECS:CODE,DS:DATA;/指定段寄存器MAINPROCNEARSTART:MOVAX,DATA;/指令開始,
MOVDS,AX;/把數據段的段首址賦給段寄存器DS
LEABX,N1;/將N1的偏移地址送BX
MOVAX,[BX];/引用DS來訪問DATA中的變量N1的最低位DATASEGMENT;/定義數據段
ADDAX,[BX+8];/最低位字相加,因兩個數偏移地址相差8個字節
MOV[BX+16],AX;/存最低位和。[BX+16]指示SUM的偏移地址
此句也可以寫為:MOV[SUM],AX
INCBX
INCBX;/指針指向下一個字
MOVAX,[BX];/引用DS來訪問DATA中的變量N1的次低位 ADCAX,[BX+8];/次低位字相加,因兩個數偏移地址相差8個字節
MOV[BX+16],AX;/存次低位和。[BX+16]指示SUM+1的偏移
地址,此句也可以寫為:MOV[SUM+1],AX
INCBX
INCBX;/指針指向下一個字
MOVAX,[BX];/引用DS來訪問DATA中的變量N1的次高位
ADCAX,[BX+8];/次高位字相加,因兩個數偏移地址相差8個字節ADDAX,[BX+8]
MOV[BX+16],AX;/存次高位和。[BX+16]指示SUM+2的偏移
地址,此句也可以寫為:MOV[SUM+2],AX
INCBX INCBX
;/指針指向下一個字
MOVAX,[BX]
;/引用DS來訪問DATA中的變量N1的最高位
ADCAX,[BX+8]
;/最高位字相加,因兩個數偏移地址相差8個字節
MOV[BX+16],AX;/存最高位和。[BX+16]指示SUM+3的偏移
地址,此句也可以寫為:MOV[SUM+3],AX
MOVAX,0
;/對AX清零
ADCAX,0
;/計算進位
MOV[BX+18],AX;/存進位位
MOVAH,4CH
;/此句也可寫成:MOVAX,4C00H
INT21H
MAINENDP CODEENDS
;/代碼段CODE1結束
ENDSTART
;/程序結束
MOV[BX+16],AX;/存次高位和。[【例3-6】兩個32位無符號數乘法程序●分析問題:在8086/8088CPU中,只有8位或16位運算指令,沒有32位以上的乘法運算指令。●確定算法:要進行32位的乘法運算,可以確定算法:利用16位乘法指令做4次乘法,然后把部分積相加來實現。每次的積的低位送AX,高位送DX。如圖3-2所示。●畫程序流程圖:程序流程圖如圖3-3所示。●確定匯編語言程序的基本框架:可見,匯編語言程序的基本框架至少要兩個段:數據段和代碼段。數據段中至少定義3個變量:兩個乘數,還有一個積數,都是DW類型。積數尚屬未知,故應定義一個4個字長(積的字長應該是乘數字長的兩倍)的緩沖區。因為要乘4次,需要一個計數器或指針,可選寄存器BX充當。另外,本程序為了教學的需要,不采用 MOVAH,4CH INT21H【例3-6】兩個32位無符號數乘法程序●分析問題:在8086來返回DOS。而改用“先將程序段前綴的起始地址及數據段DS段首址和偏移地址AX存入堆棧,再用指令RET返回DOS的方法。所以,又定義了100個字節的堆棧段。同時堆棧段又為保存最后的進位位提供了條件。
●編寫程序,可以想得到,需要MOV、MUL、ADD、ADC、PUSH、PUSHF和RET等指令。具體程序如下:來返回DOS。而改用“先將程序段前綴的起始地址及數據段DS段
NUME32bitMULTIPLY;程序名“32位乘法”DATASEGMENT;數據段定義開始MULNUMDW0000H,0FFFFH,0000H,0FFFFH,4DUP(?);DATAENDS;數據段定義結束STACKSEGMENTPARASTACK‘STACK’;堆棧段定義開始
DB100DUP(?);堆棧段長度為100字節STACKENDS;堆棧段定義結束CODESEGMENT;代碼段開始
ASSUMECS:CODE,DS:DATA,SS:STACK;指定段寄存器STARTPROCFAR;圖3-3程序流程圖NUME32bitMULTIPLY;程序BEGIN:PUSHDS;將DS中包含的程序段前綴壓棧保存 MOVAX,0;將0送AX,即設置AX的初值為0 PUSHAX;將DS中AX的偏移地址壓棧,這三句即保存返回至DOS的段值和IP值。 MOVAX,DATA; MOVDS,AX
;將數據段首地址送DS
LEABX,MULNUM;將MULNUM的偏移地址送BX,定義了地址指針MULNUM32:MOVAX,[BX];被乘數的低16位B→AX
MOVSI,[BX+4];乘數的低16位D→SI
MULSI;B×D,部分積1的低位送AX,部分積1的
高位送DX,
MOV[BX+8],AX;保存部分積1的低位
MOV[BX+0AH],DX;保存部分積1的高位
MOVAX,[BX+2];被乘數的高16位A→AXBEGIN:PUSHDS;將DS中包含的程序段
MULSI;A×D,部分積2的低位送AX,部分積2的高
位送DX ADDAX,[BX+0AH];部分積1的高位+部分積2的低位 ADCDX,0;加入部分積1的低位的進位
MOV[BX+0AH],AX;保存部分積1的高位+部分積2的低位
MOV[BX+0CH],DX;保存部分積2的高位 MOVAX,[BX];被乘數的低16位B→AX
MOVDI,[BX+6];乘數的高16位C→DI MULDI;B×C,部分積3的低位送AX,部分積3的高位送DX ADDAX,[BX+0AH];部分積1的高位+部分積2的低位+部分
積3的低位
ADCDX,[BX+0CH];部分積2的高位+部分積3的高位+進位
MOV[BX+0AH],AX;保存部分積1的高位+部分積2的低位
+部分積3的低位
MULSI;A×D,部分
MOV[BX+0CH],DX;保存部分積2的高位+部分積3的高位+進位
PUSHF;將標志寄存器壓棧,保存“部分積2的高位+部分積3的
高位+進位”的進位位
MOVAX,[BX+2];被乘數的高16位A→AX
MULDI;A×C,部分積4的低位送AX,部分積4的高位送DX
POPF
;彈出堆棧保存的“部分積2的高位+部分積3的高位+進位”
ADCAX,[BX+0CH];部分積4的低位+部分積2的高位+部
分積3的高位+進位
ADCDX,0;部分積4的高位+進位
MOV[BX+0CH],AX;保存“部分積4的低位+部分積2的高位
+部分積3的高位+進位”+進位
MOV[BX+0EH],DX;保存部分積4的高位+進位
RET
STARTENDP
CODEENDS
ENDBEGIN MOV[BX+0CH],
3.3
分支結構的匯編語言源程序的編寫3.3.1
條件轉移指令3.3.2
匯編語言分支結構程序的編寫返回本章首頁3.3分支結構的匯編語言源程序的編寫3.3.1條件 在匯編語言程序設計中,常利用條件轉移指令實現程序的分支。指令助記符是隨條件變化而變化的,其構成方法是:第一個字母是J,緊接著的字母是標志寄存器的代號P、S、Z、……,表示“條件”,條件滿足,則轉移。例如JZ,表示結果為0,則轉移;如果“條件”是否定的,就在已構成的兩個字母間加字母N,例如JNZ,表示結果不為0,則轉移。條件轉移指令只有一個操作數,指出轉移的目標地址,并且只能是一個短標號,即轉移的偏移地址是8位的。 有一個條件轉移指令JCXZ,構成方法較特殊,它的轉移條件是寄存器CX的內容為0,而不是標志寄存器的某位的標志。
所有的條件轉移指令都不影響標志位。3.3.1
條件轉移指令 在匯編語言程序設計中,常利用條件轉移指令實現程序的分支。指(1)根據單個標志的設置情況的轉移指令。共五種10條: 1)JZ(或JE);上一步的結果為零(或相等)則轉移。格式:JE(或JZ)標號測試條件:ZF=1 2)JNZ(或JNE);上一步的結果不為零(或不相等)則轉移。格式:JNZ(或JNE)標號測試條件:ZF=0 3)JS;上一步的結果為負,則轉移。格式:JS標號測試條件:SF=1
4)JNS;上一步的結果為正,則轉移。現將所有的條件轉移指令列舉如下:(1)根據單個標志的設置情況的轉移指令。現將所有的條件轉移指格式:JNS標號測試條件:SF=0 5)JO;上一步的結果為溢出,則轉移。格式:JO標號測試條件:OF=1 6)JNO;上一步的結果不為溢出,則轉移。格式:JNO標號測試條件:OF=0 7)JP(或JPE);上一步的結果的奇偶標志位為1,則轉移。格式:JP標號測試條件:PF=1 8)JNP(或JPO);上一步的結果的奇偶標志位為0,則轉移。格式:JNP(或JPO)標號測試條件:PF=0 9)JC;上一步有進位或借位,則轉移。格式:JNS標號格式:JC標號測試條件:CF=1 10)JNC;上一步無進位或無借位,則轉移。格式:JNC標號測試條件:CF=0(2)比較兩個無符號數,并根據比較結果的高低轉移。
1)JAJNBE(或JNBE)高于,即不低于或等于,則轉移。格式:JA(或JNBE)標號測試條件:CF=0且ZF=0 2)JNA(或JBE)不高于,即低于或等于,即則轉移。格式:JBE(或JNA)標號測試條件:CF=0或ZF=1 3)JB(或JNAE,JC)低于,即不高于或等于,或進位為1則轉移格式:JB(或JNAE,JC)標號格式:JC標號(2)比較兩個無符號數,并根據比較結果的高 測試條件:CF=1 4)JNB(或JAE,JNC)不低于,或高于或等于,或進位為0則轉移格式:同上測試條件:CF=0(3)比較兩個帶符號數,并根據比較的結果的大小轉移。
1)JL(或LNGE)小于,或者不大于且等于,則轉移。格式:JL(或JNGE)標號測試條件:SF異或OF=1 2)JNL(或JGE)不小于,即或者大于或者等于則轉移。格式:JNL(或JGE)標號測試條件:SF異或OF=0 3)JLE(或JNG)小于或等于,即不大于則轉移。格式:JLE(或JNG)標號測試條件:(SF異或OF)或ZF=1 測試條件:CF=1(3)比較兩個帶符號數,并根據比較的結果
4)JNLE(或JG)不小于或等于,即大于則轉移。格式:JNLE(或JG)標號測試條件:(SF異或OF)或ZF=0(4)測試CX的值為0則轉移指令格式:JCXZ標號測試條件:(CX)=0 4)JNLE(或JG)不小于或等于,即大于則轉移。(4)測3.3.2匯編語言分支結構程序的編寫在設計分支程序時必須注意以下幾點:(1)正確選擇分支形成的判定條件和相應的條件轉移指令。
(2)對每個分支程序的入口,一定要給出標號,標明不同分支的轉向地址。必須保證每條分支都有完整的結果。
(3)在檢查和調試時必須對所有的分支進行,因為某幾條分支正確,不足以說明整個程序是正確的。3.3.2匯編語言分支結構程序的編寫在設計分支程序時必
分支結構程序的分類:
?
簡單的二分支結構程序
?多分支結構程序分支結構程序的分類:1.簡單的二分支結構設計舉例【例3-7】把a,b兩個8位數中較大的數賦值給max。●分析問題:這是典型的二分支結構。確定分支的條件是a>b嗎?●確定算法:采用比較轉移指令,在匯編語言中用AL來保存中間結果。因為讀取寄存器比讀取存儲器要快,并且,匯編語言指令不允許兩個操作數都為存儲單元。●畫程序流程圖:畫程序流程圖,見圖3-5。圖3-5例3-7程序流程圖1.簡單的二分支結構設計舉例【例3-7】把a,b兩個8●確定匯編語言程序的基本框架:可見,該匯編語言程序的基本框架至少要兩個段:數據段和代碼段。數據段中至少定義3個變量:兩個數a、b,還有一個最大數max,都是8位數,應選DB類型,但考慮到執行CMP指令實際上是作減法,可能有借位的情況,故選DW類型。max尚屬未知,故應定義一個字長的緩沖區。還要用到寄存器AL。●編寫程序,可以想得到,需要MOV、CMP等指令。最后要返回DOS。具體程序如下:DATASEGMENT?;/定義數據段aDW?
;/定義字變量abDW?
;/定義字變量bmaxDW?
;/定義字變量maxDATAEDNS
;/數據段定義結束CODESEGMENT ASSUMECS:CODE,DS:DATA●確定匯編語言程序的基本框架:可見,該匯編語言程序的基本框架START:MOVAX,DATA
MOVDS,AXMOVAL,aCMPAL,b;/比較a和b,產生分支
JAEXIT;/如果a>b,則跳轉到EXIT語句,否則,執行下列語句MOVAL,b;/送b到寄存器EXIT:MOVmax,AL;/送(AL)到存儲單元max
MOVAH,4CH;INT21H;/返回DOSCODEENDS;/代碼段結束
ENDSTART;/程序結束START:
2.多分支結構程序設計多分支結構程序設計比較復雜一些。關鍵是怎樣根據條件對多分支進行判斷,確定不同分支程序轉移的入口地址。方法有:(1)邏輯分解流程圖法
根據邏輯分解流程圖,按照判別條件的先后,逐個進行判斷和轉移。設分支條件為X1,X2,……,XN,則邏輯分解流程圖為3-6所示。
圖3-6邏輯分解流程圖2.多分支結構程序設計多分支結構程序設計比較復雜一些。關鍵【例3-8】試編寫執行符號函數
的程序。●分析問題:由題意可知,這是多分支結構。本題有三個分支:X>0、X=0和X<0。按照邏輯分解的方法,可以先將其歸并為兩個條件:X≥0和X<0,由此形成兩個分支;再將分支X≥0分解為X>0和X=0,各分支均用條件轉移指令來實現。●確定算法:采用比較轉移指令。●畫程序流程圖:畫程序流程圖,見圖3-7。●確定匯編語言程序的基本框架:可見,該匯編語言程序的基本框架至少要兩個段:數據段和代碼段。數據段中至少定義2個變量:兩個數X和Y,由題設為8位數,應選DB類型,但考慮到執行CMP指令實際上是作減法,可能有借位的情況,故選DW類型。假設任意給定的X值存放在XX單元,函數Y的值存放在YY單元。●編寫程序,可以想得到,需要MOV、CMP和程序轉移等指令。【例3-8】試編寫執行符號函數最后要返回DOS。
具體程序如下:DATASEGMENT?;/定義數據段
XXDW;/定義字變量X
YYDW?;/定義字變量Y
DATAEDNS;/數據段定義結束CODESEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX;/給DS賦值
MOVAL,XX;
CMPAL,0;/XX與零比較
開始(AL)←XX(AL)≥0(AL)>0(AL)←1結束YN圖3-7例3-8程序流程圖(AL)←-1(AL)←0YN最后要返回DOS。
具體程序如下:DATASEGMENTJGEBIGR;/X=(AL)≥0,則轉移到BIGR語句
MOVAL,0FFH;/否則,X<0時,將–1送入AL JMPEQUL;/無條件轉移語句,轉移到EQUL語句
BIGR:JEEQUL;/X=0,則轉移到EQUL語句
MOVAL,1;/X>0時,將1送入AL
EQUL:MOVYY,AL;/無論結果如何,都將(AL)送入YY單元
HLT;/暫停(2)跳轉地址表法
如果各分支的判定結果可以用一個寄存器的不同的有序的值來表示,則可將各分支程序的入口地址與寄存器的不同的有序的值一一對應,列入一張表中,此表稱為跳轉地址表。JGEBIGR;/X=(AL)≥0,如圖3-8所示。各分支程序的入口地址的計算公式是:
各分支程序的入口地址=寄存器的值×2+跳轉地址表首地址
這種利用跳轉地址表實現多分支程序的轉移的方法,稱為跳轉地址表法。圖3-8分支程序入口地址表如圖3-8所示。各分支程序的入口地址的計算公式是:【例3-9】根據AL中的被置位的情況來控制轉移到8個分支程序R1~R8中的一個(在中斷響應時,通過軟件查詢,從而轉到相應的中斷服務程序入口就類似于這種情況)。
如果AL中為00000001則轉至R1
如果AL中為00000010則轉至R2
如果AL中為00000100則轉至R3
如果AL中為00001000則轉至R4
如果AL中為00010000則轉至R5
如果AL中為00100000則轉至R6
如果AL中為01000000則轉至R7
如果AL中為10000000則轉至R8
實現上述要求的程序框圖如圖3-9所示。我們可以把8個子程序的入口地址編成如圖3-8所示的分支程序入口地址表。根據流程圖可以寫出如下程序:【例3-9】根據AL中的被置位的情況來控制轉移到8個分支程序●分析問題:由題意可知,要求根據某種條件實現8個分支程序●確定算法:采用跳轉地址表法(見圖3-8分支程序入口地址表),結合條件轉移指令來實現。●畫程序流程圖:見圖3-9。●確定匯編語言程序的基本框架:可見,該匯編語言程序的基本框架要三個段:數據段、堆棧段和代碼段。數據段中創建分支程序入口地址表,應選DW類型,使用寄存器BX定位。●編寫程序,可以想得到,需要MOV、JMP、JC、INC、LEA和PUSH等指令。最后要返回DOS。未想到的,在編寫過程中根據需要隨時添加,如RCR指令等。
具體程序如下:
NAMEBRANCH_PROGDATASEGMENT●分析問題:由題意可知,要求根據某種條件實現8個分支程序BRTABDWR11;/開始創建分支程序入口地址表。第一步創建分支程序R1入口地址的IP值 DWR12;/創建分支程序R1入口地址的碼段值
DWR21;/仿DWR11,下同
DWR22;/仿DWR12,下同
DWR31
DWR32
DWR41
DWR42
DWR51
DWR52
DWR61
DWR62
DWR71
DWR72
DWR81
DWR82圖3-9分支程序轉移流程圖BRTABDWR11;/開始創建分支程序入口地址DATAENDSSTACKSEGMENTPARASTACK'STACK'
DB100DUP(?);/定義一個100個字節的堆棧空間TOPEQU$-STACK;/棧頂的地址為程序的當前地址與堆棧首地址的差。STACKENDSCODESEGHENTSTARTPROCFAR
ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:PUSHDS;/將數據段首址壓棧
MOVAX,0;/將寄存器AX清零
PUSHAX;/使程序能返回DOS
MOVAX,DATA
MOVDS,AX;/將DATA段首址(即分支程序入口地址表)送寄存器DSDATAENDS
MOVAX,STACK;
MOVSS,AX;/將堆棧段首址送寄存器SS
MOVAX,TOP
MOVSP,AX;/將堆棧段棧頂地址送堆棧指針寄存器SP
LEABX,BRTAB;/設跳轉表的地址指針GTBIT:RCRAL,l;/通過進位循環右移
JCGETAD;/在循環右移過程中順序檢查AL中各位的狀態
INCBX;/BX自動加1
INCBX;/BX自動加1,移到下一分支
INCBX;/BX自動加1
INCBX;/BX自動加1,完成寄存器的值×2
JMPGTBITGETAD:JMPDWORDPTR[BX];/段間間接轉移STARTENDPCODEENDS
ENDBEGIN MOVAX,STACK;(3)跳轉指令表法
跳轉指令表法的思路與跳轉地址表法基本相同,不同的只是它是在代碼段中把轉移到各個分支程序段的跳轉指令放在一個表中,該表就稱為“跳轉指令表”。表內跳轉轉移指令的地址的計算公式:
表內跳轉指令表的地址=(編號-1)×2+跳轉指令表的首地址
=編號×2-2+跳轉指令表的首地址(3)跳轉指令表法跳轉指令表法的思路與跳轉地當
N=1時,顯示信息(DSPLAY); N=2時。傳送信息(TRAN); N=3時。處理信息(PROCl); N=4時,打印信息(PRTN); N=5時。結束程序(EXIT).
相應的處理為一獨立的程序段,它們的入口地址分別為DSPLAY,TRAN,PROCl,PRIN,EXIT。當這些程序處理結束時仍返回讀入N。只有當N=5時程序才結束。
試利用跳轉指令表的分支程序實現這些要求。【例3-10】由鍵盤輸入一個數N,當N為不同值時應作不同處理當N=1時,顯示信息(DSPLAY);【例3●分析問題:由題意可知,這是一個五分支程序。它們的入口地址分別為DISPLAY,TRAN,PROCl,PRIN,EXIT。當這些程序處理結束時仍返回讀入N。只有當N=5時程序才結束.●確定算法:構建跳轉指令表,采用通過執行跳轉指令表中相應的跳轉指令,就可以轉移到不同的分支。●畫程序流程圖:略。●確定匯編語言程序的基本框架:可見,該匯編語言程序的基本框架至少要兩個段:堆棧段和代碼段。堆棧段中定義一個256個字的緩沖區,當然是DW類型,再定義一個字類型的棧頂,用棧頂指針SP定位。采用寄存器AL,AX存數字,寄存器BX存跳轉指令的地址。●編寫程序,可以想得到,需要MOV、JMP、LEA、SUB、ADD、CMP和JB、JA、CBW等指令。最后要返回DOS。未想到的,在編寫過程中根據需要隨時添加,如SHL指令等。為了簡化程序,每段處理程序除了EXIT以外僅給出了一條轉移指令表示當某項處理完成后返回AGAIN繼續從鍵盤讀入一個字符直到輸入字符為‘5’●分析問題:由題意可知,這是一個五分支程序。它們的入口地址分為止。例中存放轉移指令的表JADT2在代碼段中。具體程序如下:STACKSBGMENTSTACK DW256DUP(?);/在堆棧中,定義一個256個字的數據緩沖區TOPLABELWORD;/定義棧頂變量TOP,字類型STACKENDSCODESEGMENT ASSUMECS:CODE,SS:STACKSTART:MOVAX,STACK;
MOVSS,AX;/堆棧段寄存器SS初始化
MOVSP,OFFSSETTOP;/送棧頂的偏移地址到寄存器SPAGAIN:
MOVAH,01;/(AH)=01,1號功能(鍵盤輸入)調用為止。例中存放轉移指令的表JADT2在代碼段中。
INT2lH;/DOS功能調用 SUBAL,30H;/將鍵盤輸入的數字字符的ASCII碼減去
數字字符“0”的ASCII碼“30H”,求出輸入
數字的二進制表示的值,放在AL中
CMPAL,01;/與“1”比較輸入數字的值
JB,AGAIN;/若輸入數字的值比1小,返回程序AGAIN,
由鍵盤重新輸入。若輸入數字的值比1大,接
著執行下一指令
CMPAL,05;/與“5”比較輸入數字的值
JAAGAIN;/若輸入數字的值比5大,返回程序AGAIN,
由鍵盤重新輸入。若輸入數字的值比1大,比
5小,接著執行下一指令
SHLAL,01;/將放在AL中的輸入數字的二進制表示,邏
輯左移1位。依據計算跳轉轉移指令地址的
公式:先作編號×2 INT2lH;/
CBW;/將AL中的8位數擴展為16位數,放在寄存器AX中
MOVBX,OFFSSETJADT2;/送轉移指令跳轉表的首地址
送寄存器BX
ADDBX,AX;/依據計算跳轉轉移指令地址的公式再作:編
號×2+跳轉指令表的首地址
SUBBX,02;/繼續計算,將上一步的結果減去2,完成計算
JMPBX;/跳轉到BX指示的跳轉指令的地址JADT2JMPSHORTDISPLAY:/跳轉表
JMPSHORTTRAN
JMPSHORTPROCl
JMPSHORTPRTN
JMPSHORTEXITDISPLAY:…… CBW;/將AL中的8位數擴展為16位
JMPAGATNTRAN:
…… JMPAGAINPROCl:
…… JMPAGAINPRIN:
…… JMPAGAINEXlT:MOVAH,4CH INT2lHCODEENDS ENDSTART JMPAGATN3.4
循環結構的匯編語言源程序的編寫3.4.1循環控制指令3.4.2程序的循環結構3.4.3控制程序循環的方法3.4.4多重循環返回本章首頁3.4循環結構的匯編語言源程序的編寫3.4.1循環控(1)
循環指令的作用:根據條件滿足與否,完成一串重復的操作,形成循環程序。(2)循環指令有3條,且3條指令都是短轉移(short-label表示短標號)指令。
循環轉移指令LOOP格式:LOOP目標標號測試條件與功能:(CX)不等于0,則(CX)←(CX)–1;(IP)←(IP)+8位偏移量。3.4.1循環控制指令(1)循環指令的作用:3.4.1循環控制指令說明:LOOP指令相當于下面兩條指令的組合: DECCX JNZshort-label;short-label表示短標號相等(為零)循環轉移指令LOOPZ/LOOPE格式:LOOPZ(或LOOPE)目標標號測試條件與功能:(CX)等于0且ZF=1,則(CX)←(CX)–1;(IP)←(IP)+8位偏移量。LOOPNZ/LOOPNE循環指令格式:LOOPNZ(或LOOPNE)目標標號測試條件與功能:(CX)不等于0且ZF=0;則(CX)←(CX)–1;(IP)←(IP)+8位偏移量。說明:LOOP指令相當于下面兩條指令的組合:【例3-11】將數據區的數據按正、負分開,分別送到兩個緩沖區,程序如下:START:MOVSI,OFFSETBLOCK;/將數據區的偏移地址送
SI,即將
SI指向數據區
MOVDI,OFFSETPLUS-DATA;/DI指向正數緩沖區
MOVBX,OFFSETMINUS-DATA;/BX指向負數緩沖區
MOVCX,COUNT;/將數據字節送CXCLD;/將DF清0GOON:LODSB;/取串指令
TESTAL,80H;/字節最高位為1(表示是負數)嗎?
JNZMINUS;/是,則轉移到MINUS語句
STOSB;/否則,執行存入串指令STOSB
JMPAGAIN;/跳轉到AGAIN語句MINUS:XCHGBX,DI;STOSB;XCHGBX,DIAGAIN:LOOPGOONHLT【例3-11】將數據區的數據按正、負分開,分別送到兩個緩沖區
3.4.2
程序的循環結構一個完整的循環結構程序由以下幾部分組成:
1.循環初態設置部分:這是為了保證循環程序能正常運行而必須作的準備工作,在循環開始時往往要給循環過程置以初態,即賦一個初值。循環初態又可以分成兩部分,一是循環工作部分初態,另一是循環結束條件的初態。例如,要設地址指針,要使某些寄存器清零,或設某些標志等等。循環結束條件的初態往往置以循環次數.置初態也是循環程序的重要的一部分,不注意往往容易出錯。
2.循環體:就是要求重復執行的程序段部分。其中又分為:循環工作部分和循環調整部分。循環調整部分修改循環參數,以保證每次循環所完成的功能不是完全重復的。
3.循環結束條件部分:也稱循環出口判定部分。在循環程序中必須給出循環結束條件,否則程序就會進入死循環。每循環一次檢查循環結束的條件,當滿足條件時就停止循環,往下執行其他程序。 3.4.2程序的循環結構一個完整的循環結構程序由以下幾
3.4.3控制程序循環的方法
控制程序循環的方法就是選擇循環控制條件,是循環程序設計的關鍵。
常用的循環控制方法有計數控制法、條件控制法和邏輯尺控制法等。1.計數控制法
常見的循環是計數循環,當循環了一定次數后就結束循環。在微型機中,常用一個內部寄存器(一般用CX),或寄存器對作為計數器,對它的初值置循環次數,每循環一次減1,當計數器的值減為0時,就停止循環。也可以初值置為0,每循環一次加l,再與循環次數相比較,若兩者相等就停止循環。 3.4.3控制程序循環的方法控制程序循【例3-11】編寫一個程序,計算SUM=A1×B1+A2×B2+…+An×Bn。設A1,A2,…,An和B1,B2,…,Bn為無符號數,假定SUM不會超過65535。●分析問題:由題意可知,這是求n個數的累加和,而每個數都是兩個數組對應項的乘積,存在n次重復操作。●確定算法:采用采用比較循環指令,循環次數是n次。故用循環次數作為循環的控制條件,再配合使用LOOP指令。循環控制采用計數控制。●畫程序流程圖:略。●確定匯編語言程序的基本框架:可見,該匯編語言程序的基本框架至少要兩個段:數據段和代碼段。數據段中至少定義4個變量:兩個數組變量A和B,由題設知為8位數,應選DB類型,使用寄存器SI定位。和數SUM變量,由題設知為16位數,選DW類型,其中間結果放在寄存器BX。還有一個數N,為循環次數,計數器用CX。【例3-11】編寫一個程序,計算SUM=A1×B1+A2×●編寫程序,可以想得到,需要MOV、ADD、MUL、INC和LOOP等指令。最后要返回DOS。未想到的,在編寫過程中隨時添加,如XOR指令等。具體程序如下:DATASEGMENT
ADBA1,A2,…,An;/定義變量A
BDBB1,B2,…,Bn;/定義變量B
SUMDW?;/定義變量SUM,其值待求
NEQUB-A;/定義變量N,為循環次數DATAENDSCODESEGMENT ASSUMECS:CODE.DS:DATA START:MOVAX,DATA MOVDS,AX●編寫程序,可以想得到,需要MOV、ADD、MUL、IN XORBX,BX;/準備存放和的寄存器BX清零,設置工作初值
XORSI,SI;/變量A和B的地址定位寄存器SI清零,設置工作初值
MOVCX,N:/為循環次數寄存器CX設置循環控制初值NLOPl:MOVAL,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 投標策劃階段服務合同
- 華夫餅干機企業縣域市場拓展與下沉戰略研究報告
- 皮船企業縣域市場拓展與下沉戰略研究報告
- 舷外機企業縣域市場拓展與下沉戰略研究報告
- 節能型礦物粉磨機械企業數字化轉型與智慧升級戰略研究報告
- 圓坯連鑄機企業ESG實踐與創新戰略研究報告
- 眼鏡架零件企業ESG實踐與創新戰略研究報告
- 功率探頭企業數字化轉型與智慧升級戰略研究報告
- 立方氮化硼制鑿巖鉆探工具企業ESG實踐與創新戰略研究報告
- 空氣清潔器企業數字化轉型與智慧升級戰略研究報告
- 山東省建設施工企業安全生產許可證變更審核表
- 對公 雅思培訓合同范本
- 新項目方法驗證能力確認報告(固定污染源廢氣-煙氣參數的測定HJT-397-2007)
- 持有特種證人員提成范文
- 醫學影像學三基題庫
- JG-T+502-2016環氧樹脂涂層鋼筋
- 某部副食品配送項目服務方案
- CJJ99-2017 城市橋梁養護技術標準
- 2024年《建筑節能》理論考試題庫(濃縮500題)
- UL 9540 儲能 中英對照
- 幼兒園小朋友餐前播報清新卡通風格模板
評論
0/150
提交評論