




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第 五 章 高 級 匯 編 語 言 程 序 設 計封面第 五 章 高 級 匯 編 語 言 程 序 設 計第五章高級匯編語言程序設計 第五章第五章 高級匯編語言程序設計高級匯編語言程序設計 5.1 5.1 高級語言特性高級語言特性 5.2 5.2 宏結構程序設計宏結構程序設計 5.3 5.3 模塊化程序設計模塊化程序設計 5.4 5.4 輸入輸出程序設計輸入輸出程序設計 本章重點及習題分析本章重點及習題分析第 五 章 高 級 匯 編 語 言 程 序 設 計5.1 高級語言特性5.1 5.1 高級語言特性高級語言特性通過引入一些偽指令,使匯編語言程序設計具有高通過引入一些偽指令,使匯編語言程序設計
2、具有高級語言程序設計的特性,即可以采用類似高級語言的形級語言程序設計的特性,即可以采用類似高級語言的形式設計分支、循環(huán)和子程序結構,大大減輕了使用匯編式設計分支、循環(huán)和子程序結構,大大減輕了使用匯編語言編程的工作量。語言編程的工作量。 5.1.1 5.1.1 條件控制偽指令條件控制偽指令 5.1.2 5.1.2 循環(huán)控制偽指令循環(huán)控制偽指令 5.1.3 5.1.3 過程聲明和調(diào)用偽指令過程聲明和調(diào)用偽指令第 五 章 高 級 匯 編 語 言 程 序 設 計5.1.1 條件控制偽指令 5.1.1 5.1.1 條件控制偽指令條件控制偽指令 .IF/.ELSEIF/.ELSE/.ENDIF:.IF/.
3、ELSEIF/.ELSE/.ENDIF:類似高級語言的類似高級語言的IF/THINIF/THIN,ELSEELSE和和ENDIFENDIF的相應功能。匯編時展開,自動的相應功能。匯編時展開,自動生成相應的比較和條件轉移指令,實現(xiàn)分支結構。生成相應的比較和條件轉移指令,實現(xiàn)分支結構。 .IF .IF 條件表達式條件表達式 ;條件為真,執(zhí)行分支體條件為真,執(zhí)行分支體1 1 分支體分支體1 1 .ELSEIF .ELSEIF 條件表達式條件表達式 ;前面前面IFIF及前面及前面ELSEIFELSEIF為假,為假, 分支體分支體2 2 ;當前條件為真,執(zhí)行分支體當前條件為真,執(zhí)行分支體2 2 .ELS
4、E .ELSE ;前面前面IFIF及前面及前面ELSEIFELSEIF為假,為假, 分支體分支體3 3 ;執(zhí)行分支體執(zhí)行分支體3 3 .ENDIF .ENDIF ;分支結束分支結束第 五 章 高 級 匯 編 語 言 程 序 設 計條件控制偽指令不考慮多層嵌套,有不考慮多層嵌套,有4 4種基本格式種基本格式 .IF .IF 條件表達式條件表達式 ;條件表達式為真,執(zhí)行條件表達式為真,執(zhí)行 分支體分支體 ;分支體,否則執(zhí)行后面分支體,否則執(zhí)行后面 .ENDIF .ENDIF ;語句語句 .IF .IF 條件表達式條件表達式 分支體分支體1 1 .ELSE .ELSE 分支體分支體2 2 .ENDI
5、F .ENDIF ;分支體分支體1 1、2 2必做其一必做其一1.2.第 五 章 高 級 匯 編 語 言 程 序 設 計條件控制偽指令 .IF .IF 條件表達式條件表達式 分支體分支體1 1 .ELSEIF .ELSEIF 條件表達式條件表達式 分支體分支體2 2 ;分支體分支體1 1和分支體和分支體2 2可能可能 .ENDIF.ENDIF ;都不做都不做 .IF .IF 條件表達式條件表達式 ;條件為真,執(zhí)行分支體條件為真,執(zhí)行分支體1 1 分支體分支體1 1 .ELSEIF .ELSEIF 條件表達式;條件表達式;前面前面IFIF及前面及前面ELSEIFELSEIF, 分支體分支體2 2
6、 ;為假當前條件為真,執(zhí)行分支體為假當前條件為真,執(zhí)行分支體2 2 .ELSE .ELSE ;前面前面IFIF及前面及前面ELSEIFELSEIF為假,為假, 分支體分支體3 3 ;執(zhí)行分支體執(zhí)行分支體3 3 .ENDIF .ENDIF ;分支結束分支結束3.4.第 五 章 高 級 匯 編 語 言 程 序 設 計條件表達式的三個問題 三個問題:三個問題: 1.1.關于條件表達式中的操作符關于條件表達式中的操作符2.2.條件表達式舉例條件表達式舉例3.3.條件表達式中的有符號數(shù)和無符號數(shù)的規(guī)定條件表達式中的有符號數(shù)和無符號數(shù)的規(guī)定第 五 章 高 級 匯 編 語 言 程 序 設 計1.關于條件表達
7、式中的操作符 1. 1.關于條件表達式中的操作符關于條件表達式中的操作符 1 1)表)表5.15.1列出的操作符用于偽指令的條件表達式,列出的操作符用于偽指令的條件表達式,第三章介紹的操作符用于數(shù)值表達式和地址表達式第三章介紹的操作符用于數(shù)值表達式和地址表達式(構成指令的操作數(shù)),兩類操作符不可混淆。例如(構成指令的操作數(shù)),兩類操作符不可混淆。例如表示相等,條件表達式用表示相等,條件表達式用“=”=”,數(shù)值表達式用,數(shù)值表達式用“EQ”EQ”;表示邏輯與,條件表達式用表示邏輯與,條件表達式用“&”,&”,數(shù)值表達式用數(shù)值表達式用ANDAND。 2 2)操作符可分為:比較、邏輯
8、運算和測試三類,)操作符可分為:比較、邏輯運算和測試三類,其中測試又可分為:標志測試、位測試、寄存器測試、其中測試又可分為:標志測試、位測試、寄存器測試、存儲單元測試(存儲單元測試(regmemregmem)。)。 3 3)操作符中,單目操作符為!、標志測試、寄存器)操作符中,單目操作符為!、標志測試、寄存器測試和存儲單元測試,其他都是雙目操作符。測試和存儲單元測試,其他都是雙目操作符。 4 4)操作符的優(yōu)先級可用圓括號規(guī)定。)操作符的優(yōu)先級可用圓括號規(guī)定。第 五 章 高 級 匯 編 語 言 程 序 設 計2.條件表達式舉例/1 2. 2.條件表達式舉例條件表達式舉例n reg reg ; ;
9、寄存器不為寄存器不為0 0,條件為真;為,條件為真;為0 0,條件為假,條件為假 .if al.if al dec al dec al .endif .endif n mem mem ; ;存儲器不為存儲器不為0 0,條件為真;為,條件為真;為0 0,條件為假,條件為假 .if byte ptrbx.if byte ptrbx dec al dec al .endif .endifn carry?carry? / / overflow?overflow? n 位測試操作符使用格式:位測試操作符使用格式: 數(shù)值表達式數(shù)值表達式 & & 位數(shù)位數(shù) 如如 “ “AL & 5”
10、,AL & 5”,測試測試ALAL寄存器的寄存器的 D5D5。第 五 章 高 級 匯 編 語 言 程 序 設 計 /2n reg OP regreg OP reg ;OPOP為表為表5.15.1中任意雙目操作符中任意雙目操作符 ax=bx / al=bl / al & bl ax=bx / al=bl / al & bl n reg OP memreg OP memn reg OP reg OP 立即數(shù)立即數(shù)n mem OP mem OP 立即數(shù)立即數(shù)n 單目操作符單目操作符?。嚎梢苑旁谇笆鋈我獗磉_式前面,測:可以放在前述任意表達式前面,測 試相反條件試相反條件 !re
11、greg ; ;寄存器不為寄存器不為0 0,條件為假;為,條件為假;為0 0,條件為真,條件為真 注釋:注釋:1 1)條件控制偽指令不支持數(shù)值表達式,如)條件控制偽指令不支持數(shù)值表達式,如 .if (x+1)=5.if (x+1)=dx)(ax=bx)&(cx=dx)。第 五 章 高 級 匯 編 語 言 程 序 設 計3.條件表達式中的符號數(shù)/1 3.3.條件表達式中比較的兩個數(shù)據(jù)可能是無符號數(shù),條件表達式中比較的兩個數(shù)據(jù)可能是無符號數(shù),也可能是有符號數(shù),可分成以下情況:也可能是有符號數(shù),可分成以下情況:v 數(shù)據(jù)為變量:用數(shù)據(jù)為變量:用DBDB、DWDW、DDDD等定義的變量一律作等定
12、義的變量一律作為無符號數(shù),若需要進行有符號數(shù)比較,為無符號數(shù),若需要進行有符號數(shù)比較,必須使用必須使用SBYTESBYTE、SWORDSWORD、SDWORDSDWORD定義。定義。v 數(shù)據(jù)為寄存器或存儲單元:默認為無符號數(shù),若數(shù)據(jù)為寄存器或存儲單元:默認為無符號數(shù),若需要進行有符號數(shù)比較,必須使用操作符需要進行有符號數(shù)比較,必須使用操作符SBYTE PTRSBYTE PTR或或SWORD PTRSWORD PTR指明類型。指明類型。SBYTE PTR BXSBYTE PTR BXSBYTE PTR BX+SI+DISPSBYTE PTR BX+SI+DISPVar db 1 var sbyt
13、e 1Var db 1 var sbyte 1.If alsbyte ptr var .if alvar.If alsbyte ptr var .if al= AX.IF SWORD PTR BX = AX,AXAX被強制作為被強制作為有符號數(shù)看待。有符號數(shù)看待。 (對變量不適用。若變量作為有符號數(shù)使用,(對變量不適用。若變量作為有符號數(shù)使用, 必須用必須用sbyte/sword/sdwordsbyte/sword/sdword定義)定義)第 五 章 高 級 匯 編 語 言 程 序 設 計條件控制偽指令(end)6 6)本節(jié)新增內(nèi)容:)本節(jié)新增內(nèi)容:用于條件表達式的操作符用于條件表達式的操作符
14、有符號數(shù)專用的變量定義偽指令有符號數(shù)專用的變量定義偽指令有符號數(shù)專用的類型說明操作符有符號數(shù)專用的類型說明操作符分析教材舉例分析教材舉例瀏覽匯編結果瀏覽匯編結果例題例題5.1(5.1(實根判斷)實根判斷)第 五 章 高 級 匯 編 語 言 程 序 設 計5.1.2循環(huán)控制偽指令5.1.25.1.2循環(huán)控制偽指令循環(huán)控制偽指令 .WHILE.WHILE和和 .ENDW .ENDW :當型循環(huán)結構:當型循環(huán)結構 .REPEAT.REPEAT和和 .UNTIL/.REPEAT.UNTIL/.REPEAT和和 .UNTILCXZ.UNTILCXZ:直到型:直到型 .BREAK.BREAK:退出循環(huán);:
15、退出循環(huán);.CONTINUE .CONTINUE :轉向循環(huán)體開始:轉向循環(huán)體開始 格式格式 1 1.WHILE 條件表達式條件表達式;表達式為真,執(zhí)行循環(huán)體;表達式為真,執(zhí)行循環(huán)體 循環(huán)體循環(huán)體 ; .ENDW ;循環(huán)體結束;循環(huán)體結束第 五 章 高 級 匯 編 語 言 程 序 設 計循環(huán)控制偽指令 格式格式 2 2 .REPEAT ;重復執(zhí)行循環(huán)體;重復執(zhí)行循環(huán)體 循環(huán)體循環(huán)體 .UNTIL 條件表達式條件表達式 ;直到條件表達式為真;直到條件表達式為真 格式格式 3 3 .REPEAT ;重復執(zhí)行循環(huán)體;重復執(zhí)行循環(huán)體 循環(huán)體循環(huán)體 .UNTILCXZ 條件表達式條件表達式 ;CXCX-
16、1CXCX-1,直到,直到CX=0CX=0 ;或條件表達式結果為真;或條件表達式結果為真第 五 章 高 級 匯 編 語 言 程 序 設 計循環(huán)控制偽指令注注 釋:對釋:對.REPEAT/.UNTILCXZ(.REPEAT/.UNTILCXZ(條件表達式)條件表達式) 1 1)不帶表達式,結束循環(huán)的條件為)不帶表達式,結束循環(huán)的條件為CX-1CX-1減到減到0 0,循環(huán)控制被匯編為循環(huán)控制被匯編為LOOPLOOP指令。指令。2 2)帶條件表達式,結束循環(huán)的條件為)帶條件表達式,結束循環(huán)的條件為CXCX減到減到0 0 或或表達式為真,表達式只能比較寄存器與寄存器(存儲單表達式為真,表達式只能比較寄
17、存器與寄存器(存儲單元、常數(shù)),以及存儲單元與常數(shù)相等(元、常數(shù)),以及存儲單元與常數(shù)相等(=)或不等)或不等(?。?!= =),所以,匯編后的指令為),所以,匯編后的指令為LOOPELOOPE或或LOOPNELOOPNE。 分析教材舉例分析教材舉例 瀏覽匯編結果瀏覽匯編結果例題例題 5.25.2:求數(shù)組前若干非負數(shù)之和:求數(shù)組前若干非負數(shù)之和。 瀏覽例題瀏覽例題5.25.2匯編結果匯編結果第 五 章 高 級 匯 編 語 言 程 序 設 計5.1.3過程聲明和調(diào)用偽指令5.1.2 5.1.2 過程聲明和過程調(diào)用偽指令過程聲明和過程調(diào)用偽指令利用堆棧傳遞參數(shù)為常用方式,但傳統(tǒng)的編程方法利用堆棧傳遞
18、參數(shù)為常用方式,但傳統(tǒng)的編程方法容易出錯。容易出錯。MASM6.XMASM6.X擴充了擴充了PROCPROC偽指令的功能,并新增了偽指令的功能,并新增了幾條偽指令,使調(diào)用子程序具有高級語言的特性。幾條偽指令,使調(diào)用子程序具有高級語言的特性。按使用順序介紹:按使用順序介紹:1.1.過程聲明過程聲明 PROTOPROTO過程名過程名 PROTO PROTO 語言類型語言類型 ,參數(shù)名參數(shù)名:類型類型,注釋:注釋:1 1)使用帶參數(shù)的過程調(diào)用,必須定義語言)使用帶參數(shù)的過程調(diào)用,必須定義語言類型,一般用類型,一般用C C或或STDCALLSTDCALL。2 2)參數(shù)必須用逗號打頭;)參數(shù)必須用逗號打
19、頭;多個參數(shù)之間用逗號分割。多個參數(shù)之間用逗號分割。3 3)參數(shù)名可省略,類型不)參數(shù)名可省略,類型不可省略??墒÷?。例例5.3 5.3 CHECKSUMD PROTO C ,V1:WORD,V2:WORDCHECKSUMD PROTO C ,V1:WORD,V2:WORD第 五 章 高 級 匯 編 語 言 程 序 設 計過程定義格式2.2.過程定義過程定義PROCPROC 過程名過程名 PROC PROC 語言類型語言類型 USES USES 寄存器列表寄存器列表 , , 形參形參1:1:類型類型, ,形參形參2:2:類型類型 LOCAL LOCAL 參數(shù)表參數(shù)表 過程名過程名 ENDPEN
20、DP注釋:注釋:1 1)語言類型與)語言類型與 USES USES 之間用空格分割。之間用空格分割。 2 2)寄存器列表:用空格分割的通用寄存器,決定)寄存器列表:用空格分割的通用寄存器,決定保護現(xiàn)場和恢復現(xiàn)場。保護現(xiàn)場和恢復現(xiàn)場。3 3)參數(shù)用逗號打頭,且用逗號分割;參數(shù)名為形)參數(shù)用逗號打頭,且用逗號分割;參數(shù)名為形參名,調(diào)用時被實參替換。參名,調(diào)用時被實參替換。4 4)如果過程用到局部變量,用)如果過程用到局部變量,用LOCALLOCAL偽指令定義。偽指令定義。第 五 章 高 級 匯 編 語 言 程 序 設 計幾個可選項的說明 過程定義中其他幾個可選項的說明:過程定義中其他幾個可選項的說
21、明:1 1)調(diào)用距離:為)調(diào)用距離:為NEARNEAR或或FARFAR,簡化段定義格式中,由,簡化段定義格式中,由 .model.model語句選擇的存儲模式?jīng)Q定,語句選擇的存儲模式?jīng)Q定,smallsmall模式下,調(diào)模式下,調(diào) 用距離為用距離為NEARNEAR。可省略。可省略。2 2)作用范圍:為)作用范圍:為PUBLICPUBLIC、PRIVATEPRIVATE等,表示該過程是否等,表示該過程是否 對其他模塊可見(可引用)。默認為對其他模塊可見(可引用)。默認為PUBLICPUBLIC,表示,表示 該過程其他模塊可見(可引用)??墒÷浴T撨^程其他模塊可見(可引用)??墒÷?。3 3)起始參數(shù)
22、:是一個可帶參數(shù)的宏的名字。該宏決定)起始參數(shù):是一個可帶參數(shù)的宏的名字。該宏決定 過程的起始代碼和結束代碼,例如控制參數(shù)如何設過程的起始代碼和結束代碼,例如控制參數(shù)如何設 置、如何保存寄存器等。置、如何保存寄存器等。MASMMASM調(diào)用的宏由用戶自行調(diào)用的宏由用戶自行 定義??墒÷?。定義??墒÷浴5?五 章 高 級 匯 編 語 言 程 序 設 計過程定義舉例例例5.3 5.3 過程定義過程定義 checksumd PROC c USES bx cx ,countp : word ,arryp : wordmov bx,arrypmov cx,countp retchecksumd ENDP語
23、言類型語言類型寄存器列表寄存器列表形參、形參類型形參、形參類型第 五 章 高 級 匯 編 語 言 程 序 設 計過程調(diào)用 3.3.過程調(diào)用偽指令過程調(diào)用偽指令 INVOKEINVOKE 過程名過程名 ,實參,實參1 1,實參,實參2 2, INVOKE checksumd ,count ,offset array調(diào)用時:調(diào)用時: 實參用逗號打頭,且用逗號分隔。實參用逗號打頭,且用逗號分隔。 實參實參1 1替換形參替換形參1 1,實參,實參2 2替換形參替換形參2 2。 例題例題5.35.3源程序(語言類型:源程序(語言類型:C C) 例題例題5.35.3匯編結果匯編結果 例題例題5.3a5.3
24、a源程序(語言類型:源程序(語言類型:STDCALLSTDCALL) 例題例題5.3a5.3a匯編結果匯編結果第 五 章 高 級 匯 編 語 言 程 序 設 計過程定義的說明(end) 幾點幾點說明:說明: 如果在過程中使用參數(shù),必須指定語言類型。如果在過程中使用參數(shù),必須指定語言類型。 如果在如果在 .MODEL.MODEL語句中和過程定義中都沒有指定語句中和過程定義中都沒有指定語言類型,會產(chǎn)生匯編錯誤。語言類型,會產(chǎn)生匯編錯誤。 如果在如果在 .MODEL.MODEL語句中指定了語言類型,則過程語句中指定了語言類型,則過程聲明和過程定義中可以省略語言類型。聲明和過程定義中可以省略語言類型。
25、 .MODEL SMALL.MODEL SMALL,C C ;指定了;指定了C C語言類型語言類型 過程定義和過程聲明必須一致。如編程過程中修過程定義和過程聲明必須一致。如編程過程中修改了一個,忘記修改另一個,則會造成錯誤。為避免此改了一個,忘記修改另一個,則會造成錯誤。為避免此種情況發(fā)生,可以把全部過程定義放在代碼段內(nèi)開始的種情況發(fā)生,可以把全部過程定義放在代碼段內(nèi)開始的部分(部分(.STARTUP.STARTUP之前),而省略過程聲明。之前),而省略過程聲明。第 五 章 高 級 匯 編 語 言 程 序 設 計5.2宏結構程序設計5.25.2宏結構程序設計宏結構程序設計對常用的、具有獨立功能
26、的程序段,除了可定義為對常用的、具有獨立功能的程序段,除了可定義為過程外,還可定義為宏結構或宏指令。宏指令提供了簡過程外,還可定義為宏結構或宏指令。宏指令提供了簡化程序設計的另一種方法?;绦蛟O計的另一種方法。 通常與宏指令配合使用的偽指令還有重復匯編和條通常與宏指令配合使用的偽指令還有重復匯編和條件匯編。宏指令、重復匯編和條件匯編統(tǒng)稱宏結構。件匯編。宏指令、重復匯編和條件匯編統(tǒng)稱宏結構。 本節(jié)介紹宏指令的定義和調(diào)用,以及重復匯編和條本節(jié)介紹宏指令的定義和調(diào)用,以及重復匯編和條件匯編。件匯編。 5.2.1 5.2.1 宏匯編宏匯編 5.2.2 5.2.2 重復匯編重復匯編 5.2.3 5.2.
27、3 條件匯編條件匯編第 五 章 高 級 匯 編 語 言 程 序 設 計5.2.1 宏匯編 宏的定義和調(diào)用 5.2.1 5.2.1 宏匯編宏匯編1.1.宏的定義和調(diào)用、宏展開宏的定義和調(diào)用、宏展開宏定義宏定義宏名宏名 MACRO 形參形參1 1,形參,形參2 2, 宏定義體;指令語句的組合宏定義體;指令語句的組合 ENDM宏調(diào)用宏調(diào)用 宏名宏名 實參實參1 1,實參,實參2 2, 例題例題5.4a+5.4b5.4a+5.4b第 五 章 高 級 匯 編 語 言 程 序 設 計宏展開 宏展開宏展開 匯編時,用宏體取代宏調(diào)用,用實參取代形參,匯編時,用宏體取代宏調(diào)用,用實參取代形參, 稱為宏展開。稱為
28、宏展開。v宏展開時,實參替代形參按位置匹配的原則。宏展開時,實參替代形參按位置匹配的原則。v實參與形參的個數(shù)可以不等,參數(shù)替換時,多余實參與形參的個數(shù)可以不等,參數(shù)替換時,多余的實參不于考慮;多余的形參以空格替代。的實參不于考慮;多余的形參以空格替代。v實參替代形參時,不進行類型檢查,完全是字符實參替代形參時,不進行類型檢查,完全是字符串的替代,替代后是否合法有效,由匯編程序翻串的替代,替代后是否合法有效,由匯編程序翻譯時進行語法檢查。譯時進行語法檢查。 宏展開后宏展開后5.4B5.4B第 五 章 高 級 匯 編 語 言 程 序 設 計宏的參數(shù)及宏操作符 2.2.宏的參數(shù)宏的參數(shù) 參數(shù)的形式靈
29、活多變,可以是常數(shù)、變量、存儲參數(shù)的形式靈活多變,可以是常數(shù)、變量、存儲單元、指令操作碼或它們的一部分,也可以是表達式,單元、指令操作碼或它們的一部分,也可以是表達式,使用靈活多變的參數(shù),同一個宏定義甚至可以執(zhí)行不使用靈活多變的參數(shù),同一個宏定義甚至可以執(zhí)行不同的操作。同的操作。v幾個宏操作符幾個宏操作符: :替換操作符:用于將參數(shù)與其他字符分開。用替換操作符:用于將參數(shù)與其他字符分開。用在宏體中。如果參數(shù)緊接在其他字符之前或之后,在宏體中。如果參數(shù)緊接在其他字符之前或之后, 或者參數(shù)出現(xiàn)在帶引號的字符串中,就必須使用或者參數(shù)出現(xiàn)在帶引號的字符串中,就必須使用該偽操作符該偽操作符第 五 章 高
30、 級 匯 編 語 言 程 序 設 計宏操作符: :字符串傳遞操作符字符串傳遞操作符: :用在宏調(diào)用的實參中。用在宏調(diào)用的實參中。 在宏調(diào)用中,如果傳遞的字符串實參數(shù)含在宏調(diào)用中,如果傳遞的字符串實參數(shù)含 有逗號、空格等間隔符號,則必須用這對有逗號、空格等間隔符號,則必須用這對 操作符,以保證字符串的完整操作符,以保證字符串的完整!: :轉義操作符轉義操作符: :指示其后的一個字符作為一般指示其后的一個字符作為一般 字符,無特殊意義。如字符,無特殊意義。如 !/!&!/!&: :表達式操作符表達式操作符: :將后面跟的表達式的值作為將后面跟的表達式的值作為 實參,而不是將表達式本
31、身作為參數(shù)。用在實參,而不是將表達式本身作為參數(shù)。用在 實參中。實參中。;: :宏注釋符,用于表示在宏定義中的注釋。采宏注釋符,用于表示在宏定義中的注釋。采 用這個符號的注釋,在宏展開時不出現(xiàn)用這個符號的注釋,在宏展開時不出現(xiàn)“:REQ、:=默認值默認值”可參考可參考宏匯編大全宏匯編大全第 五 章 高 級 匯 編 語 言 程 序 設 計與宏有關的偽指令13.3.與宏有關的偽指令與宏有關的偽指令局部標號偽指令局部標號偽指令LOCAL LOCAL 標號列表標號列表;當宏定義體內(nèi)有標號,同一程;當宏定義體內(nèi)有標號,同一程序內(nèi)多次調(diào)用,會造成標號的重復定義。序內(nèi)多次調(diào)用,會造成標號的重復定義。用用LO
32、CALLOCAL說明的標號,第一次宏展開時,產(chǎn)生的標說明的標號,第一次宏展開時,產(chǎn)生的標號為號為?0000?0000,第二次宏展開時產(chǎn)生的標號為,第二次宏展開時產(chǎn)生的標號為?0001?0001,(?ffff)(?ffff) 注釋:注釋:只能在宏體內(nèi)使用。只能在宏體內(nèi)使用。 只能緊接在宏定義語句之后使用。只能緊接在宏定義語句之后使用。第 五 章 高 級 匯 編 語 言 程 序 設 計與宏有關的偽指令2如宏定義:如宏定義:ABSOL MACRO OPRDABSOL MACRO OPRD LOCAL NEXT LOCAL NEXT CMP OPRD CMP OPRD,0 0 JGE NEXT JGE
33、 NEXT NEG OPRD NEG OPRD NEXTNEXT: ENDMENDM宏調(diào)用宏調(diào)用1 1:ABSOL WORD PTR BXABSOL WORD PTR BX宏調(diào)用宏調(diào)用2: ABSOL BX2: ABSOL BX第 五 章 高 級 匯 編 語 言 程 序 設 計與宏有關的偽指令3宏展開后的代碼:宏展開后的代碼:CMP WORD PTRBXCMP WORD PTRBX,0 0JGE ?0000JGE ?0000NEG WORD PTRBXNEG WORD PTRBX?0000:?0000:CMP BX,0CMP BX,0JGE ?0001JGE ?0001NEG BXNEG BX
34、?0001:?0001:第一個宏展開第一個宏展開第二個宏展開第二個宏展開第 五 章 高 級 匯 編 語 言 程 序 設 計與宏有關的偽指令2宏定義刪除宏定義刪除PURGE PURGE 宏名表;在各類名字中,只有宏名可以和宏名表;在各類名字中,只有宏名可以和指令同名;當同名時,宏定義優(yōu)先級最高。指令同名;當同名時,宏定義優(yōu)先級最高。宏定義退出宏定義退出(宏展開退出)(宏展開退出)EXITMEXITM;對;對EXITMEXITM后面的語句停止宏展開。后面的語句停止宏展開。第 五 章 高 級 匯 編 語 言 程 序 設 計宏與子程序 4.4.宏與子程序宏與子程序相同點:簡化源程序的設計和結構相同點:
35、簡化源程序的設計和結構不同點:不同點: 處理時間段不同。處理時間段不同。 對目標程序的長度影響不同。對目標程序的長度影響不同。 對目標程序執(zhí)行速度的影響不同。對目標程序執(zhí)行速度的影響不同。 傳遞參數(shù)的方式不同;傳遞參數(shù)過程中如出現(xiàn)傳遞參數(shù)的方式不同;傳遞參數(shù)過程中如出現(xiàn)錯誤,錯誤的性質不同。錯誤,錯誤的性質不同。(宏:語法;子程序:邏輯)(宏:語法;子程序:邏輯)通常,當程序段較短,要求較快執(zhí)行時,用宏定義。通常,當程序段較短,要求較快執(zhí)行時,用宏定義。當程序段較長,或為減小目標代碼長度,用子程序。當程序段較長,或為減小目標代碼長度,用子程序。第 五 章 高 級 匯 編 語 言 程 序 設 計
36、5.2.2重復匯編 5.2.25.2.2重復匯編重復匯編 重復匯編重復匯編指在匯編過程中,重復展開一段(基本)指在匯編過程中,重復展開一段(基本)相同的語句。相同的語句。 如果程序中需要連續(xù)重復一段相同的語句或基本相如果程序中需要連續(xù)重復一段相同的語句或基本相同的語句,可以使用重復匯編偽指令,也就是讓匯編程同的語句,可以使用重復匯編偽指令,也就是讓匯編程序代替程序員完成重復的工作。序代替程序員完成重復的工作。 重復匯編偽指令常在宏體內(nèi)使用,但也可以在宏體重復匯編偽指令常在宏體內(nèi)使用,但也可以在宏體外使用。重復匯編沒有名字,不能被調(diào)用。外使用。重復匯編沒有名字,不能被調(diào)用。 重復匯編偽指令有重復
37、匯編偽指令有3 3條,條,3 3條偽指令區(qū)別在于如何規(guī)條偽指令區(qū)別在于如何規(guī)定重復次數(shù)。定重復次數(shù)。第 五 章 高 級 匯 編 語 言 程 序 設 計按參數(shù)值重復偽指令 1.1.按參數(shù)值重復偽指令按參數(shù)值重復偽指令 REPEAT REPEAT 重復次數(shù)重復次數(shù)重復體重復體 ENDMENDM例例5.8 5.8 定義定義2626個大寫字母個大寫字母char = Achar = AAztabel EQU THIS BYTEAztabel EQU THIS BYTEREPEAT REPEAT 2626DB charDB charchar = char+1char = char+1ENDMENDM匯編結
38、果:匯編結果:DB charDB charchar = char+1char = char+1DB charDB charchar = char+1char = char+1DB charDB charchar = char+1char = char+1第 五 章 高 級 匯 編 語 言 程 序 設 計按參數(shù)個數(shù)重復偽指令 1. 1.按參數(shù)個數(shù)重復偽指令按參數(shù)個數(shù)重復偽指令 FOR FOR 形參,形參, 重復體重復體 ENDMENDM例例5.9a 5.9a 保護常用寄存器保護常用寄存器FOR regad ,FOR regad ,PUSH regadPUSH regadENDMENDM匯編結果:
39、匯編結果: PUSH AXPUSH AXPUSH BXPUSH BXPUSH CXPUSH CXPUSH DXPUSH DX形參:重復體中使用的參數(shù)形參:重復體中使用的參數(shù) 注意:形參只有一個注意:形參只有一個實參:匯編展開時使用的參實參:匯編展開時使用的參數(shù),用其替換重復體中出現(xiàn)數(shù),用其替換重復體中出現(xiàn)的形參;按實參個數(shù)重復。的形參;按實參個數(shù)重復。 必須使用必須使用“”括起。括起。第 五 章 高 級 匯 編 語 言 程 序 設 計按參數(shù)字符個數(shù)重復偽指令 1. 1.按參數(shù)按參數(shù)字符字符個數(shù)重復偽指令個數(shù)重復偽指令 FORC FORC 形參,字符串形參,字符串 ;FORC FORC 形參,形
40、參, 重復體重復體 ENDMENDM例例5.9b 5.9b 恢復常用寄存器恢復常用寄存器FORC regad ,dcbaFORC regad ,dcbaPOP ®ad&xPOP ®ad&xENDMENDM匯編結果:匯編結果:POP DX POP DX POP CXPOP CXPOP BXPOP BXPOP AXPOP AX第 五 章 高 級 匯 編 語 言 程 序 設 計5.2.3 條件匯編 5.2.3 5.2.3 條件匯編條件匯編條件匯編偽指令使匯編程序根據(jù)某種條件是否成立條件匯編偽指令使匯編程序根據(jù)某種條件是否成立決定是否匯編某段語句序列決定是否
41、匯編某段語句序列條件匯編偽指令格式:條件匯編偽指令格式:IFIFxxxx 表達式表達式分支語句體分支語句體 1 1ELSEELSE分支語句體分支語句體 22ENDIFENDIF偽指令中的偽指令中的“xxxx”為組成條件匯編偽指令的其他字符,為組成條件匯編偽指令的其他字符,不同的不同的“xx”xx”,表達的條件不同。如,表達的條件不同。如“IF IF 表達式表達式”,表達,表達的條件為:如表達式的值不為的條件為:如表達式的值不為0 0,則條件滿足;,則條件滿足;“IFIFE E 表達式表達式”表達的條件為:如表達式的值為表達的條件為:如表達式的值為0 0,則條件,則條件滿足。(見教材表滿足。(見
42、教材表5.35.3)第 五 章 高 級 匯 編 語 言 程 序 設 計條件匯編偽指令(IF|IFE)中的表達式 條件匯編偽指令(條件匯編偽指令(IF|IFEIF|IFE)中的表達式:)中的表達式: 運算符使用第三章介紹的關系運算符:運算符使用第三章介紹的關系運算符: EQEQ、NENE、GTGT、LTLT、GEGE、LELE 注意,不同于條件控制偽指令(注意,不同于條件控制偽指令(.IF.IF)中使用的運)中使用的運 算符。算符。 表達式用表達式用0FFFFH0FFFFH(或任意非(或任意非0 0數(shù))表示真,用數(shù))表示真,用0 0表表 示假。示假。第 五 章 高 級 匯 編 語 言 程 序 設
43、 計例5.10 例例5.105.10:定義一個元素個數(shù)不超過:定義一個元素個數(shù)不超過100100個的數(shù)組。個的數(shù)組。 PDATAPDATAMACRO NUMMACRO NUM IF NUM LT 100 IF NUM LT 100 DB NUM DUP DB NUM DUP(?)(?) ELSEELSE DB 100 DUP DB 100 DUP(?)(?) ENDIFENDIFENDMENDM宏調(diào)用宏調(diào)用:PDATAPDATA 1212宏展開宏展開:DB 12 DUP (DB 12 DUP (?) )宏調(diào)用宏調(diào)用:PDATA 105PDATA 105宏展開宏展開:DB 100 DUP (DB
44、 100 DUP (?) )第 五 章 高 級 匯 編 語 言 程 序 設 計例5.11/1例例5.11 5.11 編寫宏編寫宏MAXNUMMAXNUM,計算,計算3 3個以內(nèi)的數(shù)據(jù)中的最大值,個以內(nèi)的數(shù)據(jù)中的最大值,并將結果送入并將結果送入AXAX寄存器,要求根據(jù)宏調(diào)用時的實參個數(shù)寄存器,要求根據(jù)宏調(diào)用時的實參個數(shù)展開相應代碼。展開相應代碼。 分析:分析:1 1)至少應有一個參數(shù),故第一個參數(shù)設為不)至少應有一個參數(shù),故第一個參數(shù)設為不 可缺少;可缺少; 2 2)宏指令應能夠作到:根據(jù)實參情況產(chǎn)生不)宏指令應能夠作到:根據(jù)實參情況產(chǎn)生不 同的程序段,進行不同的處理。實參可分同的程序段,進行不
45、同的處理。實參可分 三種情況:三種情況:A.A.只有一個參數(shù)只有一個參數(shù) B.B.有兩個參數(shù)有兩個參數(shù) C.C.有三個參數(shù)有三個參數(shù) 顯然,應使用條件匯編。顯然,應使用條件匯編。第 五 章 高 級 匯 編 語 言 程 序 設 計/2 MAXNUM MACRO WX:REQ,WY,WZLOCAL MAXNUM1,MAXNUM2MOV AX,WX ;只有一個實參替換;只有一個實參替換WX IFNB ;還有;還有WY時時CMP AX,WYJGE MAXNUM1MOV AX,WYENDIFMAXNUM1: IFNB ;當有;當有WZ時,匯編本段時,匯編本段CMP AX,WZJGE MAXNUM2MOV
46、 AX,WZENDIFMAXNUM2:ENDM第 五 章 高 級 匯 編 語 言 程 序 設 計/3 宏調(diào)用:宏調(diào)用: 匯編結果:匯編結果:Maxnum bx ;只有只有1個參數(shù)個參數(shù)Mov ax , bx ;只有只有1個參數(shù)個參數(shù)Maxnum 3, 4 ;有有2個參數(shù)個參數(shù) Mov ax, 3 Cmp ax, 4 Jge ?0000 Mov ax, 4?0000:第 五 章 高 級 匯 編 語 言 程 序 設 計/4 宏調(diào)用:宏調(diào)用: 匯編結果:匯編結果:Maxnum n1, n2, n3 ;有有3個參數(shù)個參數(shù) mov ax, n1 cmp ax, n2 jge ?0000 mov ax,
47、n2?0000: cmp ax, n3 jge ?0001 mov ax, n3?0001: 注意區(qū)別注意區(qū)別條件控制偽指令條件控制偽指令 和和條件匯編偽指令條件匯編偽指令第 五 章 高 級 匯 編 語 言 程 序 設 計P149例題/1P149P149例題:用宏結構實現(xiàn)信息顯示。例題:用宏結構實現(xiàn)信息顯示。dstringdstring MACRO stringMACRO string ;定義字符串定義字符串db &string&,0dh,0ah,$db &string&,0dh,0ah,$ENDMENDMmainbeginmainbeginMACRO dsse
48、gMACRO dsseg;設置數(shù)據(jù)段地址設置數(shù)據(jù)段地址mov ax,dssegmov ax,dssegmov ds,axmov ds,axENDMENDMdispmsgdispmsg MACRO message;MACRO message;顯示,形參為偏移地址顯示,形參為偏移地址mov dx,offset messagemov dx,offset messagemov ah,09hmov ah,09hint 21hint 21hENDMENDM第 五 章 高 級 匯 編 語 言 程 序 設 計/2mainendmainend MACRO retnumMACRO retnum ;返回返回DOSD
49、OS,可不帶參數(shù),可不帶參數(shù) ifb ;ifb ;宏調(diào)用沒有實參數(shù)宏調(diào)用沒有實參數(shù) mov ah,4chmov ah,4ch else ; else ; 有參數(shù)有參數(shù) mov ax,4c00h+(retnum AND 0ffh)mov ax,4c00h+(retnum AND 0ffh) endif endif int 21h int 21hENDMENDM保證不破壞保證不破壞AH的內(nèi)容的內(nèi)容第 五 章 高 級 匯 編 語 言 程 序 設 計/3 .model small .model small .stack 256 .stack 256 .data .datamsg1msg1 equ th
50、is byte equ this bytedstringdstring msg2msg2 equ this byte equ this bytedstringdstring .code .codestart:mainbegin data ;start:mainbegin data ;建立建立DSDS內(nèi)容內(nèi)容dispmsg msg1dispmsg msg1 ; ;顯示顯示msg1msg1字符串字符串dispmsg msg2dispmsg msg2 ; ;顯示顯示msg2msg2字符串字符串mainendmainend ; ;返回返回DOSDOSend startend start第 五 章 高
51、級 匯 編 語 言 程 序 設 計5.3 模塊化程序設計 5.3 5.3 模塊化程序設計模塊化程序設計 開發(fā)大型或較復雜的程序時,往往需要結合使用其開發(fā)大型或較復雜的程序時,往往需要結合使用其他方法,如源程序文件的包含、目標代碼文件的連接、他方法,如源程序文件的包含、目標代碼文件的連接、子程序庫的使用等等。子程序庫的使用等等。 本節(jié)簡單介紹以上三種方法。本節(jié)簡單介紹以上三種方法。 5.3.1 5.3.1 源程序文件的包含源程序文件的包含 5.3.2 5.3.2 目標代碼文件的連接目標代碼文件的連接 5.3.3 5.3.3 子程序庫的使用子程序庫的使用第 五 章 高 級 匯 編 語 言 程 序
52、設 計5.3.1 源程序文件的包含 5.3.1 5.3.1 源程序文件的包含源程序文件的包含 對大型源程序,可以分成幾個源文件,待匯編時在對大型源程序,可以分成幾個源文件,待匯編時在用包含偽指令用包含偽指令INCLUDEINCLUDE將它們結合成一個文件進行匯編。將它們結合成一個文件進行匯編。 格式為:格式為:INCLUDE INCLUDE 文件名文件名 匯編時,匯編程序將指定的文件插在偽指令所在的匯編時,匯編程序將指定的文件插在偽指令所在的位置,與其他部分同時匯編。位置,與其他部分同時匯編。 適用于:匯集常用的子程序為一個源文件適用于:匯集常用的子程序為一個源文件(.asm)(.asm);
53、匯集常用的宏定義為一個宏庫文件匯集常用的宏定義為一個宏庫文件(.mac)(.mac); 匯集常用的常量定義和聲明為一個包含文件匯集常用的常量定義和聲明為一個包含文件(.inc)(.inc)。 當源程序需要使用上述文件中的某些內(nèi)容時,不用當源程序需要使用上述文件中的某些內(nèi)容時,不用重新編寫,只要使用包含偽指令將文件包含即可。重新編寫,只要使用包含偽指令將文件包含即可。第 五 章 高 級 匯 編 語 言 程 序 設 計例5.12a 例例5.12a 5.12a 利用源程序包含的方法實現(xiàn)將輸入的數(shù)據(jù)利用源程序包含的方法實現(xiàn)將輸入的數(shù)據(jù)按升序輸出。按升序輸出。 要求:最多輸入要求:最多輸入100100個
54、無符號字節(jié)數(shù)據(jù);以十六進制個無符號字節(jié)數(shù)據(jù);以十六進制形式輸入;按照升序排序并顯示。形式輸入;按照升序排序并顯示。 源程序由三個單獨的文件組成:源程序由三個單獨的文件組成: 宏庫文件宏庫文件 lt512a.maclt512a.mac(顯示字符和字符串)(顯示字符和字符串) 子程序文件子程序文件 sub512a.asmsub512a.asm(輸入、排序)(輸入、排序) 主程序文件主程序文件 lt512a.asmlt512a.asm(提供入口參數(shù)、處理(提供入口參數(shù)、處理 出口參數(shù)、排序、顯示)出口參數(shù)、排序、顯示)第 五 章 高 級 匯 編 語 言 程 序 設 計宏庫文件 lt512a.mac
55、1 1)宏庫文件)宏庫文件 lt512a.maclt512a.macdispchardispchar macro charmacro char ; ;顯示顯示charchar字符字符mov dl,charmov dl,charmov ah,2mov ah,2int 21hint 21hendmendmdispmsgdispmsg macro messagemacro message; ;顯示顯示messagemessage字符串字符串mov dx,offset messagemov dx,offset messagemov ah,9mov ah,9int 21hint 21hendmendm第
56、 五 章 高 級 匯 編 語 言 程 序 設 計子程序文件 sub512a.asm 2 2)子程序文件)子程序文件 sub512a.asmsub512a.asm子程序源文件有子程序源文件有3 3個子程序個子程序ALdispALdisp; ;顯示顯示2 2位位1616進制數(shù)子程序(例進制數(shù)子程序(例4.104.10)sortingsorting ; ;排序子程序(例排序子程序(例4.84.8)inputinput; ;鍵盤輸入子程序鍵盤輸入子程序(后面分析)(后面分析)還包含一個宏還包含一個宏convertconvert ;將將DXDX兩位兩位ASCIIASCII碼轉換為兩位碼轉換為兩位1616
57、進制數(shù)進制數(shù)第 五 章 高 級 匯 編 語 言 程 序 設 計主程序文件 lt512a.asm 3 3)主程序文件)主程序文件 lt512a.asmlt512a.asm include lt421a.mac ;包含宏庫文件,置于主程;包含宏庫文件,置于主程.model /.stack /.data / .code.model /.stack /.data / .code等等 序頭部序頭部dispmsg msg1dispmsg msg1 ; ;提示輸入數(shù)據(jù)提示輸入數(shù)據(jù)mov bx,offset bufmov bx,offset bufcall inputcall input ; ;數(shù)據(jù)輸入數(shù)據(jù)輸
58、入cmp cx,0cmp cx,0je start4je start4 ; ;沒有輸入數(shù)據(jù)則退出沒有輸入數(shù)據(jù)則退出mov count,cxmov count,cx. ; ;顯示輸入的數(shù)據(jù)顯示輸入的數(shù)據(jù). ; ;數(shù)據(jù)排序數(shù)據(jù)排序. ; ;顯示經(jīng)排序后的數(shù)據(jù)顯示經(jīng)排序后的數(shù)據(jù)start4:.exit 0start4:.exit 0include sub421a.asm ;包含子程序文件;包含子程序文件endend將三個文件分別編輯,主程序文件用將三個文件分別編輯,主程序文件用兩條包含偽指令將宏庫文件和子程序兩條包含偽指令將宏庫文件和子程序文件包含(注意包含偽指令的位置),文件包含(注意包含偽指令的
59、位置),然后匯編并連接主程序文件,即可得然后匯編并連接主程序文件,即可得到可執(zhí)行文件。到可執(zhí)行文件。第 五 章 高 級 匯 編 語 言 程 序 設 計鍵盤輸入子程序/1 鍵盤輸入子程序:鍵盤輸入子程序:;每次輸入;每次輸入1 1位或位或2 2位位 十六進制數(shù)字;十六進制數(shù)字;空格或逗號確認輸入;空格或逗號確認輸入;退格鍵刪除當前輸入;退格鍵刪除當前輸入 的數(shù)據(jù);的數(shù)據(jù);回車表示所有數(shù)據(jù);回車表示所有數(shù)據(jù) 輸入結束。輸入結束。;入口參數(shù):;入口參數(shù):ds:bx=ds:bx= 存放數(shù)據(jù)的緩沖區(qū)存放數(shù)據(jù)的緩沖區(qū);出口參數(shù):;出口參數(shù):cx=cx= 數(shù)據(jù)個數(shù)數(shù)據(jù)個數(shù)轉換和保存轉換和保存返回返回轉換和保
60、存轉換和保存錯誤處理錯誤處理A輸入一個字符輸入一個字符退格?退格?空格?空格?回車?回車?逗號?逗號?有效?有效?AA存入存入DH DL第 五 章 高 級 匯 編 語 言 程 序 設 計/2inputinputprocprocpush axpush axpush dxpush dxxor cx,cxxor cx,cx ; ;數(shù)據(jù)個數(shù)清數(shù)據(jù)個數(shù)清0 0input01:input01: xor dx,dxxor dx,dx; ;輸入字符清輸入字符清0 0input02:input02: mov ah,1mov ah,1 ; ;鍵盤輸入一個字符鍵盤輸入一個字符int 21hint 21h第 五 章 高 級 匯 編 語 言 程 序 設 計/3input10:input10: cmp al,0dhcmp al,0dhje input30
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 面館畢設課題申報書
- 合同范本三人
- 分校合作合同范本
- 北京職工公寓租賃合同范本
- 豐田買車銷售合同范本
- 合同范本租房
- 增強民營企業(yè)發(fā)展活力促進經(jīng)濟高質量增長
- 吊裝租賃搬運合同范本
- 合同范本不需審查
- 合同范本電子版
- 貴州省就業(yè)失業(yè)登記表
- 預防電信詐騙網(wǎng)絡詐騙講座PPT幻燈片課件
- 反興奮劑知識試題及答案
- 初中八年級上冊音樂課件4.2欣賞沃爾塔瓦河(14張)ppt課件
- 人教版五年級數(shù)學下冊每個單元教材分析(共九個單元)
- 深圳氫燃料共享單車項目投資計劃書【參考范文】
- 主要腸內(nèi)營養(yǎng)制劑成分比較
- 小學生如何理解句子的含義(課堂PPT)
- 實際控制關系賬戶申報表
- 沖床架模技術與作業(yè)規(guī)范
- 小學五年級綜合實踐課教案
評論
0/150
提交評論