工學第3章-匯編語言程序設(shè)計初步課件_第1頁
工學第3章-匯編語言程序設(shè)計初步課件_第2頁
工學第3章-匯編語言程序設(shè)計初步課件_第3頁
工學第3章-匯編語言程序設(shè)計初步課件_第4頁
工學第3章-匯編語言程序設(shè)計初步課件_第5頁
已閱讀5頁,還剩193頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第3章匯編語言程序設(shè)計初步3.1系統(tǒng)功能調(diào)用3.2匯編語言源程序的設(shè)計的基本步驟3.3分支結(jié)構(gòu)的匯編語言源程序的編寫3.4循環(huán)結(jié)構(gòu)的匯編語言源程序的編寫開始第3章匯編語言程序設(shè)計初步3.1系統(tǒng)功能調(diào)用開3.1

系統(tǒng)功能調(diào)用3.1.1系統(tǒng)功能調(diào)用概述3.1.2基本I/O調(diào)用返回本章首頁3.1系統(tǒng)功能調(diào)用3.1.1系統(tǒng)功能調(diào)用概述返回本章3.1.1系統(tǒng)功能調(diào)用概述

我們在編制匯編源程序時,常常要與外部設(shè)備發(fā)生關(guān)系,如希望能從鍵盤輸入字符或在顯示器上顯示出程序運行的結(jié)果,但由于計算機機種的不同、外部設(shè)備型號的差異,控制它們工作的程序也會有差異。如果每次都需要根據(jù)自己的工作環(huán)境來設(shè)計“控制這些外設(shè)工作的程序”,則必須要先弄清楚與之有關(guān)的設(shè)備、電路、接口等各方面的情況,是一件既復(fù)雜,效率又低的事情,并且沒有通用性。如果把這些控制過程預(yù)先編寫成一個一個子3.1.1系統(tǒng)功能調(diào)用概述我們在編制匯編程序,作為操作系統(tǒng)的一部分事先放在系統(tǒng)盤上,用戶在需要時只要按規(guī)定的格式設(shè)置好參數(shù),直接調(diào)用這些子程序即可。美國MICROSOFT公司為我們提供的磁盤操作系統(tǒng)(DOS)就具有這種功能,稱為“利用操作系統(tǒng)的標準功能調(diào)用(簡稱系統(tǒng)功能調(diào)用)”,編號從0~62H(3.0版),主要分為設(shè)備管理(如鍵盤、顯示器、打印機、磁盤等的管理)、文件管理、目錄管理及其他功能調(diào)用4大類。程序,作為操作系統(tǒng)的一部分事先放在系統(tǒng)盤上,用戶在需要時只要●系統(tǒng)功能調(diào)用的基本方法采用一條軟中斷指令I(lǐng)NTn。所謂中斷,是指當計算機正在執(zhí)行正常的程序時,計算機系統(tǒng)中的某個部分突然出現(xiàn)某些異常情況或特殊請求,CPU這時就中止(暫停)它正在執(zhí)行的程序,而轉(zhuǎn)去執(zhí)行申請中斷的那個設(shè)備或事件的中斷服務(wù)程序,執(zhí)行完這個服務(wù)程序后,再自動返回到程序斷點執(zhí)行原來中斷了的正常程序。這個過程或這種功能就叫做中斷。軟中斷是以指令方式產(chǎn)生的中斷,n是中斷類型號,不同的n將轉(zhuǎn)入不同的中斷處理程序。系統(tǒng)功能調(diào)用是21號軟中斷。●系統(tǒng)功能調(diào)用的基本方法采用一條軟中斷指令I(lǐng)常用的系統(tǒng)功能調(diào)用表:表3-1最常用的系統(tǒng)功能調(diào)用表常用的系統(tǒng)功能調(diào)用表:表3-1最常用的系統(tǒng)功能調(diào)用表●系統(tǒng)功能調(diào)用的步驟:1)將調(diào)用參數(shù)裝入指定的寄存器。2)如需要功能調(diào)用號(即欲調(diào)用的子程序編號),把它裝入寄存器AH。3)如需要子功能調(diào)用號,把它裝入AL。4)按中斷號調(diào)用DOS(發(fā)出中斷指令:INT21H)。5)檢查返回參數(shù)是否正確?!裣到y(tǒng)功能調(diào)用的步驟:1)將調(diào)用參數(shù)裝入指定的寄存器。

3.1.2基本I/O調(diào)用1.01H號調(diào)用

功能:從標準輸入設(shè)備上(通常為鍵盤)讀取字符,并在標準輸出設(shè)備上(通常為顯示器)回顯。

格式:MOVAH01H INT21H

說明:輸入字符的ASCII碼送入AL中,如果讀到的字符是Ctrl+C或Ctrl+Break,則結(jié)束程序。2.02H號調(diào)用

功能:通過標準輸出設(shè)備(多為顯示器)輸出字符。 3.1.2基本I/O調(diào)用1.01H號調(diào)用

格式:MOVDL,

X;(X為要輸出顯示的ASCII字符代碼)

MOVAH,02H

INT

21H

說明:DL寄存器中的內(nèi)容等于要輸出字符的ASCII碼,在顯示輸出時檢查到的字符是Ctrl+C或Ctrl+Break鍵的,則結(jié)束程序。3.09H號調(diào)用

功能:在標準輸出上(通常為顯示器)顯示一個字符串。字符串要以字符“$”為結(jié)束標志。

格式:MOVAH09H

INT

21H說明:要輸出顯示的字符串的首地址送到DS、DX兩個寄存器中,其中段地址送DS寄存器,格式:MOVDL,X;(X為要輸出顯示偏移地址送DX寄存器。4.0AH號調(diào)用功能:從標準輸入設(shè)備上(通常為鍵盤)讀一個字符串,存入內(nèi)存,直到按回車鍵為止。格式:MOVAH,0AH INT21H說明:此項操作,要求事先定義一個輸入緩沖區(qū),它的緩沖區(qū)首地址送到DS、DX兩個寄存器中,其中段地址送DS寄存器,偏移地址送DX寄存器。偏移地址送DX寄存器。【例3-1】在顯示器上顯示字符串WelcometoTianHecollege!DATASSEGMENT;/數(shù)據(jù)段定義開始

STRINGDB'WelcometoTianHecollege!',0AH,0DH,'$';/定義字符串,0AH,0DH表示顯示字符串后,光標可自動

回車換行,字符串必須以$結(jié)束。

DATASENDS;/數(shù)據(jù)段定義結(jié)束CODESSEGMENT

;/代碼段定義開始ASSUMECS:CODES,DS:DATAS,SS:STACKS;

/說明段和段寄存器之間的關(guān)系START:

MOVAX,DATAS;/將數(shù)據(jù)段的段地址送寄存器AX

MOVDS,AX;/將AX內(nèi)容送DS寄存器,即初始化DS

LEADX,STRING;/將STRING的偏移地址送DX寄存器

【例3-1】在顯示器上顯示字符串WelcometoTi

MOVAH,9

;/字符串顯示子功能,9號系統(tǒng)功能調(diào)用

INT21H;/系統(tǒng)調(diào)用

MOVAH,4CH;/返回DOS

INT21H

;/系統(tǒng)調(diào)用CODESENDS;/代碼段定義結(jié)束ENDSTART【例3-2】從鍵盤輸入字符串,把它放到緩沖區(qū)中存儲起來。DATASEGMENT

MAXLENDB100

;/定義緩沖區(qū)的最大容量

ACLENDB?

;/定義實際讀入的字符數(shù)

STRINGDB100DUP(?);/定義接收字符串空間DATAENDSMOVAH,9;/字符串顯示子功能,9號系CODESEGMENT

MOVAX,DATA

MOVDS,AX

;/數(shù)據(jù)段初始化

LEADX,MAXLEN

;/送

MAXLEN的偏移地址到寄存器DX

MOVAH,10;/10號系統(tǒng)功能調(diào)用

INT21H;/系統(tǒng)調(diào)用CODEENDS運行程序時,若從鍵盤輸入“Thankyou!”(共計10個字符),則輸入緩沖區(qū)MAXLEN各單元的內(nèi)容如圖3-1所示。圖3-1存儲空間分配示意CODESEGMENT圖3-1存儲空間分配示意

3.2

匯編語言源程序的設(shè)計的基本步驟3.2.1源程序的基本框架3.2.2匯編語言源程序設(shè)計的基本步驟3.2.3順序結(jié)構(gòu)的匯編語言源程序的編寫返回本章首頁 3.2匯編語言源程序的設(shè)計的基本步驟3.2.1源程序3.2.1源程序的基本框架

一個匯編語言源程序由兩大部分組成的。其中主要部分就是指令,位于代碼段內(nèi),代碼段可以有好幾個。其他部分是為指令服務(wù)的,包括數(shù)據(jù)的準備,存儲區(qū)域的劃分和地址的標注。其他部分由數(shù)據(jù)段、堆棧段和擴展段組成。也各可以有好幾個。段之間的順序可以隨意安排。但通常是其他部分(數(shù)據(jù)段、堆棧段和擴展段等)在前,代碼段在后。雖然可以定義多個段,但由于段首址存放在CPU的寄存器中,所以可以同時使用6個段:代碼段(CS)、數(shù)據(jù)段(DS)、堆棧段(SS)和3個擴展段(ES、FS和GS)。擴展段其實也是數(shù)據(jù)段,只是段地址在寄存器ES、FS和GS中。程序通過修改段寄存器的值實現(xiàn)段的切換。3.2.1源程序的基本框架一個匯編語言源程一個程序至少包含一個代碼段和END指令。其他段的設(shè)置由程序的具體功能需要而定。程序較小時,可以不設(shè)置堆棧段。操作系統(tǒng)在裝載不含堆棧段的程序時,會指定一個段作為堆棧段使用。這樣,程序連接時,LINK會產(chǎn)生一條警告信息: WARNING:NOSTACKSEGMENT

但不會影響程序的運行,可以忽略它。

程序中的段名可以是唯一的,也可以與其它段同名。在同一模塊中,如果有兩個段同名,則后者被認為是前段的后續(xù),這樣,它們就屬同一段。當同一模塊出現(xiàn)兩個同名段時,則后者的可選項屬性要么與前者相同,要么不寫其屬性而選用前者的段屬性。一個程序至少包含一個代碼段和END指令。其他段的設(shè)置由程序的【例3-4】段寄存器與段的對應(yīng)方法1:用一個段寄存器對應(yīng)兩個數(shù)據(jù)段DATA1SEGMENT;/定義第一個數(shù)據(jù)段

b1DB10h

;/定義變量DATA1,字節(jié)變量DATA1ENDS

;/第一個數(shù)據(jù)段結(jié)束DATA2SEGMENT

;/定義第二個數(shù)據(jù)段

b1DB23h

;/定義變量DATA2,字節(jié)變量DATA2ENDS

;/第二個數(shù)據(jù)段結(jié)束CODE1SEGMENT

;/定義第一個代碼段ASSUMECS:CODE1,DS:DATA1;/指定段寄存器START:MOVAX,DATA1;/指令開始,

MOVDS,AX;/把數(shù)據(jù)段DATA1的段首址賦給段寄存器DS【例3-4】段寄存器與段的對應(yīng)方法1:用一個段寄存器對應(yīng)兩個………………

MOVBL,b1;/引用DS來訪問DATA1中的變量b1………………ASSUMEDS:DATA2;/說明DS與DATA2建立聯(lián)系MOVAX,DATA2;MOVDS,AX;/把數(shù)據(jù)段DATA2的段值賦給段寄存器DS………………

/實現(xiàn)段的切換MOVAL,b2;/引用DS來訪問DATA2中的變量b2………………CODE1ENDS;/代碼段CODE1結(jié)束ENDSTART;/程序結(jié)束

在方法1中,因為只使用一個段寄存器DS來對應(yīng)兩個數(shù)據(jù)段,所以,需要切換DS的對應(yīng)關(guān)系。但我們也可以用段寄存器DS和ES來分別對應(yīng)段DATA1和DATA2,這樣,方法1就可變成方法2。………………方法2:用兩個段寄存器對應(yīng)兩個數(shù)據(jù)段DATA1SEGMENT;/定義第一個數(shù)據(jù)段

b1DB10h;/定義變量DATA1,字節(jié)變量DATA1ENDS;/第一個數(shù)據(jù)段結(jié)束DATA2SEGMENT;/定義第二個數(shù)據(jù)段

b2DB23h;/定義變量DATA2,字節(jié)變量DATA2ENDS;/第二個數(shù)據(jù)段結(jié)束CODE1SEGMENT;/定義第一個代碼段ASSUMECS:CODE1,DS:DATA1,ES:DATA2;/指定段寄存器START:MOVAX,DATA1;/指令開始,

MOVDS,AX;/把數(shù)據(jù)段DATA1的段首址賦給段寄存器DS

MOVAX,DATA2

MOVES,AX;/把數(shù)據(jù)段DATA2的段首址賦給段寄存器ES………………

方法2:用兩個段寄存器對應(yīng)兩個數(shù)據(jù)段

MOVBL,b1;/引用DS來訪問DATA1中的變量b1………………

MOVAL,b2;/引用ES來訪問DATA2中的變量b2………………

CODE1ENDS;/代碼段CODE1結(jié)束ENDSTART;/程序結(jié)束

我們還可以用“段組”來簡化段寄存器的使用,把段DATA1和DATA2組成一個數(shù)據(jù)段。所以,把方法2再改寫成方法3的形式。方法3:用一個段組組成兩個數(shù)據(jù)段GSEGGROUPDATA1,DATA2;/定義段組DATA1SEGMENT;/定義第一個數(shù)據(jù)段MOVBL,b1

b1DB10h;/定義變量DATA1,字節(jié)變量DATA1ENDS;/第一個數(shù)據(jù)段結(jié)束DATA2SEGMENT;/定義第二個數(shù)據(jù)段

b2DB23h;/定義變量DATA2,字節(jié)變量DATA2ENDS;/第二個數(shù)據(jù)段結(jié)束CODE1SEGMENT;/定義第一個代碼段

ASSUMECS:CODE1,DS:GSEGSTART:MOVAX,GSEG;/指令開始,

MOVDS,AX;/把段組GSEG的段值賦給段寄存器DS………………

MOVBL,b1;/引用DS來訪問DATA1中的變量b1………………

MOVAL,b2;/引用DS來訪問DATA2中的變量b2………………b1DB10h………………

CODE1ENDS;/代碼段CODE1結(jié)束ENDSTART;/程序結(jié)束

定義段組后,段組內(nèi)各段所定義的標號和變量,除了與定義它們的段起始點相關(guān)外,還與段組的起始點相關(guān)。規(guī)定如下:

如果在ASSUME偽指令中說明段組與段寄存器相對應(yīng),那么,有關(guān)標號或變量的偏移量就相對于段組起點計算;

如果在ASSUME偽指令中說明段組內(nèi)的某段與段寄存器相對應(yīng),那么,有關(guān)標號或變量的偏移量就相對于該段的起點。

所以,在使用段組后,程序員要謹慎使用ASSUME偽指令,并保證段寄存器的值與段組或段相一致?!x段組后,段組內(nèi)各段所定義

3.2.2匯編語言源程序設(shè)計的基本步驟1.匯編語言源程序的主要基本結(jié)構(gòu):

順序結(jié)構(gòu)

分支結(jié)構(gòu)

循環(huán)結(jié)構(gòu)2.好程序的要求一個好的程序,首先應(yīng)該能正常運行,實現(xiàn)預(yù)定的功能。還應(yīng)該滿足:結(jié)構(gòu)簡明,明白易懂,調(diào)試方便,修改容易。執(zhí)行速度快(程序執(zhí)行時間短,程序語句行數(shù)盡量少)。占用內(nèi)存空間少。 3.2.2匯編語言源程序設(shè)計的基本步驟1.匯編語言源程3.基本步驟分析問題,從中抽象出恰當?shù)臄?shù)學模型。確定解決問題的合理算法。畫出程序流程圖,根據(jù)算法,細化并找出解決問題的思路和具體方法。確定匯編語言程序的基本框架:各個存儲段的定義,存儲空間的分配,寄存器的配置,指針和計數(shù)器的選擇。根據(jù)程序流程圖確定程序的基本結(jié)構(gòu),并編寫程序。3.基本步驟3.2.3順序結(jié)構(gòu)的匯編語言源程序的編寫

順序結(jié)構(gòu)是最簡單的程序結(jié)構(gòu),沒有分支,沒有循環(huán),程序的執(zhí)行順序就是指令的編寫順序,所以,又稱直線程序。因此,安排指令的先后次序就顯得至關(guān)重要。另外,在編程序時,還要妥善保存已得到的處理結(jié)果,為后面的進一步處理直接提供前面的處理結(jié)果,從而避免不必要的重復(fù)操作。3.2.3順序結(jié)構(gòu)的匯編語言源程序的編寫順序結(jié)構(gòu)【例3-5】兩個64位無符號數(shù)相加●分析問題:在8086/8088CPU中,只有8位或16位運算指令,沒有32位和64位以上的運算指令?!翊_定算法:要進行64位的加法運算,可以確定算法:利用16位加法指令分別相加4次來實現(xiàn)。●畫程序流程圖:本問題簡單,無需畫程序流程圖?!翊_定匯編語言程序的基本框架:可見,匯編語言程序的基本框架至少要兩個段:數(shù)據(jù)段和代碼段。數(shù)據(jù)段中至少定義3個變量:兩個加數(shù)N1、N2,還有一個和數(shù)SUM,都是DW類型。和數(shù)SUM尚屬未知,故應(yīng)定義一個5個字長(比64位字長富余一點)的緩沖區(qū)。因為要加4次,需要一個計數(shù)器或指針,可選寄存器BX充當?!窬帉懗绦?,可以想得到,需要MOV、ADD、ADC和INC等指令。具體程序如下:【例3-5】兩個64位無符號數(shù)相加●分析問題:在8086/8DATASEGMENT;/定義數(shù)據(jù)段 N1DW1234H,5678H,9ABCH,0DEF0H;/定義字變量N1

N2DW1971H,0313H,1968H,1123H;/定義字變量N2

SUMDW5DUP(?);/定義緩沖區(qū)SUMDATA1END;/數(shù)據(jù)段結(jié)束CODESEGMENT;/定義第一個代碼段

ASSUMECS:CODE,DS:DATA;/指定段寄存器MAINPROCNEARSTART:MOVAX,DATA;/指令開始,

MOVDS,AX;/把數(shù)據(jù)段的段首址賦給段寄存器DS

LEABX,N1;/將N1的偏移地址送BX

MOVAX,[BX];/引用DS來訪問DATA中的變量N1的最低位DATASEGMENT;/定義數(shù)據(jù)段

ADDAX,[BX+8];/最低位字相加,因兩個數(shù)偏移地址相差8個字節(jié)

MOV[BX+16],AX;/存最低位和。[BX+16]指示SUM的偏移地址

此句也可以寫為:MOV[SUM],AX

INCBX

INCBX;/指針指向下一個字

MOVAX,[BX];/引用DS來訪問DATA中的變量N1的次低位 ADCAX,[BX+8];/次低位字相加,因兩個數(shù)偏移地址相差8個字節(jié)

MOV[BX+16],AX;/存次低位和。[BX+16]指示SUM+1的偏移

地址,此句也可以寫為:MOV[SUM+1],AX

INCBX

INCBX;/指針指向下一個字

MOVAX,[BX];/引用DS來訪問DATA中的變量N1的次高位

ADCAX,[BX+8];/次高位字相加,因兩個數(shù)偏移地址相差8個字節(jié)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]

;/最高位字相加,因兩個數(shù)偏移地址相差8個字節(jié)

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結(jié)束

ENDSTART

;/程序結(jié)束

MOV[BX+16],AX;/存次高位和。[【例3-6】兩個32位無符號數(shù)乘法程序●分析問題:在8086/8088CPU中,只有8位或16位運算指令,沒有32位以上的乘法運算指令?!翊_定算法:要進行32位的乘法運算,可以確定算法:利用16位乘法指令做4次乘法,然后把部分積相加來實現(xiàn)。每次的積的低位送AX,高位送DX。如圖3-2所示?!癞嫵绦蛄鞒虉D:程序流程圖如圖3-3所示?!翊_定匯編語言程序的基本框架:可見,匯編語言程序的基本框架至少要兩個段:數(shù)據(jù)段和代碼段。數(shù)據(jù)段中至少定義3個變量:兩個乘數(shù),還有一個積數(shù),都是DW類型。積數(shù)尚屬未知,故應(yīng)定義一個4個字長(積的字長應(yīng)該是乘數(shù)字長的兩倍)的緩沖區(qū)。因為要乘4次,需要一個計數(shù)器或指針,可選寄存器BX充當。另外,本程序為了教學的需要,不采用 MOVAH,4CH INT21H【例3-6】兩個32位無符號數(shù)乘法程序●分析問題:在8086來返回DOS。而改用“先將程序段前綴的起始地址及數(shù)據(jù)段DS段首址和偏移地址AX存入堆棧,再用指令RET返回DOS的方法。所以,又定義了100個字節(jié)的堆棧段。同時堆棧段又為保存最后的進位位提供了條件。

●編寫程序,可以想得到,需要MOV、MUL、ADD、ADC、PUSH、PUSHF和RET等指令。具體程序如下:來返回DOS。而改用“先將程序段前綴的起始地址及數(shù)據(jù)段DS段

NUME32bitMULTIPLY;程序名“32位乘法”DATASEGMENT;數(shù)據(jù)段定義開始MULNUMDW0000H,0FFFFH,0000H,0FFFFH,4DUP(?);DATAENDS;數(shù)據(jù)段定義結(jié)束STACKSEGMENTPARASTACK‘STACK’;堆棧段定義開始

DB100DUP(?);堆棧段長度為100字節(jié)STACKENDS;堆棧段定義結(jié)束CODESEGMENT;代碼段開始

ASSUMECS:CODE,DS:DATA,SS:STACK;指定段寄存器STARTPROCFAR;圖3-3程序流程圖NUME32bitMULTIPLY;程序BEGIN:PUSHDS;將DS中包含的程序段前綴壓棧保存 MOVAX,0;將0送AX,即設(shè)置AX的初值為0 PUSHAX;將DS中AX的偏移地址壓棧,這三句即保存返回至DOS的段值和IP值。 MOVAX,DATA; MOVDS,AX

;將數(shù)據(jù)段首地址送DS

LEABX,MULNUM;將MULNUM的偏移地址送BX,定義了地址指針MULNUM32:MOVAX,[BX];被乘數(shù)的低16位B→AX

MOVSI,[BX+4];乘數(shù)的低16位D→SI

MULSI;B×D,部分積1的低位送AX,部分積1的

高位送DX,

MOV[BX+8],AX;保存部分積1的低位

MOV[BX+0AH],DX;保存部分積1的高位

MOVAX,[BX+2];被乘數(shù)的高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];被乘數(shù)的低16位B→AX

MOVDI,[BX+6];乘數(shù)的高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];被乘數(shù)的高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

分支結(jié)構(gòu)的匯編語言源程序的編寫3.3.1

條件轉(zhuǎn)移指令3.3.2

匯編語言分支結(jié)構(gòu)程序的編寫返回本章首頁3.3分支結(jié)構(gòu)的匯編語言源程序的編寫3.3.1條件 在匯編語言程序設(shè)計中,常利用條件轉(zhuǎn)移指令實現(xiàn)程序的分支。指令助記符是隨條件變化而變化的,其構(gòu)成方法是:第一個字母是J,緊接著的字母是標志寄存器的代號P、S、Z、……,表示“條件”,條件滿足,則轉(zhuǎn)移。例如JZ,表示結(jié)果為0,則轉(zhuǎn)移;如果“條件”是否定的,就在已構(gòu)成的兩個字母間加字母N,例如JNZ,表示結(jié)果不為0,則轉(zhuǎn)移。條件轉(zhuǎn)移指令只有一個操作數(shù),指出轉(zhuǎn)移的目標地址,并且只能是一個短標號,即轉(zhuǎn)移的偏移地址是8位的。 有一個條件轉(zhuǎn)移指令JCXZ,構(gòu)成方法較特殊,它的轉(zhuǎn)移條件是寄存器CX的內(nèi)容為0,而不是標志寄存器的某位的標志。

所有的條件轉(zhuǎn)移指令都不影響標志位。3.3.1

條件轉(zhuǎn)移指令 在匯編語言程序設(shè)計中,常利用條件轉(zhuǎn)移指令實現(xiàn)程序的分支。指(1)根據(jù)單個標志的設(shè)置情況的轉(zhuǎn)移指令。共五種10條: 1)JZ(或JE);上一步的結(jié)果為零(或相等)則轉(zhuǎn)移。格式:JE(或JZ)標號測試條件:ZF=1 2)JNZ(或JNE);上一步的結(jié)果不為零(或不相等)則轉(zhuǎn)移。格式:JNZ(或JNE)標號測試條件:ZF=0 3)JS;上一步的結(jié)果為負,則轉(zhuǎn)移。格式:JS標號測試條件:SF=1

4)JNS;上一步的結(jié)果為正,則轉(zhuǎn)移?,F(xiàn)將所有的條件轉(zhuǎn)移指令列舉如下:(1)根據(jù)單個標志的設(shè)置情況的轉(zhuǎn)移指令?,F(xiàn)將所有的條件轉(zhuǎn)移指格式:JNS標號測試條件:SF=0 5)JO;上一步的結(jié)果為溢出,則轉(zhuǎn)移。格式:JO標號測試條件:OF=1 6)JNO;上一步的結(jié)果不為溢出,則轉(zhuǎn)移。格式:JNO標號測試條件:OF=0 7)JP(或JPE);上一步的結(jié)果的奇偶標志位為1,則轉(zhuǎn)移。格式:JP標號測試條件:PF=1 8)JNP(或JPO);上一步的結(jié)果的奇偶標志位為0,則轉(zhuǎn)移。格式:JNP(或JPO)標號測試條件:PF=0 9)JC;上一步有進位或借位,則轉(zhuǎn)移。格式:JNS標號格式:JC標號測試條件:CF=1 10)JNC;上一步無進位或無借位,則轉(zhuǎn)移。格式:JNC標號測試條件:CF=0(2)比較兩個無符號數(shù),并根據(jù)比較結(jié)果的高低轉(zhuǎn)移。

1)JAJNBE(或JNBE)高于,即不低于或等于,則轉(zhuǎn)移。格式:JA(或JNBE)標號測試條件:CF=0且ZF=0 2)JNA(或JBE)不高于,即低于或等于,即則轉(zhuǎn)移。格式:JBE(或JNA)標號測試條件:CF=0或ZF=1 3)JB(或JNAE,JC)低于,即不高于或等于,或進位為1則轉(zhuǎn)移格式:JB(或JNAE,JC)標號格式:JC標號(2)比較兩個無符號數(shù),并根據(jù)比較結(jié)果的高 測試條件:CF=1 4)JNB(或JAE,JNC)不低于,或高于或等于,或進位為0則轉(zhuǎn)移格式:同上測試條件:CF=0(3)比較兩個帶符號數(shù),并根據(jù)比較的結(jié)果的大小轉(zhuǎn)移。

1)JL(或LNGE)小于,或者不大于且等于,則轉(zhuǎn)移。格式:JL(或JNGE)標號測試條件:SF異或OF=1 2)JNL(或JGE)不小于,即或者大于或者等于則轉(zhuǎn)移。格式:JNL(或JGE)標號測試條件:SF異或OF=0 3)JLE(或JNG)小于或等于,即不大于則轉(zhuǎn)移。格式:JLE(或JNG)標號測試條件:(SF異或OF)或ZF=1 測試條件:CF=1(3)比較兩個帶符號數(shù),并根據(jù)比較的結(jié)果

4)JNLE(或JG)不小于或等于,即大于則轉(zhuǎn)移。格式:JNLE(或JG)標號測試條件:(SF異或OF)或ZF=0(4)測試CX的值為0則轉(zhuǎn)移指令格式:JCXZ標號測試條件:(CX)=0 4)JNLE(或JG)不小于或等于,即大于則轉(zhuǎn)移。(4)測3.3.2匯編語言分支結(jié)構(gòu)程序的編寫在設(shè)計分支程序時必須注意以下幾點:(1)正確選擇分支形成的判定條件和相應(yīng)的條件轉(zhuǎn)移指令。

(2)對每個分支程序的入口,一定要給出標號,標明不同分支的轉(zhuǎn)向地址。必須保證每條分支都有完整的結(jié)果。

(3)在檢查和調(diào)試時必須對所有的分支進行,因為某幾條分支正確,不足以說明整個程序是正確的。3.3.2匯編語言分支結(jié)構(gòu)程序的編寫在設(shè)計分支程序時必

分支結(jié)構(gòu)程序的分類:

?

簡單的二分支結(jié)構(gòu)程序

?多分支結(jié)構(gòu)程序分支結(jié)構(gòu)程序的分類:1.簡單的二分支結(jié)構(gòu)設(shè)計舉例【例3-7】把a,b兩個8位數(shù)中較大的數(shù)賦值給max?!穹治鰡栴}:這是典型的二分支結(jié)構(gòu)。確定分支的條件是a>b嗎?●確定算法:采用比較轉(zhuǎn)移指令,在匯編語言中用AL來保存中間結(jié)果。因為讀取寄存器比讀取存儲器要快,并且,匯編語言指令不允許兩個操作數(shù)都為存儲單元。●畫程序流程圖:畫程序流程圖,見圖3-5。圖3-5例3-7程序流程圖1.簡單的二分支結(jié)構(gòu)設(shè)計舉例【例3-7】把a,b兩個8●確定匯編語言程序的基本框架:可見,該匯編語言程序的基本框架至少要兩個段:數(shù)據(jù)段和代碼段。數(shù)據(jù)段中至少定義3個變量:兩個數(shù)a、b,還有一個最大數(shù)max,都是8位數(shù),應(yīng)選DB類型,但考慮到執(zhí)行CMP指令實際上是作減法,可能有借位的情況,故選DW類型。max尚屬未知,故應(yīng)定義一個字長的緩沖區(qū)。還要用到寄存器AL?!窬帉懗绦?,可以想得到,需要MOV、CMP等指令。最后要返回DOS。具體程序如下:DATASEGMENT?;/定義數(shù)據(jù)段aDW?

;/定義字變量abDW?

;/定義字變量bmaxDW?

;/定義字變量maxDATAEDNS

;/數(shù)據(jù)段定義結(jié)束CODESEGMENT ASSUMECS:CODE,DS:DATA●確定匯編語言程序的基本框架:可見,該匯編語言程序的基本框架START:MOVAX,DATA

MOVDS,AXMOVAL,aCMPAL,b;/比較a和b,產(chǎn)生分支

JAEXIT;/如果a>b,則跳轉(zhuǎn)到EXIT語句,否則,執(zhí)行下列語句MOVAL,b;/送b到寄存器EXIT:MOVmax,AL;/送(AL)到存儲單元max

MOVAH,4CH;INT21H;/返回DOSCODEENDS;/代碼段結(jié)束

ENDSTART;/程序結(jié)束START:

2.多分支結(jié)構(gòu)程序設(shè)計多分支結(jié)構(gòu)程序設(shè)計比較復(fù)雜一些。關(guān)鍵是怎樣根據(jù)條件對多分支進行判斷,確定不同分支程序轉(zhuǎn)移的入口地址。方法有:(1)邏輯分解流程圖法

根據(jù)邏輯分解流程圖,按照判別條件的先后,逐個進行判斷和轉(zhuǎn)移。設(shè)分支條件為X1,X2,……,XN,則邏輯分解流程圖為3-6所示。

圖3-6邏輯分解流程圖2.多分支結(jié)構(gòu)程序設(shè)計多分支結(jié)構(gòu)程序設(shè)計比較復(fù)雜一些。關(guān)鍵【例3-8】試編寫執(zhí)行符號函數(shù)

的程序?!穹治鰡栴}:由題意可知,這是多分支結(jié)構(gòu)。本題有三個分支:X>0、X=0和X<0。按照邏輯分解的方法,可以先將其歸并為兩個條件:X≥0和X<0,由此形成兩個分支;再將分支X≥0分解為X>0和X=0,各分支均用條件轉(zhuǎn)移指令來實現(xiàn)。●確定算法:采用比較轉(zhuǎn)移指令?!癞嫵绦蛄鞒虉D:畫程序流程圖,見圖3-7?!翊_定匯編語言程序的基本框架:可見,該匯編語言程序的基本框架至少要兩個段:數(shù)據(jù)段和代碼段。數(shù)據(jù)段中至少定義2個變量:兩個數(shù)X和Y,由題設(shè)為8位數(shù),應(yīng)選DB類型,但考慮到執(zhí)行CMP指令實際上是作減法,可能有借位的情況,故選DW類型。假設(shè)任意給定的X值存放在XX單元,函數(shù)Y的值存放在YY單元。●編寫程序,可以想得到,需要MOV、CMP和程序轉(zhuǎn)移等指令?!纠?-8】試編寫執(zhí)行符號函數(shù)最后要返回DOS。

具體程序如下:DATASEGMENT?;/定義數(shù)據(jù)段

XXDW;/定義字變量X

YYDW?;/定義字變量Y

DATAEDNS;/數(shù)據(jù)段定義結(jié)束CODESEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX;/給DS賦值

MOVAL,XX;

CMPAL,0;/XX與零比較

開始(AL)←XX(AL)≥0(AL)>0(AL)←1結(jié)束YN圖3-7例3-8程序流程圖(AL)←-1(AL)←0YN最后要返回DOS。

具體程序如下:DATASEGMENTJGEBIGR;/X=(AL)≥0,則轉(zhuǎn)移到BIGR語句

MOVAL,0FFH;/否則,X<0時,將–1送入AL JMPEQUL;/無條件轉(zhuǎn)移語句,轉(zhuǎn)移到EQUL語句

BIGR:JEEQUL;/X=0,則轉(zhuǎn)移到EQUL語句

MOVAL,1;/X>0時,將1送入AL

EQUL:MOVYY,AL;/無論結(jié)果如何,都將(AL)送入YY單元

HLT;/暫停(2)跳轉(zhuǎn)地址表法

如果各分支的判定結(jié)果可以用一個寄存器的不同的有序的值來表示,則可將各分支程序的入口地址與寄存器的不同的有序的值一一對應(yīng),列入一張表中,此表稱為跳轉(zhuǎn)地址表。JGEBIGR;/X=(AL)≥0,如圖3-8所示。各分支程序的入口地址的計算公式是:

各分支程序的入口地址=寄存器的值×2+跳轉(zhuǎn)地址表首地址

這種利用跳轉(zhuǎn)地址表實現(xiàn)多分支程序的轉(zhuǎn)移的方法,稱為跳轉(zhuǎn)地址表法。圖3-8分支程序入口地址表如圖3-8所示。各分支程序的入口地址的計算公式是:【例3-9】根據(jù)AL中的被置位的情況來控制轉(zhuǎn)移到8個分支程序R1~R8中的一個(在中斷響應(yīng)時,通過軟件查詢,從而轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序入口就類似于這種情況)。

如果AL中為00000001則轉(zhuǎn)至R1

如果AL中為00000010則轉(zhuǎn)至R2

如果AL中為00000100則轉(zhuǎn)至R3

如果AL中為00001000則轉(zhuǎn)至R4

如果AL中為00010000則轉(zhuǎn)至R5

如果AL中為00100000則轉(zhuǎn)至R6

如果AL中為01000000則轉(zhuǎn)至R7

如果AL中為10000000則轉(zhuǎn)至R8

實現(xiàn)上述要求的程序框圖如圖3-9所示。我們可以把8個子程序的入口地址編成如圖3-8所示的分支程序入口地址表。根據(jù)流程圖可以寫出如下程序:【例3-9】根據(jù)AL中的被置位的情況來控制轉(zhuǎn)移到8個分支程序●分析問題:由題意可知,要求根據(jù)某種條件實現(xiàn)8個分支程序●確定算法:采用跳轉(zhuǎn)地址表法(見圖3-8分支程序入口地址表),結(jié)合條件轉(zhuǎn)移指令來實現(xiàn)?!癞嫵绦蛄鞒虉D:見圖3-9?!翊_定匯編語言程序的基本框架:可見,該匯編語言程序的基本框架要三個段:數(shù)據(jù)段、堆棧段和代碼段。數(shù)據(jù)段中創(chuàng)建分支程序入口地址表,應(yīng)選DW類型,使用寄存器BX定位?!窬帉懗绦?,可以想得到,需要MOV、JMP、JC、INC、LEA和PUSH等指令。最后要返回DOS。未想到的,在編寫過程中根據(jù)需要隨時添加,如RCR指令等。

具體程序如下:

NAMEBRANCH_PROGDATASEGMENT●分析問題:由題意可知,要求根據(jù)某種條件實現(xiàn)8個分支程序BRTABDWR11;/開始創(chuàng)建分支程序入口地址表。第一步創(chuàng)建分支程序R1入口地址的IP值 DWR12;/創(chuàng)建分支程序R1入口地址的碼段值

DWR21;/仿DWR11,下同

DWR22;/仿DWR12,下同

DWR31

DWR32

DWR41

DWR42

DWR51

DWR52

DWR61

DWR62

DWR71

DWR72

DWR81

DWR82圖3-9分支程序轉(zhuǎn)移流程圖BRTABDWR11;/開始創(chuàng)建分支程序入口地址DATAENDSSTACKSEGMENTPARASTACK'STACK'

DB100DUP(?);/定義一個100個字節(jié)的堆??臻gTOPEQU$-STACK;/棧頂?shù)牡刂窞槌绦虻漠斍暗刂放c堆棧首地址的差。STACKENDSCODESEGHENTSTARTPROCFAR

ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:PUSHDS;/將數(shù)據(jù)段首址壓棧

MOVAX,0;/將寄存器AX清零

PUSHAX;/使程序能返回DOS

MOVAX,DATA

MOVDS,AX;/將DATA段首址(即分支程序入口地址表)送寄存器DSDATAENDS

MOVAX,STACK;

MOVSS,AX;/將堆棧段首址送寄存器SS

MOVAX,TOP

MOVSP,AX;/將堆棧段棧頂?shù)刂匪投褩V羔樇拇嫫鱏P

LEABX,BRTAB;/設(shè)跳轉(zhuǎn)表的地址指針GTBIT:RCRAL,l;/通過進位循環(huán)右移

JCGETAD;/在循環(huán)右移過程中順序檢查AL中各位的狀態(tài)

INCBX;/BX自動加1

INCBX;/BX自動加1,移到下一分支

INCBX;/BX自動加1

INCBX;/BX自動加1,完成寄存器的值×2

JMPGTBITGETAD:JMPDWORDPTR[BX];/段間間接轉(zhuǎn)移STARTENDPCODEENDS

ENDBEGIN MOVAX,STACK;(3)跳轉(zhuǎn)指令表法

跳轉(zhuǎn)指令表法的思路與跳轉(zhuǎn)地址表法基本相同,不同的只是它是在代碼段中把轉(zhuǎn)移到各個分支程序段的跳轉(zhuǎn)指令放在一個表中,該表就稱為“跳轉(zhuǎn)指令表”。表內(nèi)跳轉(zhuǎn)轉(zhuǎn)移指令的地址的計算公式:

表內(nèi)跳轉(zhuǎn)指令表的地址=(編號-1)×2+跳轉(zhuǎn)指令表的首地址

=編號×2-2+跳轉(zhuǎn)指令表的首地址(3)跳轉(zhuǎn)指令表法跳轉(zhuǎn)指令表法的思路與跳轉(zhuǎn)地當

N=1時,顯示信息(DSPLAY); N=2時。傳送信息(TRAN); N=3時。處理信息(PROCl); N=4時,打印信息(PRTN); N=5時。結(jié)束程序(EXIT).

相應(yīng)的處理為一獨立的程序段,它們的入口地址分別為DSPLAY,TRAN,PROCl,PRIN,EXIT。當這些程序處理結(jié)束時仍返回讀入N。只有當N=5時程序才結(jié)束。

試利用跳轉(zhuǎn)指令表的分支程序?qū)崿F(xiàn)這些要求?!纠?-10】由鍵盤輸入一個數(shù)N,當N為不同值時應(yīng)作不同處理當N=1時,顯示信息(DSPLAY);【例3●分析問題:由題意可知,這是一個五分支程序。它們的入口地址分別為DISPLAY,TRAN,PROCl,PRIN,EXIT。當這些程序處理結(jié)束時仍返回讀入N。只有當N=5時程序才結(jié)束.●確定算法:構(gòu)建跳轉(zhuǎn)指令表,采用通過執(zhí)行跳轉(zhuǎn)指令表中相應(yīng)的跳轉(zhuǎn)指令,就可以轉(zhuǎn)移到不同的分支?!癞嫵绦蛄鞒虉D:略?!翊_定匯編語言程序的基本框架:可見,該匯編語言程序的基本框架至少要兩個段:堆棧段和代碼段。堆棧段中定義一個256個字的緩沖區(qū),當然是DW類型,再定義一個字類型的棧頂,用棧頂指針SP定位。采用寄存器AL,AX存數(shù)字,寄存器BX存跳轉(zhuǎn)指令的地址。●編寫程序,可以想得到,需要MOV、JMP、LEA、SUB、ADD、CMP和JB、JA、CBW等指令。最后要返回DOS。未想到的,在編寫過程中根據(jù)需要隨時添加,如SHL指令等。為了簡化程序,每段處理程序除了EXIT以外僅給出了一條轉(zhuǎn)移指令表示當某項處理完成后返回AGAIN繼續(xù)從鍵盤讀入一個字符直到輸入字符為‘5’●分析問題:由題意可知,這是一個五分支程序。它們的入口地址分為止。例中存放轉(zhuǎn)移指令的表JADT2在代碼段中。具體程序如下:STACKSBGMENTSTACK DW256DUP(?);/在堆棧中,定義一個256個字的數(shù)據(jù)緩沖區(qū)TOPLABELWORD;/定義棧頂變量TOP,字類型STACKENDSCODESEGMENT ASSUMECS:CODE,SS:STACKSTART:MOVAX,STACK;

MOVSS,AX;/堆棧段寄存器SS初始化

MOVSP,OFFSSETTOP;/送棧頂?shù)钠频刂返郊拇嫫鱏PAGAIN:

MOVAH,01;/(AH)=01,1號功能(鍵盤輸入)調(diào)用為止。例中存放轉(zhuǎn)移指令的表JADT2在代碼段中。

INT2lH;/DOS功能調(diào)用 SUBAL,30H;/將鍵盤輸入的數(shù)字字符的ASCII碼減去

數(shù)字字符“0”的ASCII碼“30H”,求出輸入

數(shù)字的二進制表示的值,放在AL中

CMPAL,01;/與“1”比較輸入數(shù)字的值

JB,AGAIN;/若輸入數(shù)字的值比1小,返回程序AGAIN,

由鍵盤重新輸入。若輸入數(shù)字的值比1大,接

著執(zhí)行下一指令

CMPAL,05;/與“5”比較輸入數(shù)字的值

JAAGAIN;/若輸入數(shù)字的值比5大,返回程序AGAIN,

由鍵盤重新輸入。若輸入數(shù)字的值比1大,比

5小,接著執(zhí)行下一指令

SHLAL,01;/將放在AL中的輸入數(shù)字的二進制表示,邏

輯左移1位。依據(jù)計算跳轉(zhuǎn)轉(zhuǎn)移指令地址的

公式:先作編號×2 INT2lH;/

CBW;/將AL中的8位數(shù)擴展為16位數(shù),放在寄存器AX中

MOVBX,OFFSSETJADT2;/送轉(zhuǎn)移指令跳轉(zhuǎn)表的首地址

送寄存器BX

ADDBX,AX;/依據(jù)計算跳轉(zhuǎn)轉(zhuǎn)移指令地址的公式再作:編

號×2+跳轉(zhuǎn)指令表的首地址

SUBBX,02;/繼續(xù)計算,將上一步的結(jié)果減去2,完成計算

JMPBX;/跳轉(zhuǎn)到BX指示的跳轉(zhuǎn)指令的地址JADT2JMPSHORTDISPLAY:/跳轉(zhuǎn)表

JMPSHORTTRAN

JMPSHORTPROCl

JMPSHORTPRTN

JMPSHORTEXITDISPLAY:…… CBW;/將AL中的8位數(shù)擴展為16位

JMPAGATNTRAN:

…… JMPAGAINPROCl:

…… JMPAGAINPRIN:

…… JMPAGAINEXlT:MOVAH,4CH INT2lHCODEENDS ENDSTART JMPAGATN3.4

循環(huán)結(jié)構(gòu)的匯編語言源程序的編寫3.4.1循環(huán)控制指令3.4.2程序的循環(huán)結(jié)構(gòu)3.4.3控制程序循環(huán)的方法3.4.4多重循環(huán)返回本章首頁3.4循環(huán)結(jié)構(gòu)的匯編語言源程序的編寫3.4.1循環(huán)控(1)

循環(huán)指令的作用:根據(jù)條件滿足與否,完成一串重復(fù)的操作,形成循環(huán)程序。(2)循環(huán)指令有3條,且3條指令都是短轉(zhuǎn)移(short-label表示短標號)指令。

循環(huán)轉(zhuǎn)移指令LOOP格式:LOOP目標標號測試條件與功能:(CX)不等于0,則(CX)←(CX)–1;(IP)←(IP)+8位偏移量。3.4.1循環(huán)控制指令(1)循環(huán)指令的作用:3.4.1循環(huán)控制指令說明:LOOP指令相當于下面兩條指令的組合: DECCX JNZshort-label;short-label表示短標號相等(為零)循環(huán)轉(zhuǎn)移指令LOOPZ/LOOPE格式:LOOPZ(或LOOPE)目標標號測試條件與功能:(CX)等于0且ZF=1,則(CX)←(CX)–1;(IP)←(IP)+8位偏移量。LOOPNZ/LOOPNE循環(huán)指令格式:LOOPNZ(或LOOPNE)目標標號測試條件與功能:(CX)不等于0且ZF=0;則(CX)←(CX)–1;(IP)←(IP)+8位偏移量。說明:LOOP指令相當于下面兩條指令的組合:【例3-11】將數(shù)據(jù)區(qū)的數(shù)據(jù)按正、負分開,分別送到兩個緩沖區(qū),程序如下:START:MOVSI,OFFSETBLOCK;/將數(shù)據(jù)區(qū)的偏移地址送

SI,即將

SI指向數(shù)據(jù)區(qū)

MOVDI,OFFSETPLUS-DATA;/DI指向正數(shù)緩沖區(qū)

MOVBX,OFFSETMINUS-DATA;/BX指向負數(shù)緩沖區(qū)

MOVCX,COUNT;/將數(shù)據(jù)字節(jié)送CXCLD;/將DF清0GOON:LODSB;/取串指令

TESTAL,80H;/字節(jié)最高位為1(表示是負數(shù))嗎?

JNZMINUS;/是,則轉(zhuǎn)移到MINUS語句

STOSB;/否則,執(zhí)行存入串指令STOSB

JMPAGAIN;/跳轉(zhuǎn)到AGAIN語句MINUS:XCHGBX,DI;STOSB;XCHGBX,DIAGAIN:LOOPGOONHLT【例3-11】將數(shù)據(jù)區(qū)的數(shù)據(jù)按正、負分開,分別送到兩個緩沖區(qū)

3.4.2

程序的循環(huán)結(jié)構(gòu)一個完整的循環(huán)結(jié)構(gòu)程序由以下幾部分組成:

1.循環(huán)初態(tài)設(shè)置部分:這是為了保證循環(huán)程序能正常運行而必須作的準備工作,在循環(huán)開始時往往要給循環(huán)過程置以初態(tài),即賦一個初值。循環(huán)初態(tài)又可以分成兩部分,一是循環(huán)工作部分初態(tài),另一是循環(huán)結(jié)束條件的初態(tài)。例如,要設(shè)地址指針,要使某些寄存器清零,或設(shè)某些標志等等。循環(huán)結(jié)束條件的初態(tài)往往置以循環(huán)次數(shù).置初態(tài)也是循環(huán)程序的重要的一部分,不注意往往容易出錯。

2.循環(huán)體:就是要求重復(fù)執(zhí)行的程序段部分。其中又分為:循環(huán)工作部分和循環(huán)調(diào)整部分。循環(huán)調(diào)整部分修改循環(huán)參數(shù),以保證每次循環(huán)所完成的功能不是完全重復(fù)的。

3.循環(huán)結(jié)束條件部分:也稱循環(huán)出口判定部分。在循環(huán)程序中必須給出循環(huán)結(jié)束條件,否則程序就會進入死循環(huán)。每循環(huán)一次檢查循環(huán)結(jié)束的條件,當滿足條件時就停止循環(huán),往下執(zhí)行其他程序。 3.4.2程序的循環(huán)結(jié)構(gòu)一個完整的循環(huán)結(jié)構(gòu)程序由以下幾

3.4.3控制程序循環(huán)的方法

控制程序循環(huán)的方法就是選擇循環(huán)控制條件,是循環(huán)程序設(shè)計的關(guān)鍵。

常用的循環(huán)控制方法有計數(shù)控制法、條件控制法和邏輯尺控制法等。1.計數(shù)控制法

常見的循環(huán)是計數(shù)循環(huán),當循環(huán)了一定次數(shù)后就結(jié)束循環(huán)。在微型機中,常用一個內(nèi)部寄存器(一般用CX),或寄存器對作為計數(shù)器,對它的初值置循環(huán)次數(shù),每循環(huán)一次減1,當計數(shù)器的值減為0時,就停止循環(huán)。也可以初值置為0,每循環(huán)一次加l,再與循環(huán)次數(shù)相比較,若兩者相等就停止循環(huán)。 3.4.3控制程序循環(huán)的方法控制程序循【例3-11】編寫一個程序,計算SUM=A1×B1+A2×B2+…+An×Bn。設(shè)A1,A2,…,An和B1,B2,…,Bn為無符號數(shù),假定SUM不會超過65535?!穹治鰡栴}:由題意可知,這是求n個數(shù)的累加和,而每個數(shù)都是兩個數(shù)組對應(yīng)項的乘積,存在n次重復(fù)操作?!翊_定算法:采用采用比較循環(huán)指令,循環(huán)次數(shù)是n次。故用循環(huán)次數(shù)作為循環(huán)的控制條件,再配合使用LOOP指令。循環(huán)控制采用計數(shù)控制?!癞嫵绦蛄鞒虉D:略?!翊_定匯編語言程序的基本框架:可見,該匯編語言程序的基本框架至少要兩個段:數(shù)據(jù)段和代碼段。數(shù)據(jù)段中至少定義4個變量:兩個數(shù)組變量A和B,由題設(shè)知為8位數(shù),應(yīng)選DB類型,使用寄存器SI定位。和數(shù)SUM變量,由題設(shè)知為16位數(shù),選DW類型,其中間結(jié)果放在寄存器BX。還有一個數(shù)N,為循環(huán)次數(shù),計數(shù)器用CX?!纠?-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,為循環(huán)次數(shù)DATAENDSCODESEGMENT ASSUMECS:CODE.DS:DATA START:MOVAX,DATA MOVDS,AX●編寫程序,可以想得到,需要MOV、ADD、MUL、IN XORBX,BX;/準備存放和的寄存器BX清零,設(shè)置工作初值

XORSI,SI;/變量A和B的地址定位寄存器SI清零,設(shè)置工作初值

MOVCX,N:/為循環(huán)次數(shù)寄存器CX設(shè)置循環(huán)控制初值NLOPl:MOVAL,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論