版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第4章匯編語言程序設(shè)計先看一個例子例:編程實現(xiàn)c=a+b,并在屏幕上顯示出結(jié)果。(分別以C語言和匯編語言編寫)#include"stdio.h"intmain(intargc,char*argv[]){inta,b,c;a=1; b=2; c=a+b; printf(“c=%d\n",c); return0;}編譯后的目標(biāo)文件達到3.59KBC語言編寫datasegmentadb?bdb?cdb?stringdb'c=$'dataendscodesegmentmainprocfarassumecs:code,ds:data,es:datastart:
pushdssubax,axpushax
movax,datamovds,axmoves,ax
mova,1movb,2moval,aaddal,bmovc,al
leadx,stringmovah,09int21h
addc,30hmovdl,cmovah,2int21hmovdl,0ahint21hmovdl,0dhint21hretmainendpcodeendsendstart匯編后的目標(biāo)文件只有208字節(jié)匯編語言編寫什么是匯編語言(1)匯編語言是一種面向機器的低級程序設(shè)計語言匯編語言以助記符形式表示每一條計算機指令助記符(mnemonic)是便于人們記憶、并能描述指令功能和指令操作數(shù)的符號助記符一般就是表明指令功能的英語單詞或其縮寫什么是匯編語言(2)匯編語言(AssemblyLanguage)是匯編指令集、偽指令集和使用它們規(guī)則的統(tǒng)稱。偽指令是在程序設(shè)計時所需要的一些輔助性說明指令,它不對應(yīng)具體的機器指令。用匯編語言書寫的程序就是匯編語言程序,或稱匯編語言源程序。匯編程序?qū)R編語言程序“匯編”成機器代碼目標(biāo)模塊。什么是匯編語言(3)匯編語言的主要特點:匯編語言程序與處理器指令系統(tǒng)密切相關(guān)程序員可直接、有效地控制系統(tǒng)硬件形成的可執(zhí)行文件運行速度快、占用主存容量少匯編語言程序與匯編程序是兩個概念匯編語言和高級語言(1)匯編語言與處理器密切相關(guān) ↘匯編語言程序的通用性、可移植性較差高級語言與具體計算機無關(guān) ↗高級語言程序可以在多種計算機上編譯后執(zhí)行匯編語言:×高級語言:√匯編語言和高級語言(2)匯編語言功能有限、涉及硬件細節(jié) ↘編寫程序比較繁瑣,調(diào)試起來也比較困難高級語言提供了強大的功能,不必關(guān)心瑣碎問題 ↗類似自然語言的語法,易于掌握和應(yīng)用匯編語言:×高級語言:√匯編語言和高級語言(3)匯編語言本質(zhì)上就是機器語言↗可以直接、有效地控制計算機硬件↗易于產(chǎn)生速度快、容量小的高效率目標(biāo)程序高級語言不針對具體計算機系統(tǒng)↘不易直接控制計算機的各種操作↘目標(biāo)程序比較龐大、運行速度較慢匯編語言:√高級語言:×匯編語言和高級語言(4)匯編語言的優(yōu)點:直接控制計算機硬件部件可以編寫在“時間”和“空間”兩方面最有效的程序匯編語言的缺點:與處理器密切有關(guān)需要熟悉計算機硬件系統(tǒng)、考慮許多細節(jié)編寫繁瑣,調(diào)試、維護、交流和移植困難匯編語言:?高級語言:?匯編語言和高級語言(5)匯編語言的優(yōu)點使得它在程序設(shè)計中占有重要的位置,是不可被取代的匯編語言的缺點使得人們主要采用高級語言進行程序開發(fā)工作有時需要采用高級語言和匯編語言混合編程的方法,互相取長補短,更好地解決實際問題混合編程取長補短匯編語言的應(yīng)用場合程序要具有較快的執(zhí)行時間,或者只能占用較小的存儲容量程序與計算機硬件密切相關(guān),程序要直接、有效地控制硬件大型軟件需要提高性能、優(yōu)化處理的部分沒有合適的高級語言、或只能采用匯編語言的時候分析具體系統(tǒng)尤其是該系統(tǒng)的低層軟件、加密解密軟件、分析和防治計算機病毒等等匯編語言的作用實在不??!4.1匯編語言程序格式4.1.1匯編語言程序的結(jié)構(gòu)匯編語言程序由若干個段構(gòu)成.按各段功能的不同,分別稱為堆棧段(保存數(shù)據(jù)、斷點等信息)、代碼段(存放指令)、數(shù)據(jù)段和附加段(定義數(shù)據(jù)、分配存儲單元)堆棧段和代碼段是必需的每段必須有且僅有一個名字,以SEGMENT定義段的起始,以ENDS定義段的結(jié)束,整個程序結(jié)束后需以END收尾1.源程序的一般格式源程序一般格式為STACKSEGMENT┇STACKENDS
DATASEGMENT┇DATAENDSCODESEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACKSTART:…┇CODEENDS
ENDSTART例4-1編寫一個兩字相加的程序。DSEGSEGMENT;定義數(shù)據(jù)段DATA1DW1234H;定義被加數(shù)DATA2DW5678H;定義加數(shù)DSEGENDS;數(shù)據(jù)段結(jié)束ESEGSEGMENT;定義附加段SUMDW2DUP(?);定義存放結(jié)果區(qū)ESEGENDS;附加段結(jié)束CSEGSEGMENT;定義代碼段;下面的語句說明程序中定義的各段分別用哪個段寄存器尋址ASSUMECS:CSEG,DS:DSEG,ES:ESEGSTART:MOVAX,DSEG;START為程序開始執(zhí)行的啟動標(biāo)號MOVDS,AX;初始化DSMOVAX,ESEGMOVES,AX;初始化ESLEASI,SUM;存放結(jié)果的偏移地址送SIMOVAX,DATA1;取被加數(shù)ADDAX,DATA2;兩數(shù)相加MOVES:[SI],AX;和送附加段的SUM單元中HLTCSEGENDS;代碼段結(jié)束ENDSTART;源程序結(jié)束2.源程序的結(jié)構(gòu)特點(1)匯編語言程序通常由若干段組成,段由偽指令SEGMENT與ENDS定義,各段順序任意,段的數(shù)目仍需要確定,原則上不受限制。數(shù)據(jù)段通常在代碼段前面定義。程序代碼段部分開始要設(shè)置段寄存器,要初始化DS內(nèi)容(2)段由若干語句組成,語句以指令為主體而構(gòu)成。一條語句寫在一行上,書寫時語句的各部分應(yīng)盡量對齊(3)匯編語言程序中至少要有一個啟動標(biāo)號,作為程序開始執(zhí)行時目標(biāo)代碼的入口地址。啟動標(biāo)號常用START、BEGIN、MAIN等命名。(4)為增加程序的可讀性,可在匯編語言語句“;”后加上注釋。4.1.2匯編語言語句類型及格式1.匯編語言語句的類型(1)指令語句是可執(zhí)行語句,在匯編中要產(chǎn)生對應(yīng)的目標(biāo)代碼,CPU根據(jù)這些代碼才能執(zhí)行相應(yīng)的操作。每一條指令語句表示計算機具有的一個基本能力,而這種能力是在目標(biāo)程序運行時完成的。(2)偽指令語句是不可執(zhí)行語句,在匯編中不產(chǎn)生目標(biāo)代碼,用于指示匯編程序如何匯編源程序,利用它定義和說明常量和變量的屬性及存儲器單元的分配等。偽指令的功能是由匯編程序在匯編源程序時,通過執(zhí)行一段程序來完成的,而不是在運行目標(biāo)程序時實現(xiàn)的。(3)宏指令語句是以一個宏名定義的一段指令序列,在匯編中凡是出現(xiàn)宏指令語句的地方,都會有相應(yīng)的指令語句序列的目標(biāo)代碼插入。宏指令語句可以看作是指令語句的擴展。相當(dāng)于多條指令語句的集合,它包括宏定義、宏調(diào)用和宏擴展三部分。2.語句的格式語句的格式分為指令語句格式和偽指令語句格式,它們都是由4部分組成。指令語句格式:
[標(biāo)號:]<指令助記符>[操作數(shù)][;注釋]偽指令語句格式:
[符號名:]<偽指令助記符>[操作數(shù)][;注釋]其中,[]表示可選項;<>表示必選項。4.1.2匯編語言語句類型及格式(1)標(biāo)號和符號名標(biāo)號表示一條指令的符號地址,后面必須帶有一個冒號,它是一個可選項,一般在程序的入口處設(shè)置一個標(biāo)號符號名可以是常量名、變量名、段名、過程名、宏名等,后面不能帶有冒號,它也是一個可選項。在匯編語言中可以使用下列符號表示標(biāo)號或符號名:①英文字母:A~Z;a~z,大小寫無區(qū)別;②數(shù)字:0~9,不能作標(biāo)號和符號名的第一個字符;③特殊字符:?、@、$、_、;等需要注意,標(biāo)號和符號名的長度不能超過31個,?和$字符、CPU內(nèi)部的寄存器名、匯編語言中的保留字等均不能作為標(biāo)號和符號名(2)指令助記符每條語句中必須包含指令助記符,表明該條指令要求CPU完成的具體操作。在指令語句中可用ADD,MOV,JMP等助記符來表示;在偽指令語句中可用DB,PTR,EQU等助記符來表示。(3)操作數(shù)操作數(shù)可以是寄存器、常量、變量或表達式,它是一個可選項。在指令語句中,可以有兩個操作數(shù)、一個操作數(shù)或沒有操作數(shù)。在偽指令語句中,可給出一系列的參數(shù)。各操作數(shù)之間用逗號或空格間隔。(4)注釋注釋是用于解釋程序使之便于閱讀的任何說明文字或字符,注釋由分號“;”開頭,直至語句行的結(jié)尾。注釋對匯編程序不起作用,不會生成目標(biāo)代碼,只供增強可讀性,可省略。4.1.3匯編語言的數(shù)據(jù)與表達式1.常量常量是沒有任何屬性的純數(shù)值數(shù)據(jù)。它在匯編期間和程序運行中不會發(fā)生變化。(1)數(shù)值常量在程序中,可以用不同進制數(shù)的形式表示數(shù)值常量二進制常數(shù)。以字母B結(jié)尾的0和1組成的序列。如11011101B。八進制常數(shù)。以字母O或Q結(jié)尾的0~7數(shù)字序列組成的數(shù)。如625O,471Q。十進制常數(shù)。以字母D結(jié)尾或不加字母結(jié)尾的數(shù)。如95D,95。十六進制常數(shù)。以字母H結(jié)尾的由0~9、A~F組成的數(shù)字序列。如8AB3H。4.1.3匯編語言的數(shù)據(jù)與表達式1.常量常量是沒有任何屬性的純數(shù)值數(shù)據(jù)。它在匯編期間和程序運行中不會發(fā)生變化。(1)數(shù)值常量如11011101B;如625O,471Q;如95D,95;如8AB3H。4.1.3匯編語言的數(shù)據(jù)與表達式1.常量(2)字符串
如字符“AB”,即41H,42H。(3)符號常量 通過對一個符號名賦值,作為經(jīng)常使用的常量。變量是代表存放在某些存儲單元的在程序運行期間隨時可以修改的數(shù)據(jù)。它常常以變量名的形式出現(xiàn)在程序中,可以認為是存放數(shù)據(jù)存儲單元的符號地址。變量可以用數(shù)據(jù)定義偽指令DB、DW、DD等進行定義2.變量2.變量例4-2用偽指令DB、DW、DD定義變量DATASEGMENTDA1
DB12H;定義一個字節(jié)數(shù)據(jù)DA2
DD0FEDCBA90H;定義一個雙字數(shù)據(jù)DA3
DW5678H;定義一個字數(shù)據(jù)DATAENDS經(jīng)過定義的變量,每個變量均有三個屬性:(1)段屬性(SEG):它表示變量存放在哪一個邏輯段中(即變量所在段的段基址)。例如變量名為DA1、DA2、DA3的三個變量都存放在DATA邏輯段中(用SEGMENT/ENDS偽指令定義一個邏輯段),當(dāng)在指令中要對這些變量進行存取操作時,事先要把它們所在段的段基址存放在一個段寄存器(如DS)中。(2)偏移量屬性(OFFSET):表示變量在邏輯段中離起始點的字節(jié)數(shù)。例如變量DA1的偏移量為0,而變量DA2的偏移量為1,變量DA3的偏移量為5。上述段和偏移量兩個屬性就構(gòu)成了變量的邏輯地址。(3)類型屬性(TYPE):表示變量占用存儲單元的字節(jié)數(shù)。這一屬性是由數(shù)據(jù)定義偽指令DB、DW、DD等來規(guī)定的。變量DA1是用DB定義的,它的類型為字節(jié);變量DA2用DD定義,類型屬性為雙字;而變量DA3是用DW定義的,類型屬性為字。3.標(biāo)號
標(biāo)號是一條指令的符號地址。 在無條件轉(zhuǎn)移指令、條件轉(zhuǎn)移指令、循環(huán)指令和子程序調(diào)用指令的操作數(shù)位置上,通常用標(biāo)號作為程序轉(zhuǎn)移指令的目標(biāo)地址。3.標(biāo)號標(biāo)號是一條指令的符號地址。在無條件轉(zhuǎn)移指令、條件轉(zhuǎn)移指令、循環(huán)指令和子程序調(diào)用指令的操作數(shù)位置上,通常用標(biāo)號作為程序轉(zhuǎn)移指令的目標(biāo)地址。與變量類似,每個標(biāo)號也具有三個屬性:(1)段屬性(SEG):表示這條指令目標(biāo)代碼在哪個邏輯段中(2)偏移量屬性(OFFSET):表示這條指令目標(biāo)代碼的首字節(jié)在段內(nèi)離段起始點的字節(jié)數(shù)。同樣,上述兩個屬性構(gòu)成了這條指令目標(biāo)代碼首字節(jié)的邏輯地址。(3)距離屬性:表示本標(biāo)號可作為段內(nèi)或段間的轉(zhuǎn)移特性。距離屬性分為兩種:①近(NEAR):本標(biāo)號只能被標(biāo)號所在段的轉(zhuǎn)移和調(diào)用指令所訪問(即段內(nèi)轉(zhuǎn)移);②遠(FAR):本標(biāo)號可被其他段(不是標(biāo)號所在段)的轉(zhuǎn)移和調(diào)用指令訪問(即段間轉(zhuǎn)移)。4.表達式和運算符 表達式是由常量、變量和標(biāo)號通過某些運算符連接而成 數(shù)值表達式只產(chǎn)生一個數(shù)值結(jié)果,地址表達式的結(jié)果是一個存儲器地址,如果這個地址存放的是數(shù)值,則稱它為變量。如果這個地址中存放的是指令,就稱它為標(biāo)號。4.表達式和運算符運算符主要包括以下幾種類型:(1)算術(shù)運算符 算術(shù)運算符包括加(+)、減(-)、乘(*)、除(/)、求余(MOD)、左移(SHL)和右移(SHR)共七種。(2)邏輯運算符 邏輯運算符包括AND(與)、OR(或)、XOR(異或)、NOT(非)共四種,它們只適用于對常量進行邏輯運算。注意:這四種運算符與邏輯運算指令中的助記符有完全相同的符號,但它們在語句中的位置(操作數(shù)部分、操作碼部分)是不一樣的。
例4-3邏輯運算符的應(yīng)用MOVAL,NOT10101010B;(AL)←01010101BMOVAL,11110000BAND10111101B;(AL)←10110000BMOVAL,10100000BOR00000101B;(AL)←10100101B(3)關(guān)系運算符 關(guān)系運算符包括EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)共六種。例4-4關(guān)系運算符的應(yīng)用MOVAX,5EQ101B;(AX)←0FFFFHMOVBH,10HGT16;(BH)←0(4)數(shù)值返回運算符表4-1數(shù)值返回運算符的功能例4-5數(shù)值返回運算符的應(yīng)用K1DB30H,31H,32HK2DW4041H,4043HK3DW20HDUP(0)K4DD50515253HMOVAL,TYPEK1;等效于MOVAL,1MOVAH,TYPEK2;等效于MOVAH,2MOVAL,LENGTHK3;(AL)←20H,返回DUP前面的數(shù)值MOVCL,LENGTHK4;(CL)←01HMOVBL,SIZEK3;(BL)←40HMOVDL,SIZEK4;(DL)←04H(5)修改屬性運算符①修改段屬性運算符“:”“:”運算符用來臨時給變量、標(biāo)號或地址表達式指定一個段屬性,自動生成段跨越前綴字節(jié)。例4-6段屬性運算符的應(yīng)用MOVAX,ES:[BX];用附加段ES取代默認的數(shù)據(jù)段DSMOVBL,DS:[BP];用數(shù)據(jù)段DS取代默認的堆棧段SS注意,CS和ES不能被跨越,堆棧操作時SS也不能被跨越②定義符號名為新類型運算符PTR格式:類型PTR地址表達式 PTR運算符是為同一個存儲單元賦予不同的類型屬性。根據(jù)地址表達式的不同,所賦予的新類型可以是BYTE、WORD、DWORD、NEAR、FAR,它們只在所在的指令內(nèi)有效。例4-7PTR運算符的應(yīng)用N1DB3,6,9MOVAX,WORDPTRN1;臨時指定N1為字類型,(AX)←0603H③指定新類型運算符THIS格式:THIS類型或?qū)傩訲HIS運算符用來把它后面指定的類型或距離屬性賦給當(dāng)前的變量、標(biāo)號或地址表達式。例4-8THIS運算符的應(yīng)用ABCEQUTHISBYTE;從本語句開始變量ABC的類型屬性指定為字節(jié),不管它原來的類型是什么。④取高位字節(jié)/低位字節(jié)運算符HIGH/LOW HIGH和LOW運算符分別用來從運算對象中分離出高字節(jié)和低字節(jié)。例4-9HIGH和LOW運算符的應(yīng)用NUMEQU3456HMOVAL,HIGHNUM;等效于MOVAL,34HMOVBL,LOWNUM;等效于MOVBL,56H⑤短轉(zhuǎn)移運算符SHORT
SHORT運算符決定JMP指令中轉(zhuǎn)移地址的屬性,指定轉(zhuǎn)移地址是下一條指令地址的-128~+127字節(jié)范圍之內(nèi)。優(yōu)先級別高級低級表4-2運算符的優(yōu)先級別4.2偽指令4.2.1符號定義偽指令1.等值語句格式:符號名EQU表達式例4-10等值語句CREQU0DH;常量TENEQU0AH;常量AAEQUASCII_TABLE;變量VAREQUTEN*2+1024;數(shù)值表達式ADREQUES:[BP+DI+5];地址表達式GOTOEQUJMP;指令助記符2.等號語句格式:符號名=表達式功能:把表達式的值賦值給符號名,等號語句與等值語句具有相同的功能,它們的區(qū)別在于等號語句可以重復(fù)定義。例4-11等號語句NUM=488;定義NUM等于488NUM=NUM+1;定義NUM等于4894.2.2數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令用來定義變量的類型,給存儲器賦初值,或給變量分配存儲空間格式:[變量名]數(shù)據(jù)定義符操作數(shù)[,操作數(shù),┅]功能:DB定義字節(jié)類型變量,DW定義字類型變量,DD定義雙字類型變量,DQ定義四字類型變量,DT定義十字節(jié)類型變量。說明:(1)操作數(shù)從變量名地址開始按字節(jié)連續(xù)存放,直到操作數(shù)結(jié)束(地址遞增方向)。例4-12DATADB11H,33H;定義包含兩個元素的字節(jié)變量DATANUMDW100*5+88;定義一個字類型變量NUM,其初值為表達式的值SUMDQ0011223344556677
;將4個字存入變量SUM。它們在內(nèi)存中的存放地址由高到低分別為:77H,66H,55H,44H,33H,22H,11H,00H(2)字符串必須放在引號中,兩個以上字符的字符串只能用DB偽指令。數(shù)據(jù)項中可以用“?”預(yù)留若干存儲單元,此時變量初值不確定。例4-13STR1DB‘COMPUTER’;定義一個字符串,字符串的首地址為STR1STR2DW‘AA’,‘BC’,‘DE’
;給兩個字符組成的字符串分配兩個字節(jié)存儲單元DATADW?,?,?
;為DATA預(yù)留6個存儲單元(3)當(dāng)同樣的操作數(shù)重復(fù)多次時,可用重復(fù)操作符“DUP”表示。[變量名]數(shù)據(jù)定義符nDUP(初值[,初值…])
例4-14DATA1DB20DUP(?)
;為變量DATA1分配20個字節(jié)的空間,初值為任意值DATA2DW?
;為變量DATA2分配2個字節(jié)的空間,初值為任意值DATA3DB20DUP(30H)
;為變量DATA3分配20個字節(jié)的空間,初值均為30H4.2.3段定義偽指令一個匯編語言按規(guī)定的功能可劃分成幾個段,如堆棧段、數(shù)據(jù)段、代碼段等,有時還要定義附加段,每個段的空間不超過64KB,根據(jù)不同的功能存放不同的內(nèi)容格式:段名SEGMENT定位類型組合類型類別名┇段名ENDS1.段名段名是定義一個段不可缺少的部分通常,選用與本段用途相關(guān)的名字(但不得使用系統(tǒng)保留字(表4-1)中的名字),如選用DATA1、DATA2、STACK1、CODE等名字作為段名。一個段開始和結(jié)尾的段名必須一致,否則會出現(xiàn)語法錯誤2.定位類型(1)BYTE:表示本段起始單元可以從任一地址開始,段間不留空隙,存儲器利用率最高。(2)WORD:表示本段起始單元從一個偶字節(jié)地址開始,即段起始地址的最后一位二進制數(shù)一定是0,如03864H,02B38H等。(3)PARA:這是隱含選擇,表示本段起始地址從一個節(jié)的邊界開始。一個節(jié)為16個字節(jié),所以段的起始地址一定能被16整除,亦即是以0H結(jié)尾的地址。如04360H,08B30H等。(4)PAGE:表示本段起始地址從一個頁的邊界開始。一頁為256個字節(jié),所以段的起始地址一定能被256整除,亦即是以00H結(jié)尾的地址,如06500H,08B00H等。3.組合類型組合類型表示多個程序模塊連接時,本模塊與其他模塊的同名段如何組合(1)NONE:隱含選擇,表示本段與其他段無組合關(guān)系,每段都有自己的段基址。(2)PUBLIC:在滿足定位類型的前提下與其他模塊的同名段鄰接在一起,形成一個新的邏輯段,公用一個段基址,所有偏移量調(diào)整為相對于新邏輯段的起始地址。(3)COMMON:當(dāng)兩個段連接時,把本段與其他也用COMMON說明的同名段置成相同的起始地址,共享相同的存儲區(qū)。共享存儲區(qū)的長度由其中最大的段確定。(4)STACK:把所有同名段連接成一個連續(xù)段,自動初始化SS和SP,使SS的內(nèi)容為該連續(xù)段的首地址,SP指向堆棧底部+1的存儲單元。(5)MEMORY:表示本段在存儲器中應(yīng)定位在所有其他段的最高地址。若有多個MEMORY,則只要把第一個遇到的段當(dāng)作MEMORY處理,其余的同名段均按COMMON說明處理。(6)AT表達式:本段的起始地址是表達式所計算出來的16位段地址。例如:AT0530H,表示本段從物理地址05300H開始裝入。4.類別名類別名可以是任何合法的名字,必須用單引號括起來。在連接處理時,LINK程序把類別名相同的所有段存放在連續(xù)的存儲區(qū)內(nèi)。典型的類別名如:‘DATA’,‘STACK’,‘CODE’。定位類型、組合類型和類別名三個參數(shù)之間用空格分隔。在選用時,可以只選其中一個或兩個參數(shù)項,但不能交換它們之間的順序4.2.4段尋址偽指令在段尋址偽指令用來告訴匯編程序當(dāng)前使用的各個段的段地址將要存放在哪個段寄存器中格式:ASSUME段寄存器名:段名,段寄存器名:段名,……功能:設(shè)置或撤消在SEGMENT……ENDS偽指令中定義過的段名所使用的段寄存器。格式中的段寄存器名是指CS、DS、ES或SS中的一個,段寄存器名與段名之間用冒號“:”相連ASSUME偽指令一般作為代碼段起始語句之后的第一條出現(xiàn)例4-15求從NUM開始的12個無符號字節(jié)數(shù)的和,結(jié)果放在SUM字單元中。DATASEGMENT ;定義數(shù)據(jù)段NUMDB95H,83H,36H,2DH
;12個無符號字節(jié)數(shù)DB33H,22H,1AH,34HDB62H,45H,75H,49HSUMDW?DATAENDSSTACKSEGMENT;定義100個字節(jié)的堆棧段DB100DUP(?)STACKENDSCODESEGMENT;定義代碼段
ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK
;設(shè)置段名所使用的段寄存器BEGIN:MOVAX,DATAMOVDS,AX;初始化DSMOVES,AX;初始化ESMOVAX,STACKMOVSS,AX;初始化SS
LEASI,NUM;SI指向NUMMOVCX,12;循環(huán)計數(shù)器XORAX,AX;AX清0NEXT:ADDAL,[SI];把一個數(shù)加到AL中ADCAH,0;若有進位,則加到AH中INCSI;指向下一個數(shù)LOOPNEXT;若未加完,繼續(xù)循環(huán)MOVSUM,AX;若結(jié)束,存結(jié)果于SUMHLT;結(jié)束CODEENDS;代碼段結(jié)束ENDBEGIN;匯編結(jié)束,起始運行地址為BEGIN4.2.5過程定義偽指令在匯編語言程序設(shè)計中,通常將具有某種功能的程序塊看作一個過程(子程序),它可以被別的程序調(diào)用,通過CALL指令執(zhí)行在子程序中通過RET指令返回主程序。格式:過程名PROC[NEAR/FAR]┇[RET] ┇RET過程名ENDP功能:定義一個過程,并指明過程名和過程的屬性例4-16編寫一個延時50ms的子程序DELAYPROC;定義一個近過程PUSHBX;保護BX原來的內(nèi)容PUSHCX;保護CX原來的內(nèi)容MOVBL,5;外循環(huán)次數(shù)NEXT:MOVCX,2801
;內(nèi)循環(huán)次數(shù)(實現(xiàn)延時10ms)W10MS:LOOPW10MS;(CX)≠0則循環(huán)DECBL;修改外循環(huán)計數(shù)值JNZNEXT;(BX)≠0則進行外循環(huán)POPCX;恢復(fù)CX原來的內(nèi)容POPBX;恢復(fù)BX原來的內(nèi)容RET;過程返回DELAYENDP;過程結(jié)束4.2.6模塊定義與連接偽指令模塊是一個獨立的匯編單位,實際上也就是單一的、獨立的源程序,前面我們所說的“源程序”其實都是模塊。模塊連接偽指令主要解決多模塊的連接問題。1.模塊定義偽指令格式:NAME標(biāo)識符┇END啟動標(biāo)號功能:定義所給模塊名的源程序模塊。表示以標(biāo)識符為名的模塊由NAME開始,到END結(jié)束,并指出該模塊的啟動地址,即標(biāo)號代表的第一條可執(zhí)行指令所對應(yīng)的目標(biāo)碼地址,系統(tǒng)由此可為CS:IP賦起始值。2.模塊連接偽指令(1)全局符號偽指令格式:PUBLIC符號名1,符號名2,…功能:定義符號名為全局符號名,允許程序中其它模塊直接引用。PUBLIC偽指令可以出現(xiàn)在模塊中的任何位置,一般放在模塊的開頭(2)引用偽指令格式:EXTRN符號名1:類型,符號名2:類型,…功能:指明本模塊中所使用的符號名在程序的其它模塊中已經(jīng)定義,且出現(xiàn)在其它模塊的PUBLIC偽指令中。EXTRN偽指令中定義的符號名若為變量,則類型應(yīng)是BYTE、WORD、DWORD;符號名若為常量,則類型應(yīng)是ABS;符號名若為標(biāo)號,則類型應(yīng)是距離屬性NEAR或FAR。PUBLIC偽指令與EXTRN偽指令相互關(guān)聯(lián),在程序中二者必須呼應(yīng)。例4-17編程利用乘法模塊計算X*Y。NAMEMAINCALL;主模塊EXTRNWMUL:FAR;將WMUL定義為外部過程名STACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDSDATASEGMENTPARA‘DATA’XDW3355HYDW8866HDATAENDSCODESEGMENTPARA‘CODE’MAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACKPUSHDSMOVAX,0PUSHAXMOVAX,DATA
MOVDS,AXMOVAX,XMOVBX,YCALLWMUL;調(diào)用外部過程WMULRETMAINENDPCODEENDSENDMAIN;主模塊結(jié)束NAMESUBMUL;子模塊CDESGSEGMENTPARA‘CODE’WMULPROCFAR;定義遠過程WMULASSUMECS:CDESGPUBLICWMUL;定義WMUL為全局過程名CALLMULAB;嵌套調(diào)用RET;過程返回WMULENDP;過程結(jié)束MULABPROC;定義一個近過程MULABMULBXRETMULABENDP;過程結(jié)束CDESGENDS;代碼段結(jié)束END;子模塊結(jié)束4.2.7宏命令偽指令在匯編語言中,如果需要多次使用同一個程序段,可以將這個程序段定義為一個宏,然后每次需要時,即可簡單地用宏名來代替,以避免重復(fù)書寫,使源程序更加簡潔、易讀。宏相當(dāng)于多條指令語句的集合,宏命令偽指令包括宏定義、宏調(diào)用和宏擴展三部分。1.宏定義格式:宏名MACRO[形式參數(shù),…]┇(宏體)ENDM功能:將一段程序定義為一個宏名表示的宏指令。宏名與過程名類似,是宏定義的標(biāo)志,它位于宏指令標(biāo)識符MACRO之前,但宏定義結(jié)束符前不加宏名。對宏名的規(guī)定與對標(biāo)號的規(guī)定一樣。宏定義中的形式參數(shù)是任選的,可以只有一個,可以有多個,也可以沒有有多個參數(shù)時,各參數(shù)間要用逗號隔開中間省略部分是實現(xiàn)某些操作的宏定義體例4-18用宏指令定義兩個字節(jié)數(shù)相加,結(jié)果存入RESULT單元的操作。宏定義:ADDMMACROOPR1,OPR2,RESULT;形參是OPR1,OPR2,RESULTMOVAL,OPR1ADDAL,OPR2MOVRESULT,ALENDM2.宏調(diào)用格式:宏名[實際參數(shù),…]功能:宏調(diào)用是宏定義的應(yīng)用。匯編時,在調(diào)用宏名的地方插入宏體以實現(xiàn)宏展開,即用宏體取代源程序中的宏名,并用實參取代宏定義中的形參。若實際參數(shù)比形式參數(shù)多,則多出的實際參數(shù)被忽略。例4-19將例4-18中的宏定義進行宏調(diào)用、宏展開操作如下:宏調(diào)用:
┇ADDM88,36,SUM;實參是88,36,SUM┇ADDMBR,TAB,SUM;實參是BR,TAB,SUM宏展開:
┇+MOVAL,88+ADDAL,36+MOVSUM,AL┇ +MOVAL,BR+ADDAL,TAB+MOVSUM,AL┇3.宏指令與過程的區(qū)別(1)宏調(diào)用語句由宏匯編程序識別,并完成相應(yīng)的處理;而調(diào)用過程的CALL語句是在執(zhí)行程序時完成的。(2)匯編語言源程序在匯編過程中,要將宏指令所代替的程序段匯編成相應(yīng)的機器代碼,并插入到源程序的目標(biāo)代碼中。宏調(diào)用不能縮短目標(biāo)代碼的長度。但是,被調(diào)用的過程經(jīng)匯編后的機器代碼是與主程序分開并獨立存在的,其目標(biāo)代碼在存儲器中只需保留一份。因此,采用過程調(diào)用能有效地節(jié)省內(nèi)存空間,而宏調(diào)用卻不具有這一優(yōu)點。(3)過程調(diào)用節(jié)省存儲空間,但降低程序的執(zhí)行速度;而宏調(diào)用不能節(jié)省存儲空間,但能有較快的執(zhí)行速度。(4)每次宏調(diào)用允許修改有關(guān)參數(shù),使得同一條宏指令在每次調(diào)用時能完成不同的操作;而過程一旦被定義,一般不便于修改參數(shù),除非在過程調(diào)用前通過參數(shù)傳遞方法引入不同的參數(shù)。當(dāng)需要多次執(zhí)行的程序段比較長,對速度要求不很高,并且不要求修改參數(shù)的情況下,可以采用過程調(diào)用方式,否則宜采用宏調(diào)用方式。4.宏的取消格式:PURGE宏名表功能:用于取消宏名表所給出的宏。4.2.8其它偽指令1.定位偽指令格式:ORG表達式功能:將表達式的值賦給當(dāng)前位置計數(shù)器。例4-20偽指令ORG和當(dāng)前位置計數(shù)器值符號$的應(yīng)用DATASEGMENTORG30HDB1DB12H,34HORG$+20HSTRINGDB‘STRING’┇DATAENDS在匯編指令語句時,每匯編完一條指令后,就按照該指令目標(biāo)代碼的長度修改當(dāng)前位置計數(shù)器。位置計數(shù)器的現(xiàn)行值$表示本條指令目標(biāo)代碼的首字節(jié)偏移量。2.方式選擇偽指令方式選擇偽指令用于確定CPU的工作方式和選用指令集,它可告訴匯編程序當(dāng)前源程序是由哪一種處理器執(zhí)行的格式:·8086;匯編程序只接受8086/8088的指令,這是默認方式·286;匯編程序接受8086/8088及286的指令·286P;除與·286功能相同之外,匯編程序還接受286保護方式下的指令·386,·386P,·486,·486P含義類推,·586;匯編程序接受8086/8088、286、386、486及586的指令·586P;除與·586功能相同之外,匯編程序還接受586保護方式下的指令方式選擇偽指令一般放置在源程序的開始處,用于定義所使用的指令系統(tǒng)。如果缺省,系統(tǒng)默認8086/8088指令集。3.簡化的段定義偽指令DOSSEG
;標(biāo)記簡化段,各段順序由系統(tǒng)安排,用于主模塊前面·MODELSMALL;指明內(nèi)存使用模式,指示數(shù)據(jù)與代碼允許使用的長度·DATA
;定義數(shù)據(jù)段,隱含段名為@DATA·STACK[長度]
;定義堆棧段,隱含段名為@STACK,并形成SS及SP初值,缺省長度時堆棧長度為1024·CODE[名字];定義代碼段,隱含段名為@CODE·END;匯編結(jié)束簡化段中定義當(dāng)前段的偽指令可作為前一個段定義的結(jié)束,并隱含使用ASSUME偽指令。4.3匯編語言程序上機過程4.3.1建立匯編語言的工作環(huán)境為了運行匯編語言程序至少要在磁盤上建立以下程序文件:編輯程序,文件名EDIT.COM匯編程序,文件名MASM.EXE連接程序,文件名LINK.EXE調(diào)試程序,文件名DEBUG.EXE下面是三個可選程序:LIB.EXE,庫管理程序CREF.EXE,符號索引文件處理程序EXE2BIN.EXE,將EXE轉(zhuǎn)換為COM的文件格式轉(zhuǎn)換程序4.3.2上機操作過程一個源程序的上機操作過程由編輯、匯編、連接和調(diào)試四個部分組成。1.編輯匯編語言源程序的編寫輸入可以在DOS環(huán)境下的編輯軟件EDIT中完成也可以在目前流行的各種文字處理軟件、高級語言編輯環(huán)境及數(shù)據(jù)庫編輯環(huán)境中完成注意:1.對編輯完成的源程序在存盤時擴展名必須加寫.ASM2.一定要嚴格遵守匯編語言書寫格式及段結(jié)構(gòu)的格式來編寫程序2.匯編匯編程序的主要功能包括展開宏指令,檢查源程序的語法錯誤,生成目標(biāo)代碼程序。匯編過程就是將匯編語言源程序轉(zhuǎn)換成機器能夠識別的目標(biāo)代碼程序,即OBJ的二進制文件。還可生成擴展名為.LST的列表文件,擴展名為.CRF的符號索引文件。MASM5.0提供的匯編程序是MASM.EXE,MASM6.0提供的匯編語言是ML.EXE。二者的區(qū)別是:MASM.EXE僅能實現(xiàn)源程序的匯編,不能自動調(diào)用連接程序;而ML.EXE既能實現(xiàn)對源程序的匯編,也可在匯編結(jié)束后自動調(diào)用連接程序。具體匯編過程如下:在DOS狀態(tài)下,鍵入MASM,調(diào)入宏匯編程序。調(diào)入以后,先顯示版本號,然后依次提出四個問題,如下所示:SourceFilename[.ASM]:SampleObjectFilename[Sample.OBJ]:SourceListing[Nul.LST]:SampleCrossReference[Nul.CRF]:Sample第一行詢問匯編語言源程序名。用戶輸入文件名后(例如Sample),則顯示第二個提示,詢問目標(biāo)程序文件名,括號內(nèi)為機器默認的文件名,通常直接回車,表示采用默認的文件名。接著出現(xiàn)第三個提示,詢問是否要建立列表文件,該文件列出匯編后的目標(biāo)代碼以及與其有關(guān)的地址、源語句和符號表,可供打印輸出。若需要這個文件則輸入文件名并回車。接著出現(xiàn)第四個提示,詢問是否要建立交叉引用文件,該文件是一個中間文件,可供CREF.EXE程序建立一個擴展名為.REF的引用表文件,以便用戶了解源程序中符號和變量的引用情況。若需要則輸入文件名,若不需要則直接回車。當(dāng)用戶回答了第四個詢問后,匯編程序就對源程序進行匯編。3.連接所謂連接是用連接程序LINK.EXE把若干個經(jīng)匯編后產(chǎn)生的.OBJ文件及指定的庫文件連接起來,產(chǎn)生可執(zhí)行的.EXE文件。在DOS狀態(tài)下,鍵入LINK,調(diào)入連接程序。調(diào)入以后,先顯示版本號,然后依次提示四個問題,如下所示:
ObjectModules[.OBJ]:SampleRunFile[Sample.EXE]:ListFile[Nul.MAP]:SampleLibraries[.LIB]:第一行詢問要連接的目標(biāo)文件名,如果有多個要連接的目標(biāo)文件,應(yīng)一次輸入,各目標(biāo)文件名之間用“+”號相連第二個提示詢問要產(chǎn)生的可執(zhí)行文件名,一般直接回車就采用了括號內(nèi)默認的文件名第三個提示詢問是否產(chǎn)生擴展名為MAP的輸出文件,這是一個連接程序的列表文件,又稱為連接映象,它給出每個段在存儲器中的分配情況。最后提示是否用到庫文件,要求用戶輸入源程序訪問的庫文件名。所謂庫文件,就是若干可重定位的目標(biāo)代碼的集合,它可以由庫管理程序LIB.EXE建立和修改。若沒有庫文件,則直接輸入回車即可。4.調(diào)試經(jīng)過上述匯編、連接后產(chǎn)生的.EXE可執(zhí)行文件可在DOS狀態(tài)下直接輸入文件名運行該程序。如果出現(xiàn)錯誤,可用動態(tài)調(diào)試程序DEBUG進行調(diào)試。找出錯誤后,再重復(fù)上述過程,直至程序能正確運行為止。4.3.3DEBUG的使用方法1.DEBUG的運行格式一:DEBUG↓格式二:DEBUG文件名↓DEBUG運行后,出現(xiàn)DEBUG的狀態(tài)提示符短劃線:―。2.DEBUG的主要命令D,顯示內(nèi)存單元內(nèi)容;U,反匯編命令;R,顯示與修改寄存器內(nèi)容;E,修改內(nèi)存單元內(nèi)容;A,匯編命令;T、P,單步執(zhí)行指令;G,連續(xù)執(zhí)行指令;N,指定裝入文件名或?qū)懭胛募?;L,裝入N指定的文件;W,將指定內(nèi)容寫入N指定的文件;Q,退出DEBUG程序,返回操作系統(tǒng)狀態(tài)。DEBUG的所有命令操作在DEBUG狀態(tài)下完成。DEBUG狀態(tài)下的所有數(shù)據(jù)都是十六進制數(shù)據(jù),且無后綴H。4.4程序設(shè)計基本方法4.4.1程序設(shè)計概述1.程序設(shè)計的步驟(1)分析問題(2)建立數(shù)學(xué)模型(3)確定算法。(4)繪制流程圖(5)分配內(nèi)存空間(6)編制程序與靜態(tài)檢查。(7)上機調(diào)試(8)試運行和分析結(jié)果(9)整理資料投入運行2.返回DOS的方法為了能使程序正常退出并返回DOS,可使用DOS系統(tǒng)功能調(diào)用的4CH號功能。用4CH號功能返回DOS程序段如下:MOVAH,4CH;功能號送AHINT21H;返回DOS關(guān)于DOS系統(tǒng)功能調(diào)用詳見7.4節(jié)。3.程序的基本結(jié)構(gòu)任何一個復(fù)雜的程序都是由簡單的基本程序構(gòu)成的。同高級語言類似,匯編語言程序的基本結(jié)構(gòu)也有三種:順序結(jié)構(gòu),分支結(jié)構(gòu),循環(huán)結(jié)構(gòu)4.4.2順序結(jié)構(gòu)程序設(shè)計例4-21編寫程序,計算(W-(X*Y+Z-100))/W,其中W、X、Y、Z均為16位帶符號數(shù),計算結(jié)果的商存入AX,余數(shù)存入DX。程序如下:DATASEGMENTWDW268XDW–73YDW48ZDW–85DATAENDSSTACKSEGMENTDW100DUP(?)STACKENDSCODESEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,X;計算X*YIMULYMOVCX,AX;用CX存儲結(jié)果低位MOVBX,DX;用BX存儲結(jié)果高位MOVAX,Z;計算X*Y+ZCWDADDCX,AXADCBX,DXSUBCX,100;計算X*Y+Z-100SBBBX,0MOVAX,W;計算W-(X*Y+Z-100)CWDSUBAX,CXSBBDX,BXIDIVW;計算(W-(X*Y+Z-100))/W,商送AX,余數(shù)送DXMOVAH,4CHINT21HCODEENDSENDSTART例4-22把非壓縮十進制數(shù)DAT1轉(zhuǎn)換為壓縮十進制數(shù)。使用簡化段模式編寫的程序如下:.DOSSEG;代碼->數(shù)據(jù)->堆棧(采用·MODEL偽指令的默認方式)·MODELSMALL·STACK64H·DATADAT1DW0908H;非壓縮十進制數(shù)0908H
·CODE BEGIN:MOVAX,@DATAMOVDS,AX MOVAX,DAT1;AX←0908HMOVCL,4;CL←4SALAH,CL;09字節(jié)左移4位,AH=90HROLAX,CL;9008H字循環(huán)左移4位,AX=0089HROLAL,CL;89字節(jié)循環(huán)左移4位,AL=98HMOVBYTEPTRDAT1,AL;DAT1←98H,壓縮十進制數(shù)98HMOVAH,4CH;返回DOSINT21HENDBEGIN4.4.3分支結(jié)構(gòu)程序設(shè)計圖4-1兩路分支結(jié)構(gòu)圖T程序段1條件F程序段2圖4-2多路分支結(jié)構(gòu)圖程序段1多路條件程序段2程序段n…1.兩路分支程序設(shè)計實現(xiàn)這種分支結(jié)構(gòu)一般要有“產(chǎn)生條件”、“測試”、“定向”和“標(biāo)號”四個組成部分。例4-23用比較指令和條件轉(zhuǎn)移指令實現(xiàn)兩路分支的程序段。
…MOVAX,M;假定M和N為有符號數(shù)MOVBX,NCMPAX,BX;比較M和N的大小,影響標(biāo)志位,準(zhǔn)備條件JGNEXT;M>N時轉(zhuǎn)移,注意若M、N為無符號數(shù)時用JA指令……;分支程序2JMPDONENEXT:……;分支程序1……DONE:RET例4-24已知X是單字節(jié)帶符號數(shù),請設(shè)計計算下列表達式的程序。Y= 程序如下:DATASEGMENTXDB?YDB?DATAENDSCODESEGMENT;代碼段START:PROCFARASSUMECS:CODE,DS:DATAPUSHDS;保存返回地址MOVAX,0X+20(X≥0)|X|(X<0)PUSHAXMOVAX,DATA;初始化DSMOVDS,AXMOVAL,X;取數(shù)XCMPAL,0;準(zhǔn)備條件JNSPLUS;X≥0則轉(zhuǎn)移NEGAL;X<0則求補JMPDONEPLUS:ADDAL,20;X≥0時,X+20DONE:MOVY,AL;計算結(jié)果送YRET;返回STARTENDPCODEENDSENDSTART;匯編結(jié)束2.多路分支程序設(shè)計在多路分支程序設(shè)計中常利用跳轉(zhuǎn)表的方法,它使程序結(jié)構(gòu)更加清晰,運行效率更高。利用跳轉(zhuǎn)表實現(xiàn)多路分支程序設(shè)計的思想是:在內(nèi)存中開辟一片連續(xù)存儲單元作為跳轉(zhuǎn)表,表中順序存放著進入各個分支處理程序的入口地址或轉(zhuǎn)移指令,分別作為地址跳轉(zhuǎn)表或指令跳轉(zhuǎn)表。SUB1-LSUB1-HSUB2-LSUB2-HSUB3-LSUB3-H圖4-3地址跳轉(zhuǎn)表表首地址JMPSUB1JMPSUB2圖4-4指令跳轉(zhuǎn)表表首地址例4-25假設(shè)某企業(yè)有10類人員,對每類人員的工資各有不同的處理方法和計算程序。對于一類人員應(yīng)執(zhí)行程序段CLASS1,二類人員應(yīng)執(zhí)行程序段CLASS2,…,十類人員應(yīng)執(zhí)行程序段CLASS10。圖4-5例4-25的地址跳轉(zhuǎn)表和流程圖TableClass1低位字節(jié)Class1高位字節(jié)Class10高位字節(jié)Class2高位字節(jié)Class10低位字節(jié)Class2低位字節(jié)Table+2Table+18(a)地址跳轉(zhuǎn)表…CLASS10CLASS2CLASS1得到相應(yīng)的分支程序段求表地址取分類號建立地址跳轉(zhuǎn)表設(shè)置程序初始條件開始結(jié)束(b)程序如下:DATASEGMENT;定義數(shù)據(jù)段TABLEDWCLASS1,CLASS2,CLASS3,CLASS4,CLASS5DWCLASS6,CLASS7,CLASS8,CLASS9,CLASS10NUMDB?;分類號DATAENDSSTACKSEGMENTSTACK;定義堆棧段DW100DUP(?)STACKENDSCODESEGMENT;定義代碼段MAINPROCFAR;主過程ASSUMECS:CODE,DS:DATA,SS:STACKSTART:PUSHDS;保存當(dāng)前信息SUBAX,AXPUSHAXMOVAX,DATA;把DATA段基址置入DSMOVDS,AXMOVAL,NUM;取分類號MOVAH,0SHLAX;NUM*2SUBAX,2;NUM*2-2LEABX,TABLE;取表的偏移地址首地址ADDBX,AXJMP[BX];轉(zhuǎn)對應(yīng)分支的入口地址CLASS1:……;分支1處理程序段CLASS2:……;分支2處理程序段CLASS10:……;分支10處理程序段RETMAINENDPCODEENDSENDSTART;程序結(jié)束分支程序的設(shè)計,歸納起來要注意以下幾點:(1)選擇合適的轉(zhuǎn)移指令,否則可能不能轉(zhuǎn)移到預(yù)定的程序分支。(2)要為每個分支安排出口,否則將導(dǎo)致程序運行混亂。(3)應(yīng)把各分支中的公共部分盡可能集中到分支前或分支后的程序段中。(4)程序中分支出現(xiàn)順序必須與流程圖中一致。(5)無條件轉(zhuǎn)移指令的轉(zhuǎn)移范圍不受限制,條件轉(zhuǎn)移指令只能在-128~+127字節(jié)范圍內(nèi)轉(zhuǎn)移。(6)JMP指令類似于高級語言中的GOTO語句,能不用就不用。(7)調(diào)試程序時,應(yīng)盡可能對每個分支進行測試4.4.4循環(huán)結(jié)構(gòu)程序設(shè)計循環(huán)程序在結(jié)構(gòu)上包括循環(huán)的初始化、循環(huán)體和循環(huán)控制三部分。循環(huán)初始化部分用于設(shè)置循環(huán)體的初值,包括設(shè)置循環(huán)計數(shù)器的初值、變量的初值和地址初值等。循環(huán)體是循環(huán)的基本部分,是要反復(fù)執(zhí)行的那些操作,循環(huán)體中必須有改變循環(huán)條件的指令。循環(huán)控制部分是循環(huán)的核心部分,用于控制重復(fù)執(zhí)行的次數(shù),檢測和修改循環(huán)控制計數(shù)器,控制循環(huán)的運行和結(jié)束。循環(huán)初始化循環(huán)體N循環(huán)控制部分Y圖4-6先執(zhí)行后判斷循環(huán)結(jié)構(gòu)循環(huán)體圖4-7先判斷后執(zhí)行循環(huán)結(jié)構(gòu)循環(huán)初始化NY循環(huán)控制部分例4-26把從BUF單元開始的80個16位無符號數(shù)按從大到小的順序排列。分析:①這是排序問題,無符號數(shù)的比較可以直接用比較指令CMP和條件轉(zhuǎn)移指令JNC來實現(xiàn)②這又是雙重循環(huán)問題,內(nèi)循環(huán)使第1個數(shù)與下一個數(shù)比較,若大于則位置保持不變,小于則將大數(shù)放低地址,小數(shù)放高地址(兩數(shù)交換),外循環(huán)進行79次,完成對80個無符號數(shù)的大小排序采用先執(zhí)行后判斷循環(huán)結(jié)構(gòu),程序流程圖如圖4-8所示。圖4-8例4-26的流程圖NYNY
CL–1
與第2個數(shù)比較偏移地址送DI大于否?外循環(huán)次數(shù)送BL偏移地址暫送SI內(nèi)循環(huán)次數(shù)送CL取一個操作數(shù)修改指針指向下一個數(shù)大數(shù)送低地址小數(shù)送高地址
CL=0?
BL–1BL=0?結(jié)束Y程序設(shè)計:
DSEGSEGMENTBUFDW80DUP(?);假定要安排的數(shù)已存入這80個字單元中DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXLEADI,BUF;DI指向要排序的數(shù)的首址MOVBL,79;外循環(huán)只需79次即可
;外循環(huán)從此開始LOOP1:MOVSI,DI;SI指向當(dāng)前要比較的數(shù)MOVCL,BL;CL為內(nèi)循環(huán)計數(shù)器,循環(huán)次數(shù)每次少1
;以下為內(nèi)循環(huán)
LOOP2:MOVAX,[SI];取第一個數(shù)NiADDSI,2;指向下一個數(shù)NjCMPAX,[SI];Ni≥Nj?JNCNEXT;若大于,則不交換MOVDX,[SI];否則,交換Ni和NjMOV[SI-2],DXMOV[SI],AXNEXT:DECCL;內(nèi)循環(huán)結(jié)束?JNZLOOP2;若未結(jié)束,則繼續(xù)
;內(nèi)循環(huán)到此結(jié)束DECBL;外循環(huán)結(jié)束?JNZLOOP1;若未結(jié)束,則繼續(xù)
;外循環(huán)體結(jié)束MOVAH,4CH;返回DOSINT21HCSEGENDSENDSTART對于循環(huán)程序設(shè)計,歸納起來需要注意以下幾點:(1)循環(huán)方式選擇,選用計數(shù)循環(huán)還是選用條件循環(huán),采用哪種循環(huán)結(jié)構(gòu)。(2)循環(huán)條件的設(shè)計,可用循環(huán)次數(shù)、計數(shù)器、標(biāo)志位、變量值等進行控制,要從循環(huán)執(zhí)行的條件與退出循環(huán)的條件兩方面加以考慮。(3)循環(huán)體的設(shè)計,不要將循環(huán)體外的語句放到循環(huán)體中,循環(huán)體中要設(shè)計有改變循環(huán)條件的語句。4.4.5子程序設(shè)計在匯編語言程序中,子程序(過程)定義的偽指令是PROC和ENDP,子程序有NEAR或FAR屬性調(diào)用
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度差旅服務(wù)與智能出行平臺合作協(xié)議4篇
- 專業(yè)化國內(nèi)物流服務(wù)運輸協(xié)議范本(2024版)一
- 2025年度建筑工程測量監(jiān)理合同協(xié)議4篇
- 2024新三板掛牌協(xié)議及證券事務(wù)顧問服務(wù)合同3篇
- 2024藍皮合同下載
- 2025年度柴油運輸企業(yè)環(huán)保設(shè)施建設(shè)合同4篇
- 2025年度環(huán)保環(huán)保設(shè)備銷售與售后服務(wù)合同4篇
- 2025年度柴油生產(chǎn)技術(shù)改造項目合同范本4篇
- 個人房產(chǎn)買賣合同書稿版B版
- 2024投資擔(dān)保借款保證合同范本
- 產(chǎn)品共同研發(fā)合作協(xié)議范本5篇
- 風(fēng)水學(xué)的基礎(chǔ)知識培訓(xùn)
- 2024年6月高考地理真題完全解讀(安徽?。?/a>
- 吸入療法在呼吸康復(fù)應(yīng)用中的中國專家共識2022版
- 1-35kV電纜技術(shù)參數(shù)表
- 信息科技課程標(biāo)準(zhǔn)測(2022版)考試題庫及答案
- 施工組織設(shè)計方案針對性、完整性
- 2002版干部履歷表(貴州省)
- DL∕T 1909-2018 -48V電力通信直流電源系統(tǒng)技術(shù)規(guī)范
- 2024年服裝制版師(高級)職業(yè)鑒定考試復(fù)習(xí)題庫(含答案)
- 門診部縮短就診等候時間PDCA案例-課件
評論
0/150
提交評論