




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第4章匯編語言程序設(shè)計(jì)主要內(nèi)容匯編語言程序的結(jié)構(gòu)匯編語言語句類型和組成匯編語言程序設(shè)計(jì)匯編語言程序及其開發(fā)方法機(jī)器語言、匯編語言、高級(jí)語言機(jī)器語言指令和數(shù)據(jù)都用二進(jìn)制代碼表示;計(jì)算機(jī)能直接識(shí)別和執(zhí)行匯編語言用指令的助記符,符號(hào)地址,標(biāo)號(hào)等編寫程序的語言;助記符就是指令的符號(hào)表示,一個(gè)助記符表示一條機(jī)器指令;匯編語言源程序就是機(jī)器語言程序的符號(hào)表示高級(jí)語言不依賴于機(jī)器的通用語言匯編語言程序及其開發(fā)方法機(jī)器語言、匯編語言、高級(jí)語言匯編語言的特點(diǎn)可直接利用硬件系統(tǒng)的特性;可直接對(duì)位、字、字節(jié)、寄存器、存儲(chǔ)單元、I/O口進(jìn)行處理;可直接利用各種尋址方式;編寫的程序占用內(nèi)存空間少,執(zhí)行速度快;軟件開發(fā)時(shí)間長,出錯(cuò)可能性增加;要求程序設(shè)計(jì)人員對(duì)硬件結(jié)構(gòu)有比較清楚的了解主要用于:系統(tǒng)程序,實(shí)時(shí)通信程序,實(shí)時(shí)控制程序等,也可被其他高級(jí)語言所嵌用學(xué)習(xí)計(jì)算機(jī)硬件組成及其工作原理匯編語言程序及其開發(fā)方法機(jī)器語言、匯編語言、高級(jí)語言特征匯編語言高級(jí)語言目標(biāo)程序運(yùn)行時(shí)間短長程序運(yùn)行時(shí)占用的存儲(chǔ)空間小大直接訪問硬件的能力強(qiáng)弱程序可讀性和可維護(hù)性差強(qiáng)程序開發(fā)的復(fù)雜程序高低程序的可移植性差強(qiáng)對(duì)硬件環(huán)境和軟件的兼容性差強(qiáng)匯編語言程序及其開發(fā)方法匯編語言程序的開發(fā)方法編寫匯編語言源程序可以用任何文本編輯軟件建立源程序,源程序文件要以ASM為擴(kuò)展名(例:HELLO.ASM)對(duì)源程序進(jìn)行匯編匯編是將源程序翻譯成由機(jī)器代碼組成的目標(biāo)模塊文件的過程匯編器為MASM.EXE。(例:C:\>MASMHELLO.ASM)如果源程序中沒有語法錯(cuò)誤經(jīng)過匯編形成.OBJ文件還可生成列表文件.LST。列表文件是一種文本文件,含有源程序和目標(biāo)代碼,對(duì)我們學(xué)習(xí)匯編語言程序設(shè)計(jì)和發(fā)現(xiàn)錯(cuò)誤很有用匯編語言程序及其開發(fā)方法匯編語言程序的開發(fā)方法對(duì)目標(biāo)程序進(jìn)行連接連接程序能把一個(gè)或多個(gè)目標(biāo)文件和庫文件合成一個(gè)可執(zhí)行程序(.EXE、.COM文件)連接器為LINK.EXE(例:C:\>LINKHELLO.ASM)如果沒有嚴(yán)重錯(cuò)誤,LINK將生成一個(gè).EXE可執(zhí)行文件執(zhí)行程序在DOS下,鍵入可執(zhí)行程序的文件名就可以運(yùn)行(例:C:\>HELLO)要求運(yùn)行后,能正常返回DOS匯編語言程序及其開發(fā)方法匯編語言程序的開發(fā)方法調(diào)試程序?yàn)榱瞬檎页绦蚬收闲鑼?duì)可執(zhí)行程序進(jìn)行調(diào)試使用DEBUG.COM程序來進(jìn)行(例:C:\>DEBUGHELLO.EXE)在DEBUG命令行提示符“-”下,鍵入調(diào)試命令常用命令:R、D、A、U、G、T(P)查找到錯(cuò)誤,修改源程序,重新匯編、連接、調(diào)試匯編語言程序及其開發(fā)方法匯編語言程序的開發(fā)方法在DOS下運(yùn)行程序把.EXE文件裝入內(nèi)存;裝入時(shí),首先為用戶程序建立一個(gè)程序段前綴區(qū)(PSP),長度256個(gè)字節(jié),用于存放用戶程序的有關(guān)信息,然后是代碼段內(nèi)容、數(shù)據(jù)段、堆棧段;建立了PSP后,設(shè)置DS和ES的值,使它們指向PSP的開始處在PSP的開始處(偏移地址0000H),安排一條INT20H軟中斷指令(INT20H中斷服務(wù)程序是由DOS提供的,功能是“返回DOS”);匯編語言程序及其開發(fā)方法匯編語言程序的開發(fā)方法在DOS下運(yùn)行程序CS、IP、SS、SP寄存器設(shè)置為由連接程序傳過來的值;將CS設(shè)置為用戶程序代碼段的段基址,IP設(shè)置為代碼段中第一條要執(zhí)行的指令的偏移地址;將SS設(shè)置為堆棧段的段基址,SP指向堆棧段的棧底運(yùn)行用戶程序在程序中必須給DS、ES賦值匯編語言程序及其開發(fā)方法匯編語言程序的開發(fā)方法程序結(jié)束返回DOS的方法方法一:用戶組織程序時(shí),使程序執(zhí)行完后能夠轉(zhuǎn)去執(zhí)行存放于PSP開始處的INT20H指令實(shí)現(xiàn):START PROCFAR
PUSHDS XORAX,AX PUSHAX ... RETSTART ENDP匯編語言程序及其開發(fā)方法匯編語言程序的開發(fā)方法程序結(jié)束返回DOS的方法方法二:使用DOS功能調(diào)用(4CH)實(shí)現(xiàn):MOVAX,4C00H(MOVAH,4CH) INT21H匯編語言源程序的結(jié)構(gòu)匯編語言源程序的結(jié)構(gòu)舉例說明例1:計(jì)算變量X、Y的和,存入變量SUM中例2:書P87HELLO.ASM例3:書P104(返回DOS的另一種方法)匯編語言的語句格式分類及其相應(yīng)語句格式有關(guān)程序分段的偽指令SEGMENTASSUMEEND例1DATA SEGMENTX DB05HY DB02HSUM DB?DATA ENDSSTACKSEGMENT PARASTACK‘STACK’ DB64DUP(?)STACK ENDSCODE SEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACKSTART PROCFAR
PUSH DS MOV AX,0 PUSH AX定義數(shù)據(jù)段,在存儲(chǔ)器中存放供計(jì)算的數(shù)據(jù)定義堆棧段,在存儲(chǔ)器的某個(gè)區(qū)域建立一個(gè)堆棧區(qū)定義代碼段將程序定義為遠(yuǎn)過程標(biāo)準(zhǔn)序,以便返回DOS操作系統(tǒng)
MOV AX,DATA MOV DS,AX MOV AL,X ADD AL,Y MOV SUM,AL ADD AL,30H MOV DL,AL MOV AH,02H INT 21H RETSTART ENDPCODE ENDS
END START建立數(shù)據(jù)段的可尋址性,初始化DS求兩個(gè)變量的和,并將結(jié)果存入指定的內(nèi)存單元將結(jié)果轉(zhuǎn)換為ASCII碼,并調(diào)用2號(hào)DOS功能,在屏幕上顯示結(jié)果;返回DOS操作系統(tǒng);過程結(jié)束;代碼段結(jié)束;整個(gè)程序匯編結(jié)束匯編語言源程序的結(jié)構(gòu)匯編語言源程序的結(jié)構(gòu)源程序的結(jié)構(gòu)特點(diǎn):因?yàn)槲⑻幚砥魇遣捎么鎯?chǔ)器分段管理方式,所以源程序都以邏輯段為基礎(chǔ),按段的概念來組織代碼和數(shù)據(jù)源程序由若干邏輯段組成,每個(gè)邏輯段都有一個(gè)段名,由段定義語句來定義和說明一般具有代碼段,數(shù)據(jù)段,堆棧段;匯編語言源程序的結(jié)構(gòu)匯編語言源程序的結(jié)構(gòu)源程序的結(jié)構(gòu)特點(diǎn)在代碼段的起始處,用ASSUME偽指令說明各個(gè)段寄存器與邏輯段的對(duì)應(yīng)關(guān)系,并由用戶通過程序本身設(shè)置段寄存器的初值;(DS,ES)每個(gè)邏輯段由若干行匯編語句組成每個(gè)匯編語句最多由4個(gè)部分組成,它們均按照一定的規(guī)則分別寫在一條語句的4個(gè)區(qū)域內(nèi),每個(gè)區(qū)域之間使用空格隔開整個(gè)源程序必須以END[標(biāo)號(hào)]語句結(jié)束,它通知匯編程序停止匯編,只有主程序的END語句允許有標(biāo)號(hào),該標(biāo)號(hào)必須是程序運(yùn)行是第一條要執(zhí)行的指令的標(biāo)號(hào)每個(gè)源程序在代碼段中都必須含有返回到DOS操作系統(tǒng)的指令語句,保證程序執(zhí)行完畢后,自動(dòng)回到DOS匯編語言源程序的結(jié)構(gòu)匯編語言的語句格式由匯編語言編寫的源程序是由許多語句(也可稱為匯編指令)組成的。每個(gè)語句由1~4個(gè)部分組成匯編語言語句分類執(zhí)行語句(一般性指令語句、宏指令)對(duì)應(yīng)于CPU指令系統(tǒng)中的一條指令,是可執(zhí)行語句匯編時(shí),匯編程序?qū)樗a(chǎn)生一條對(duì)應(yīng)的機(jī)器目標(biāo)代碼說明性語句(偽指令語句)指定匯編程序做何種操作(如何產(chǎn)生代碼、分配存儲(chǔ)空間等);匯編時(shí),一般不產(chǎn)生機(jī)器指令代碼匯編語言源程序的結(jié)構(gòu)匯編語言的語句格式執(zhí)行語句格式[標(biāo)號(hào):]指令助記符[操作數(shù)][;注釋]標(biāo)號(hào):代表該指令的起始地址舉例:COUNT:INCCX;計(jì)數(shù)值加1說明性語句格式[名字]偽指令助記符[操作數(shù)][;注釋]名字:通常代表常量名、變量名、過程名、段名等舉例:COSTDB3;定義一個(gè)內(nèi)存變量,初始值3匯編語言中標(biāo)識(shí)符的規(guī)定(書P91)匯編語言源程序的結(jié)構(gòu)有關(guān)程序分段的偽指令段定義偽指令SEGMENT格式段名SEGMENT[定位類型][連接方式][‘類別名’]…….段名ENDS功能指出段名及段的各種屬性,并表示段的開始和結(jié)束位置匯編語言源程序的結(jié)構(gòu)有關(guān)程序分段的偽指令段定義偽指令SEGMENT定位類型:指明該段進(jìn)入內(nèi)存時(shí)從何種類型的邊界開始存放PAGE: 段起始地址的最低8數(shù)必須為0(該地址能被256整除)PARA: 段起始地址的最低4位必須為0(默認(rèn))WORD:該段必須從字的邊界開始,即段起始地址必須為偶數(shù)BYTE: 該段可以從任何地址開始匯編語言源程序的結(jié)構(gòu)有關(guān)程序分段的偽指令段定義偽指令SEGMENT連接方式(組合類型):告訴連接程序本段與其它段的關(guān)系
NONE: 表示本段與其它段邏輯上不發(fā)生關(guān)系,每段都有自己的基地址(默認(rèn))PUBLIC: 與其他同名同‘類別’的段連接在一起,使用一個(gè)共同的基地址STACK: 與PUBLIC同樣處理,但作為堆棧段。COMMON:與其他同名同‘類別’的段相互重疊在一起,使用一個(gè)共同的基地址AT表達(dá)式:把本段裝在表達(dá)式值所指定的16位段地址上(不能指定代碼段)MEMORY:把本段定位在所有其他段之上,若有多個(gè)則只有連接時(shí)遇到的第一個(gè)有效,其余按COMMON處理)
匯編語言源程序的結(jié)構(gòu)有關(guān)程序分段的偽指令段定義偽指令SEGMENT類別名:為連接程序所使用。連接程序把類別名相同的段放在連續(xù)的存儲(chǔ)區(qū)間內(nèi)類別名一般有‘STACK’、‘CODE’、‘DATA’
舉例:堆棧段的定義方式STACK SEGMENTSTACK'STACK' DB100Hdup(?)STACK ENDS匯編語言源程序的結(jié)構(gòu)有關(guān)程序分段的偽指令段尋址偽指令A(yù)SSUME格式ASSUME段寄存器:段名[,段寄存器:段名,……]功能通知匯編程序段寄存器與源程序中所定義的段名之間的對(duì)應(yīng)關(guān)系舉例ASSUMECS:CODE,DS:DATA,SS:STACK匯編語言源程序的結(jié)構(gòu)有關(guān)程序分段的偽指令段尋址偽指令A(yù)SSUME使用注意事項(xiàng)ASSUME偽指令必須寫在代碼段中,一般需放在代碼段定義語句之后ASSUME偽指令只給出了對(duì)應(yīng)關(guān)系,但并沒有真正給段寄存器賦值匯編語言源程序的結(jié)構(gòu)有關(guān)程序分段的偽指令段尋址偽指令A(yù)SSUME使用注意事項(xiàng)將真實(shí)段地址裝入段寄存器還需用匯編指令來實(shí)現(xiàn)(見書P87例4-1)當(dāng)程序運(yùn)行時(shí),由于DOS的裝入程序負(fù)責(zé)把CS初始化成正確的代碼段地址,SS初始化為正確的堆棧段地址,因此用戶在程序中不必對(duì)它們進(jìn)行設(shè)置在DOS裝入程序中DS及ES寄存器由于指向了程序段前綴PSP),因此若用戶程序需使DS與ES指向自己定義的段,則必須對(duì)它們進(jìn)行初始化匯編語言源程序的結(jié)構(gòu)有關(guān)程序分段的偽指令匯編結(jié)束偽指令END格式END[表達(dá)式]功能它是匯編語言源程序最后一條語句,匯編程序碰到它時(shí)將停止對(duì)源程序的匯編舉例:ENDSTART使用說明表達(dá)式為可選項(xiàng),它表示該匯編程序的起始執(zhí)行地址,可以為過程名或標(biāo)號(hào)只有主模塊須指定常用偽指令偽指令用來指定匯編程序做何種操作,一般不生成機(jī)器代碼介紹幾條常用偽指令符號(hào)定義偽指令EQU、=數(shù)據(jù)定義偽指令DB、DW、DD過程定義偽指令PROC定位偽指令ORG常用偽指令符號(hào)定義偽指令EQU格式符號(hào)名EQU表達(dá)式功能給符號(hào)定義一個(gè)值。在程序中,凡是出現(xiàn)該符號(hào)的地方,匯編時(shí)均用所給的值代替表達(dá)式可以是:常數(shù),求出常數(shù)值的表達(dá)式,寄存器名,指令助記符舉例PORT1EQU312HPORT2EQUPORT1+1TIMESEQU50COUNTEREQUCX常用偽指令符號(hào)定義偽指令=格式符號(hào)名=表達(dá)式功能同EQU,不同之處在于用“=”定義的符號(hào)名在同一程序中可以重復(fù)定義,而EQU不行舉例COUNT=100 ;COUNT=100COUNT=COUNT+100;COUNT=200常用偽指令數(shù)據(jù)定義偽指令偽指令名DB、DW、DDDB:定義字節(jié),即每個(gè)數(shù)據(jù)是1個(gè)字節(jié);DW:定義字,即每個(gè)數(shù)據(jù)占1個(gè)字(2個(gè)字節(jié)),低字節(jié)部分放在低地址處;DD:定義雙字,即每個(gè)數(shù)據(jù)占2個(gè)字。低字部分在低地址,高字部分在高地址功能用來分配存儲(chǔ)空間及定義所存數(shù)據(jù)的長度,同時(shí)也可對(duì)所分配的存儲(chǔ)空間賦初值常用偽指令數(shù)據(jù)定義偽指令格式格式1:[名字]偽指令名表達(dá)式1,表達(dá)式2,…
名字為可選項(xiàng)表達(dá)式數(shù)值表達(dá)式問號(hào)表達(dá)式,只用來分配存儲(chǔ)空間,但不對(duì)該空間初始化字符串表達(dá)式(一般用DB定義、若用DW定義字符串中只能包含兩個(gè)字符、字符串定界符:‘
’)常用偽指令數(shù)據(jù)定義偽指令格式格式1:[名字]偽指令名表達(dá)式1,表達(dá)式2,…
舉例:ONEDB10HTWODW100HTHREEDD12345678HFOURDB1,2,3,4,5FIVEDW1,2,3,4,5RESULT1DB?,?RESULT2DW?,?常用偽指令數(shù)據(jù)定義偽指令格式格式1:[名字]偽指令名表達(dá)式1,表達(dá)式2,…
舉例:STRING1DB‘thisisastring.’書P87例4-1S1 DB‘ABCDEF’S2 DW‘AB’,‘CD’,‘EF’S3 DD‘AB’,‘CD’常用偽指令數(shù)據(jù)定義偽指令指令格式格式2:[名字]偽指令名表達(dá)式1DUP(表達(dá)式2)該種格式用于定義一些重復(fù)的數(shù)據(jù)或分配一數(shù)據(jù)塊空間舉例:BUFFERDB100DUP(?)ARRAY1DW10DUP(10)ARRAY2DB2DUP(0,1,?)BUF1DB16DUP(‘ABCD’)常用偽指令數(shù)據(jù)定義偽指令舉例:根據(jù)下列數(shù)據(jù)段的定義,畫出內(nèi)存分配示意圖DATASEGMENT DATA1DB5,50H,‘ABC’ DB2DUP(‘123’)DATA2DW2DUP(0FFH) DATA3DWDUP(?) DATAENDS思考:若在DATA1前面加入一條如下偽指令,內(nèi)存分配是否改變?TIME1EQU50常用偽指令過程定義偽指令可將具有一定功能的程序段看成為一個(gè)過程(相當(dāng)于一個(gè)子程序),它可以被別的程序調(diào)用格式:過程名PROC[類型]
過程體
RET過程名ENDP功能定義一個(gè)過程,并指明過程名及過程的屬性類型:NEAR(默認(rèn))、FAR常用偽指令過程定義偽指令說明調(diào)用過程的格式為:CALL﹤過程名﹥NEAR:(近過程)段內(nèi)調(diào)用FAR:(遠(yuǎn)過程)段間調(diào)用過程體內(nèi)一般應(yīng)有一條RET指令,以便返回被調(diào)用處舉例:書P96例4-17定義用于延時(shí)的過程DELAY調(diào)用該過程時(shí)使用語句:CALLDELAY常用偽指令定位偽指令格式:ORG<表達(dá)式>功能:規(guī)定了在某一段內(nèi)程序代碼或數(shù)據(jù)存放的起始偏移地址舉例:畫出如下定義數(shù)據(jù)段內(nèi)存分配示意圖DATA SEGMENT BUF1 DB23,56H,‘EOF’ ORG2000HBUF2 DB‘STRING’DATA ENDS常數(shù)、變量及標(biāo)號(hào)任何一個(gè)程序都要使用數(shù)據(jù)匯編語言中的數(shù)據(jù)項(xiàng)有常數(shù)、變量及標(biāo)號(hào)三種類型常數(shù)、變量及標(biāo)號(hào)常數(shù)在匯編時(shí)已經(jīng)確定其值且程序運(yùn)行期間不變化的量為常量,如:指令語句中的立即數(shù),端口地址等匯編語言語句中出現(xiàn)的常數(shù)可以有如下幾種二進(jìn)制:10111001B十進(jìn)制:1234D或1234八進(jìn)制:255Q或255O十六進(jìn)制:3A5DH,第1位為字母時(shí)前面加數(shù)字0(與變量區(qū)別)字符串常數(shù):用單引號(hào)括起來的一個(gè)或多個(gè)字符組成一個(gè)字符串常數(shù),‘ABCD’,字符匯編成相應(yīng)的ASCII碼值常數(shù)、變量及標(biāo)號(hào)變量變量實(shí)際代表著內(nèi)存單元,存放在這些內(nèi)存單元的數(shù)據(jù)在程序運(yùn)行期間隨時(shí)可以改變變量的定義數(shù)據(jù)定義偽指令DB、DW、DD變量的使用變量常常以變量名的形式出現(xiàn)在程序中變量名是存放數(shù)據(jù)的存儲(chǔ)單元的符號(hào)地址常數(shù)、變量及標(biāo)號(hào)變量變量的屬性段屬性(SEG):表示變量存放在那一個(gè)段中對(duì)變量進(jìn)行存取時(shí)要先將它們所在段的段基值放在DS中偏移屬性(offset):表示變量在段中離段起點(diǎn)的字節(jié)數(shù)變量的段屬性和偏移屬性構(gòu)成了變量的邏輯地址
類型屬性(type):表示變量占用存儲(chǔ)單元的字節(jié)數(shù)字節(jié)、字、雙字舉例:書P97例4-19常數(shù)、變量及標(biāo)號(hào)標(biāo)號(hào)標(biāo)號(hào)是一條指令的目標(biāo)代碼的符號(hào)地址常用作轉(zhuǎn)移指令(或子程序調(diào)用指令)的操作數(shù)標(biāo)號(hào)的定義標(biāo)號(hào)的屬性段屬性是該標(biāo)號(hào)的段地址偏移屬性是該標(biāo)號(hào)的偏移地址類型屬性NEAR屬性(該標(biāo)號(hào)只能在定義它的段內(nèi)被引用)
FAR屬性(該標(biāo)號(hào)除能在定義它的段內(nèi)被引用外,也可在其它段內(nèi)被引用)常數(shù)、變量及標(biāo)號(hào)關(guān)于標(biāo)識(shí)符使用場合變量名、標(biāo)號(hào)、段名、過程名、符號(hào)常數(shù)等規(guī)則組成:字母A~Z或a~z;數(shù)字:0~9;特殊字符:?、·
、@、一、$數(shù)字不能作標(biāo)號(hào)的第一個(gè)字符,而圓點(diǎn)僅能用作第一個(gè)字符標(biāo)號(hào)或名字最長為31個(gè)字符,大小寫不敏感不能用宏匯編中的保留字指令助記符、所有寄存器名、偽指令名及其它特殊用途的符號(hào)表達(dá)式和運(yùn)算符表達(dá)式是由運(yùn)算符和操作數(shù)(常數(shù)、變量和標(biāo)號(hào))等組成的序列,在匯編時(shí)將產(chǎn)生一個(gè)確定的值這個(gè)值可以僅表示一個(gè)常量,也可以表示一個(gè)存儲(chǔ)單元的偏移地址舉例:MOVAL,3*2+5MOVAL,BUFFER+3表達(dá)式和運(yùn)算符常用運(yùn)算符算術(shù)運(yùn)算符+、-、*、/、MOD(取余)、SHL(左移)、SHR(右移)舉例:32MOD5;結(jié)果為221HSHL2;結(jié)果為84H邏輯運(yùn)算符AND、OR、XOR、NOT舉例:MOVAL,24HAND0FH表達(dá)式和運(yùn)算符常用運(yùn)算符關(guān)系運(yùn)算符EQ、NE、LT、LE、GT、GE比較時(shí),若關(guān)系不成立,則結(jié)果為“0”;若關(guān)系成立,則結(jié)果為“1”;舉例:PORTEQU10MOVBX,PORTLT5;匯編成MOVBX,0FFFFHMOVAL,((PTGT60)AND50)OR((PTLE60)AND70)表達(dá)式和運(yùn)算符常用運(yùn)算符取值運(yùn)算符SEG和OFFSET運(yùn)算符SEG用來返回標(biāo)號(hào)或變量的段地址OFFSET用來返回標(biāo)號(hào)或變量的偏移地址舉例:書P99例4-23TYPE運(yùn)算符返回一個(gè)數(shù)字值,表示存儲(chǔ)器操作數(shù)的類型;對(duì)于變量,返回的是類型的字節(jié)長度(1、2、4);對(duì)標(biāo)號(hào)返回的是類型代碼:NEAR(-1)、FAR(-2)舉例:書P100例4-24表達(dá)式和運(yùn)算符常用運(yùn)算符取值運(yùn)算符LENGTH和SIZE運(yùn)算符用LENGTH,SIZE只對(duì)用DUP定義的存儲(chǔ)器操作數(shù)有意義LENGTH返回分配給指定存儲(chǔ)器操作數(shù)元素的個(gè)數(shù)SIZE返回的是分配給該存儲(chǔ)器操作數(shù)的總字節(jié)數(shù)SIZE(X)=(LENGTHX)*(TYPEX)對(duì)用非DUP定義的存儲(chǔ)器操作數(shù),LENGTH返回值1舉例:書P100例4-25舉例:設(shè)DATA是從實(shí)際地址02000H開始的數(shù)據(jù)段,定義如下:DATASEGMENTVAR1DB20,30VAR2DW2000H,3000HVAR3DD22003300H,33002200HVAR4DB4DUP(1)VAR5DW2DUP(?)DATAENDS則:MOVBX,SEGVAR1;BX=0200HMOVDX,SEGVAR3;DX=0200HMOVAX,OFFSETVAR1;AX=0MOVAX,OFFSETVAR2;AX=2MOVAX,OFFSETVAR3;AX=6MOVCX,TYPEVAR1;CX=1MOVCX,TYPEVAR2;CX=2MOVCX,TYPEVAR3;CX=4MOVBX,LENGTHVAR2;BX=1MOVBX,LENGTHVAR5;BX=2MOVBX,LENGTHVAR4;BX=4MOVBX,SIZEVAR4;BX=4MOVBX,SIZEVAR5;BX=4表達(dá)式和運(yùn)算符表達(dá)式和運(yùn)算符常用運(yùn)算符取值運(yùn)算符HIGH和LOW運(yùn)算符用來將一個(gè)16位數(shù)或表達(dá)式的高字節(jié),低字節(jié)分離出來舉例:書P100例4-26表達(dá)式和運(yùn)算符常用運(yùn)算符取值運(yùn)算符‘$’運(yùn)算符‘‘$’運(yùn)算符當(dāng)用于偽指令的參數(shù)字段時(shí),返回匯編程序的匯編地址計(jì)數(shù)器的當(dāng)前值$出現(xiàn)在表達(dá)式中,它的值為下一個(gè)能分配的存儲(chǔ)單元的偏移地址舉例:書P100例4-27COUNT的含義?DATA SEGMENTBUFFERDW0,1,-5,10,256,-128,-100,45 DW39,-67,20,-1668 COUNTEQU ($-BUFFER)/2DATA ENDS表達(dá)式和運(yùn)算符常用運(yùn)算符取值運(yùn)算符‘$’運(yùn)算符舉例:畫出內(nèi)存示意圖DATASEGMENTORG$+2VAR1DB2,3,4 ORG$+3 VAR2DW1234HDATAENDS表達(dá)式和運(yùn)算符常用運(yùn)算符取值運(yùn)算符‘$’運(yùn)算符當(dāng)$用于指令中時(shí),返回該指令的首地址舉例:設(shè)在內(nèi)存1000:2543處存有指令:JNE$+6,則轉(zhuǎn)移地址(偏移量)是2549H表達(dá)式和運(yùn)算符常用運(yùn)算符屬性運(yùn)算符PTR運(yùn)算符用來給指令中的操作數(shù)指定一個(gè)臨時(shí)屬性,以滿足不同的訪問要求,類型改變僅在當(dāng)前所在的指令中有效格式新類型或?qū)傩訮TR表達(dá)式類型:BYTE,WORD,DWORD,NEAR,F(xiàn)AR舉例:書P100表達(dá)式和運(yùn)算符常用運(yùn)算符屬性運(yùn)算符THIS運(yùn)算符用于定義一個(gè)變量或標(biāo)號(hào),使它們具有多重名字和屬性格式標(biāo)號(hào)或變量EQUTHIS類型類型:BYTE,WORD,DWORD,NEAR,F(xiàn)AR舉例:書P100例4-33表達(dá)式和運(yùn)算符常用運(yùn)算符屬性運(yùn)算符段超越運(yùn)算符強(qiáng)迫當(dāng)前指令的操作數(shù)的尋址不按默認(rèn)的段進(jìn)行,而由段超越運(yùn)算符指定的段來尋址格式段寄存器名:舉例:MOVAX,ES:[BX]SHORT運(yùn)算符用于通知匯編器,轉(zhuǎn)移目標(biāo)在-128-+127范圍內(nèi)舉例:JMPSHORTF1基本結(jié)構(gòu)程序設(shè)計(jì)程序設(shè)計(jì)步驟分析問題確定算法畫流程圖內(nèi)存空間分配編寫程序靜態(tài)檢查上機(jī)調(diào)試基本結(jié)構(gòu)程序設(shè)計(jì)程序的基本結(jié)構(gòu)順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)基本結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)順序結(jié)構(gòu)的程序是沒有分支、沒有循環(huán)和轉(zhuǎn)移、只能順序運(yùn)行的程序在匯編環(huán)境下,編寫順序結(jié)構(gòu)程序時(shí),要注意匯編源程序的特點(diǎn)不僅注意程序的邏輯上的正確,還要隨時(shí)和CPU的寄存器,內(nèi)存單元的狀態(tài)相聯(lián)系注意運(yùn)算位數(shù)的一致應(yīng)用舉例查表程序表達(dá)式程序基本結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)舉例例1:用查表法計(jì)算0~9的平方值分析:建立平方表,通過查表完成計(jì)算確定算法:表格是字節(jié)表,可以直接使用XLAT指令其它類型表格,關(guān)鍵是根據(jù)待查的值計(jì)算出所對(duì)應(yīng)的偏移地址畫流程圖內(nèi)存分配分配存放平方表的單元分配存放待查數(shù)據(jù)的單元分配存放查表結(jié)果的單元基本結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)舉例例1:用查表法計(jì)算0~9的平方值編寫程序:書P103例4-36注意幾點(diǎn)AH寄存器清0計(jì)算偏移地址時(shí)注意操作數(shù)位數(shù)一致提問如果采用XLAT指令,程序如何修改?如果要查的是0~9的立方表,內(nèi)存如何分配?程序如何修改?基本結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)舉例:例2:編寫計(jì)算(W-(X*Y+Z-200))/X的程序W、X、Y、Z都是16位有符號(hào)數(shù)(變量);結(jié)果的商存入RESULT、余數(shù)存入RESULT+2單元?;窘Y(jié)構(gòu)程序設(shè)計(jì)
MOV AX,X IMUL Y MOV CX,AX ;暫存32位乘積
MOV BX,DX MOV AX,Z CWD ;對(duì)Z進(jìn)行擴(kuò)展
ADD CX,AX ;加Z ADC BX,DX ;加進(jìn)位
SUB CX,220 ;減220 SBB BX,0 ;減借位
MOV AX,W CWD ;對(duì)W進(jìn)行擴(kuò)展
SUB AX,CX ;減低16位
SBB DX,BX ;減高16位
IDIV X MOV RESULT,AX ;存商
MOV RESULT+2,DX ;存余數(shù)有關(guān)程序段基本結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)基本思想:根據(jù)邏輯判斷的結(jié)果來形成程序的分支實(shí)現(xiàn)基本方法使用能設(shè)置狀態(tài)標(biāo)志的指令
(算數(shù)運(yùn)算邏輯、移位指令
CMP,TEST等)使用條件轉(zhuǎn)移指令實(shí)現(xiàn)分支
(條件滿足,改變走向,否則順序執(zhí)行)分支后,須匯合時(shí),使用無條件轉(zhuǎn)移指令基本結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)舉例例1:書P103例4-37例2:書P104例4-38例3:書P105例4-39基本結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)補(bǔ)充:多分支結(jié)構(gòu)的實(shí)現(xiàn)方法利用跳轉(zhuǎn)表實(shí)現(xiàn)分支將各分支程序的入口地址按照一定的順序存放在數(shù)據(jù)段內(nèi)存區(qū)域中根據(jù)一定的算法計(jì)算出分支程序地址在表中的位置,從而得到相應(yīng)的分支程序的入口地址使用間接轉(zhuǎn)移指令,轉(zhuǎn)去執(zhí)行該分支程序,從而實(shí)現(xiàn)了多個(gè)分支使用無條件轉(zhuǎn)移指令,跳轉(zhuǎn)到匯合點(diǎn)基本結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)補(bǔ)充:多分支結(jié)構(gòu)的實(shí)現(xiàn)方法舉例:根據(jù)鍵盤輸入0~9中任一數(shù)字,轉(zhuǎn)移到10個(gè)不同的分支程序,即實(shí)現(xiàn)多個(gè)分支的轉(zhuǎn)移數(shù)據(jù)段定義的地址表ADRTABDWR0,R1,R2,R3,R4,R5,R6,R7,R8,R9這里的R0~R9是程序中的10個(gè)標(biāo)號(hào)如果是段間轉(zhuǎn)移,則地址表中每個(gè)地址由兩個(gè)16位地址構(gòu)成,低16位是偏移地址,而高16位是轉(zhuǎn)移所到的段的段地址CSADRTAB DWOFFSETR0,SEGR0,OFFSETR1,…基本結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)補(bǔ)充:多分支結(jié)構(gòu)的實(shí)現(xiàn)方法程序段 MOV AH,01 INT 21H ;輸入一個(gè)字符
MOV AH,0 AND AL,0FH ;變?yōu)槎M(jìn)制數(shù)
ADD AL,AL ;AL*2 MOV BX,OFFSETADRTAB ;表首地址-〉BX
ADD BX,AX ;形成查表地址
JMP WORDPTR[BX] ;轉(zhuǎn)移到相應(yīng)標(biāo)號(hào)R0: ….R1: ….基本結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)兩種結(jié)構(gòu)形式“先執(zhí)行后判斷”(DO-UNTIL)循環(huán)體至少執(zhí)行一次;適用于循環(huán)次數(shù)已知的情況“先判斷后執(zhí)行”(DO-WHILE)循環(huán)體有可能一次也不執(zhí)行適用于循環(huán)次數(shù)未知,須根據(jù)條件真假來控制循環(huán)或?qū)崟r(shí)檢測(cè)到的狀態(tài)來控制循環(huán)的情況基本結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)組成循環(huán)初始化部分:用于對(duì)相關(guān)內(nèi)存單元及寄存器設(shè)置初始值例如設(shè)置地址指針、循環(huán)次數(shù)、某些標(biāo)志位等循環(huán)體:為要求重復(fù)執(zhí)行的程序段部分對(duì)應(yīng)于要求重復(fù)執(zhí)行的操作循環(huán)控制部分為下一輪處理修正地址指針及循環(huán)次數(shù)等判斷循環(huán)結(jié)束的條件是否滿足,若滿足則退出循環(huán)用計(jì)數(shù)控制循環(huán)、用條件控制循環(huán)等循環(huán)結(jié)束部分:用于保存循環(huán)運(yùn)行的結(jié)果等基本結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)舉例例1:書P107例4-40例2:書P108例4-41例3:書P109例4-42基本結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)舉例例1:書P107例4-40例2:書P108例4-41例3:書P109例4-42循環(huán)可嵌套當(dāng)循環(huán)體中的處理部分也是循環(huán)結(jié)構(gòu)時(shí),構(gòu)成循環(huán)嵌套應(yīng)用舉例軟件延時(shí)程序氣泡排序(簡單說明)基本結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)循環(huán)可嵌套應(yīng)用舉例軟件延時(shí)程序MOVBL,100DELAY:MOVCX,2801WW:LOOPWWDECBLJNZDELAY基本結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)把一些固定的、經(jīng)常使用的功能做成子程序(在8086/8088宏匯編中稱為過程)的形式使用該結(jié)構(gòu)源程序及目標(biāo)程序大大縮短,提高程序設(shè)計(jì)的效率和可靠性基本結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)主程序與子程序的連接子程序以過程的形式存放在代碼段;
過程名PROC[NEAR/FAR]
……. (子程序主體)
…….
過程名ENDP主程序與子程序的連接由CALL和RET指令來完成基本結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)現(xiàn)場的保護(hù)與恢復(fù)若子程序中要用到主程序已使用的某些寄存器或存儲(chǔ)單元,而這些內(nèi)容在子程序運(yùn)行后主程序還要繼續(xù)使用,則必須將它們壓入堆棧加以保護(hù)通常將PUSH和POP成對(duì)地安排子程序的開始和結(jié)束基本結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)主程序和子程序間的參數(shù)傳遞參數(shù)是主程序和子程序之間的數(shù)據(jù)通道入口參數(shù):子程序需從主程序獲取的參數(shù)出口參數(shù):子程序需返回給主程序的參數(shù)參數(shù)傳遞的方法利用寄存器:把所需傳遞的參數(shù)直接放在寄存器中特點(diǎn):簡單、快捷,但僅適合于參數(shù)較少的情況利用數(shù)據(jù)/代碼段存儲(chǔ)單元利用堆棧:把要傳遞的參數(shù)放在堆棧中適用于參數(shù)較多、子程序有嵌套及遞歸調(diào)用的情況基本結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)主程序和子程序間的參數(shù)傳遞利用寄存器舉例例1:書P111例4-43例2:求數(shù)組ARY中所有元素的和并存于SUM單元STACKSEGEMENTPARASTACK‘STACK’ DB100DUP(?)STACKENDSDAT SEGMENT ARYDB34,56H,89,32H,57,63H COUNTDB$-ARY SUM DW?DATENDS基本結(jié)構(gòu)程序設(shè)計(jì)CODSEGMENTASSUMECS:COD,DS:DATSTART:MOVAX,DAT MOVDS,AX LEASI,ARY MOVCX,COUNT CALLSUM1 MOVSUM,AX MOVAH,4CH INT21H;入口參數(shù)準(zhǔn)備,將需要的傳遞的參數(shù)送入寄存器,;子程序求和,返回值在AX中
SUM1PROCNEAR CMPCX,0 JZEXIT MOVAX,0AGAIN:ADDAL,[SI] ADCAH,0 INCSI LOOPAGAINEXIT:RETSUM1ENDPCODENDS ENDSTART;子程序名:SUM1;入口參數(shù):SI=數(shù)組首址,CX=數(shù)組長度出口參數(shù):AX=數(shù)組和基本結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)主程序和子程序間的參數(shù)傳遞使用數(shù)據(jù)存儲(chǔ)單元(1)CODSEGMENTASSUMECS:COD,DS:DATSTART:MOVAX,DAT MOVDS,AX CALLSUM1 MOVAH,4CH INT21H
SUM1PROCNEAR LEASI,ARY MOVCX,COUNT MOVAX,0AGAIN:ADDAL,[SI] ADCAH,0 INCSI LOOPAGAIN MOVSUM,AXRETSUM1ENDPCODENDS ENDSTART基本結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)主程序和子程序間的參數(shù)傳遞使用數(shù)據(jù)存儲(chǔ)單元(2)STACKSEGEMENTPARASTACK‘STACK’ DB100DUP(?)STACKENDSDAT SEGMENT ARY DB34,56H,89,32H,57,63H COUNTDB$-ARY SUM DW? TABLEDW3DUP(?) ;定義地址表DATENDS基本結(jié)構(gòu)程序設(shè)計(jì)CODSEGMENTASSUMECS:COD,DS:DATSTART:MOVAX,DATMOVDS,AX MOVTABLE,OFFSETARY MOVTABLE+2,OFFSETCOUNT MOVTABLE+4,OFFSETSUM ;參數(shù)地址送地址表
LEABX,TABLE ;地址表首址→BX CALLSUB1 MOVAH,4CH INT21H基本結(jié)構(gòu)程序設(shè)計(jì);子程序名:SUM1;入口參數(shù):BX為地址表首地址,參數(shù)地址在地址表中,;出口參數(shù):和在SUM單元中,;使用寄存器:AX,CX,BP,SI,DISUM1PROCNEAR PUSHAX
…… PUSHDI ;保護(hù)現(xiàn)場
MOVSI,[BX] ;數(shù)組首地址→SIMOVBP,[BX+2] ;數(shù)組長度單元地址→BP MOVCX,DS:[BP] ;數(shù)組長度→CX MOVDI,[BX+4] ;存儲(chǔ)和單元地址→DI MOVAX,0
…….. ;循環(huán)求和
MOV[DI],AX ;存儲(chǔ)和
POPDI
…… ;恢復(fù)現(xiàn)場
RET基本結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)主程序和子程序間的參數(shù)傳遞使用堆棧傳遞的方法在主程序中通過PUSH指令將要傳遞的參數(shù)送入堆棧,在子程序中從堆棧中適當(dāng)?shù)刂啡〕鰠?shù)現(xiàn)場保護(hù)后,被傳參數(shù)位于“高地址”,這時(shí)不能用POP指令彈出;可以使BP指向棧頂,以BP加位移量的形式指向參數(shù)所在的單元,再用MOV指令取出參數(shù)在使用BP前,一般都先將BP的值先送入堆棧保護(hù)基本結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)主程序和子程序間的參數(shù)傳遞使用堆棧傳遞的方法注意對(duì)于CALL指令是遠(yuǎn)調(diào)用還是近調(diào)用,取參數(shù)時(shí)使用的位移量的差別通過堆棧傳送參數(shù)的子程序結(jié)束時(shí),應(yīng)該使用RETn來退出子程序;其中的n是所傳送參數(shù)的數(shù)目的2倍舉例:例1:書P112例4-44例2:求數(shù)組ARY中所有元素的和并存于SUM單元基本結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)主程序和子程序間的參數(shù)傳遞使用數(shù)據(jù)存儲(chǔ)單元(2)STACKSEGEMENTPARASTACK‘STACK’ DB100DUP(?)STACKENDSDAT SEGMENT ARY DB34,56H,89,32H,57,63H COUNTDB$-ARY SUM DW?DATENDS基本結(jié)構(gòu)程序設(shè)計(jì)COD1SEGMENT ASSUMECS:COD,DS:DATSTART:MOVAX,DAT MOVDS,AX LEABX,ARY PUSHBX ;地址參數(shù)1進(jìn)棧
LEABX,COUNT PUSHBX ;地址參數(shù)2進(jìn)棧
LEABX,SUM PUSHBX ;地址參數(shù)3進(jìn)棧
CALLSUB1 ;段間調(diào)用,求和
MOVAH,4CH INT21H基本結(jié)構(gòu)程序設(shè)計(jì);子程序名:SUB1,功能:求數(shù)組和;入口參數(shù):數(shù)組,數(shù)組長度及存和單元的地址在棧中;出口參數(shù):和在SUM單元中;使用的寄存器:AX,BX,CX,BPSUB1PROCFAR PUSHAX PUSHBX PUSHCX PUSHBP MOVBP,SP MOVBX,[BP+14] MOVCX,[BX] MOVBX,[BP+12] MOVSI,[BP+16] MOVAX,0AD1:ADDAX,[SI]ADDSI,2LOOPAD1MOV[BX],AXPOPBPPOPCXPOPBXPOPAXRET6SUB1 ENDPCOD1 ENDS ENDSTART基本結(jié)構(gòu)程序設(shè)計(jì)子程序結(jié)構(gòu)子程序嵌套與子程序遞歸調(diào)用子程序嵌套:一個(gè)子程序可以調(diào)用另一個(gè)子程序;嵌套的層次稱為嵌套深度,它只受堆棧空間的限制;子程序遞歸調(diào)用如果一個(gè)子程序調(diào)用的子程序就是它本身,稱這種調(diào)用為遞歸調(diào)用;舉例:書P114例4-45數(shù)據(jù)的輸入與輸出(DOS功能調(diào)用)
數(shù)據(jù)的輸入與輸出在顯示器上看到程序運(yùn)行的結(jié)果從鍵盤上輸入一些程序所需的數(shù)據(jù)方法BIOS調(diào)用舉例:MOVAH,1INT16H執(zhí)行后會(huì)設(shè)置零標(biāo)志位(ZF):若ZF=1,則無鍵盤輸入;否則ZF清0,且AL中含所鍵入字符的ASCII碼數(shù)據(jù)的輸入與輸出(DOS功能調(diào)用)
方法DOS功能調(diào)用DOS為編程人員提供豐富的服務(wù)程序,這些服務(wù)程序用戶在編程時(shí),可以直接調(diào)用;DOS提供的這些服務(wù)程序就稱為DOS功能調(diào)用DOS功能使用起來很簡單所有的功能調(diào)用都是通過軟中斷指令實(shí)現(xiàn)的INT21H稱為系統(tǒng)功能調(diào)用DOS功能的使用在AH寄存器中設(shè)置系統(tǒng)功能調(diào)用號(hào);在指定寄存器中設(shè)置入口參數(shù);執(zhí)行指令I(lǐng)NT21H;根據(jù)出口參數(shù)分析功能調(diào)用執(zhí)行的情況數(shù)據(jù)的輸入與輸出(DOS功能調(diào)用)
DOS功能調(diào)用字符(串)輸入/輸出DOS功能調(diào)用輸入單個(gè)字符DOS功能號(hào):01H;出口參數(shù):AL=所輸入字符的ASCII碼;功能:等待用戶從鍵盤輸入一個(gè)字符,輸入字符后返回。同時(shí)在屏幕上顯示所輸入的字符。如按Ctrl-Break或Ctrl-C則退出舉例:MOVAH,1INT21H數(shù)據(jù)的輸入與輸出(DOS功能調(diào)用)
DOS功能調(diào)用字符(串)輸入/輸出DOS功能調(diào)用輸入字符串DOS功能號(hào):0AH入口參數(shù):DS:DX指向字符串緩沖區(qū)首地址,該緩沖區(qū)的第1字節(jié)須填入最多欲接收的字符個(gè)數(shù)(包括回車字符);出口參數(shù):前述緩沖區(qū)的第2字節(jié)將存放實(shí)際輸入的字符個(gè)數(shù)(不包括回車符);第3字節(jié)開始將存放輸入的字符串。實(shí)際輸入的字符數(shù)多于所定義的數(shù)時(shí),多出的字符被丟掉,且響鈴執(zhí)行該功能調(diào)用時(shí),等待用戶按鍵輸入字符,字符串輸入以回車結(jié)束數(shù)據(jù)的輸入與輸出(DOS功能調(diào)用)
DOS功能調(diào)用字符(串)輸入/輸出DOS功能調(diào)用輸出單個(gè)字符舉例:定義緩沖區(qū)BUFFERDB81 DB0 DB81DUP(0)MOVDX,OFFSETBUFFERMOVAH,0AHINT21H數(shù)據(jù)的輸入與輸出(DOS功能調(diào)用)
DOS功能調(diào)用字符(串)輸入/輸出DOS功能調(diào)用顯示單個(gè)字符DOS功能號(hào):02H入口參數(shù):DL=待顯示字符的ASCII碼功能:在顯示器當(dāng)前光標(biāo)位置顯示給定的字符,且光標(biāo)右移一個(gè)字符位置。如果按Ctrl-Break或Ctrl-C則退出舉例:MOVAH,02HMOVDL,’?’INT21H數(shù)據(jù)的輸入與輸出(DOS功能調(diào)用)
DOS功能調(diào)用字符(串)輸入/輸出DOS功能調(diào)用顯示字符串DOS功能號(hào):09H入口參數(shù):DS:DX指向字符串在內(nèi)存中的首地址,要求字符串以$(24H)結(jié)束;功能:在顯示器上輸出指定的字符串舉例:定義字符串STRINGDB‘hello!’,0DH,0AH,’$’MOVAH,09HMOVDX,OFFSETSTRINGINT21H數(shù)據(jù)的輸入與輸出(DOS功能調(diào)用)DOS功能調(diào)用字符(串)輸入/輸出DOS功能調(diào)用顯示字符串舉例:編寫字符串處理程序,找字符串中的第一個(gè)非空格字符,并去掉字符串的前導(dǎo)空格。分別顯示原字符串和處理后的字符串?dāng)?shù)據(jù)的輸入與輸出(DOS功能調(diào)用)數(shù)據(jù)段: DATASEGMENT stringDB‘a(chǎn)bcdefghij’,‘$’ COUNEQU$-string str2DBCOUNTDUP(?) str3DB0dh,0ah,’$’ DATAENDS數(shù)據(jù)的輸入與輸出(DOS功能調(diào)用)部分程序代碼:LEA DI,stringMOV CX,COUNTMOV AL,’’REPE SCASBINC CXMOV BX,COUNTSUB BX,CXLEA DI,str2LEA SI,stringADD SI,BXREP MOVSBLEA DX,stringMOV AH,9INT 21HLEA DX,str3MOV AH,9INT 21HLEA DX,str2MOV AH,9INT 21H數(shù)據(jù)的輸入與輸出(DOS功能調(diào)用)
DOS功能調(diào)用磁盤輸入輸出功能調(diào)用書P118表4-7-1舉例:書P118例4-50程序結(jié)束返回DOSINT20HMOVAH,4CHINT21H高級(jí)匯編語言技術(shù)
宏匯編若程序中經(jīng)常要用到一個(gè)程序段,可以將其定義成一條宏指令(宏定義)在源程序中可用這條宏指令代替所定義的程序段(宏調(diào)用)當(dāng)匯編程序處理到宏指令時(shí),會(huì)自動(dòng)用宏體代換它而擴(kuò)展成原來的程序段(宏擴(kuò)展)用途:簡化源程序書寫,接收參數(shù)能力強(qiáng),功能更
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同管理制度職責(zé)
- 農(nóng)業(yè)科技園區(qū)規(guī)劃設(shè)計(jì)與運(yùn)營管理手冊(cè)
- 2025年毫州考從業(yè)資格證貨運(yùn)試題
- 家政公司家政服務(wù)合同
- 建筑鋼筋班組合同8篇
- 購銷合同格式
- 房屋代理出租合同
- 建繼續(xù)教育建設(shè)工程合同管理
- 2025年景德鎮(zhèn)貨運(yùn)從業(yè)資格證考試試題及答案
- 第07講 文言文翻譯 講義 中考語文復(fù)習(xí)
- 2024-2025學(xué)年八年級(jí)地理下冊(cè)第七章《南方地區(qū)》檢測(cè)卷(人教版)
- 2025年湖南鐵路科技職業(yè)技術(shù)學(xué)院單招職業(yè)技能測(cè)試題庫參考答案
- 《ISO 56000-2025創(chuàng)新管理 基礎(chǔ)和術(shù)語》之1:“引言+范圍+術(shù)語和定義”專業(yè)深度解讀與應(yīng)用指導(dǎo)材料(雷澤佳編寫2025A0)-1-150
- DB37-T4817-2025 瀝青路面就地冷再生技術(shù)規(guī)范
- 2025年公共營養(yǎng)師三級(jí)理論試題及答案
- 提高設(shè)備基礎(chǔ)預(yù)埋螺栓一次安裝合格率
- 煤礦防治水安全質(zhì)量標(biāo)準(zhǔn)化評(píng)分表
- 2024年科技節(jié)小學(xué)科普知識(shí)競賽題及答案(共100題)
- 2025年度教育培訓(xùn)機(jī)構(gòu)學(xué)生綜合素質(zhì)評(píng)價(jià)協(xié)議3篇
- 氧氣管道吹掃、打壓方案
- 第28課 改革開放和社會(huì)主義現(xiàn)代化建設(shè)的巨大成就 教學(xué)設(shè)計(jì)(表格式)必修 中外歷史綱要(上)
評(píng)論
0/150
提交評(píng)論