




已閱讀5頁(yè),還剩97頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
微機(jī)原理與接口技術(shù),第4章 匯編語(yǔ)言程序設(shè)計(jì),本章內(nèi)容,匯編語(yǔ)言源程序:用匯編語(yǔ)言編寫(xiě)的程序,或簡(jiǎn)稱(chēng)為源程序。 匯編程序:將源程序翻譯成機(jī)器語(yǔ)言的程序 目標(biāo)程序:機(jī)器語(yǔ)言代碼程序 連接程序:將庫(kù)文件和目標(biāo)文件連接在一起形成可執(zhí)行文件的程序 目前常用的匯編程序有宏匯編MASM 匯編語(yǔ)言程序從建立到匯編、連接形成可執(zhí)行程序的整個(gè)過(guò)程如圖所示:,4.1 匯編語(yǔ)言程序格式,4.1 匯編語(yǔ)言程序格式,匯編源程序:,4.1 匯編語(yǔ)言程序格式,三、一般匯編語(yǔ)言程序的結(jié)構(gòu)形式 NAME1 SEGMENT ;段的起始 語(yǔ)句1 ; 語(yǔ)句2 ; 語(yǔ)句n ; NAME1 ENDS ;段的結(jié)束 NAME2 SEGMENT ;段的起始 語(yǔ)句1 ; 語(yǔ)句2 ; 語(yǔ)句m ; NAME2 ENDS ;段的結(jié)束 END ;源程序結(jié)束,m條語(yǔ)句序列構(gòu)成的語(yǔ)句體,n條語(yǔ)句序列構(gòu)成的語(yǔ)句體,4.1 匯編語(yǔ)言程序格式,8086 匯編語(yǔ)言語(yǔ)句的分類(lèi) 指令語(yǔ)句 偽指令語(yǔ)句 宏指令語(yǔ)句,4.2 匯編語(yǔ)言基本語(yǔ)法,4.2.0 匯編語(yǔ)言的格式 4.2.1 常量、變量與標(biāo)號(hào) 4.2.2 運(yùn)算符與表達(dá)式,4.2.0 匯編語(yǔ)言的格式,由匯編語(yǔ)言編寫(xiě)的源程序是由許多語(yǔ)句(也可稱(chēng)為匯編指令)組成的。每個(gè)語(yǔ)句由14個(gè)部分組成,其格式是: 標(biāo)號(hào) 指令助記符 操作數(shù) ;注解 標(biāo)識(shí)符:給指令或某一存儲(chǔ)單元地址所起的名字??捎上铝凶址M成: 字母:A z ; 數(shù)字:0 9 ; 特殊字符:?、 、一、$ 。 數(shù)字不能作標(biāo)識(shí)符的第一個(gè)字符,而圓點(diǎn)僅能用作第一個(gè)字符。標(biāo)識(shí)符最長(zhǎng)為31個(gè)字符。當(dāng)標(biāo)識(shí)符后跟冒號(hào)時(shí),表示是標(biāo)號(hào)。它代表該行指令的起始地址;當(dāng)標(biāo)識(shí)符后不帶冒號(hào)時(shí),表示變量;偽指令前的標(biāo)識(shí)符不加冒號(hào)。 指令助記符:表示不同操作的指令,可以是8086的指令助記符,也可以是偽指令。 操作數(shù): 指令執(zhí)行的對(duì)象。依指令的要求,可能有一個(gè)、兩個(gè)或者沒(méi)有。 注解:該項(xiàng)可有可無(wú),是為源程序所加的注解,用于提高程序的可讀性。,4.2.1 常量、變量與標(biāo)號(hào),1. 常量 數(shù)值常量:如:010111001,56,94H,0ADH等。 字符串常量 :用單引號(hào)括起來(lái)的字符串,如 A, abcd等。字符串在計(jì)算機(jī)中存儲(chǔ)的是其ASCLL碼。例如:A的值是41H,AB的值是4142H等。 符號(hào)常量:常量用符號(hào)名來(lái)代替就是符號(hào)常量。例如: COUNT EQU 3 或COUNT=3,COUNT就是一個(gè)符號(hào)常量,與數(shù)值常量3等價(jià)。,4.2.1 常量、變量與標(biāo)號(hào),2. 變量 變量在數(shù)據(jù)段、附加數(shù)據(jù)段或堆棧段中定義,后面不跟冒號(hào)。它也可以用LABEL或EQU偽操作來(lái)定義。變量經(jīng)常在操作數(shù)字段出現(xiàn),有三種屬性,見(jiàn)下: 段屬性:指變量所在段的段首址。 偏移屬性:變量的偏移地址,指從段的起始地址到定義變量的位置之間的字節(jié)數(shù)。 類(lèi)型屬性:變量的類(lèi)型屬性,指該變量定義的字節(jié)數(shù)。BYTE(1)、WORD(2)、DWORD(4)、FWORD(6)、QWORD(8)、TBYTE(10),4.2.1 常量、變量與標(biāo)號(hào),在同一個(gè)程序中,同樣的標(biāo)號(hào)或變量的定義只允許出現(xiàn)一次,否則匯編程序會(huì)指示出錯(cuò)。 例 DATA Segment ;數(shù)據(jù)段 A DB 55 B DW 36H DATA Ends 說(shuō)明:A 和B是變量。,4.2.1 常量、變量與標(biāo)號(hào),3. 標(biāo)號(hào) 標(biāo)號(hào)在代碼段中定義,后面跟著冒號(hào)“:”,它可用LABEL或EQU偽操作來(lái)定義;還可以作為過(guò)程名定義。標(biāo)號(hào)經(jīng)常在轉(zhuǎn)移指令或CALL指令的操作數(shù)字段出現(xiàn),用以表示轉(zhuǎn)向地址。標(biāo)號(hào)有3種屬性: 段屬性:定義標(biāo)號(hào)的段起始地址 偏移屬性:標(biāo)號(hào)的偏移地址,是從段起始地址到定義標(biāo)號(hào)的位置之間的字節(jié)數(shù)。 類(lèi)型屬性:用來(lái)指出該標(biāo)號(hào)是在本段內(nèi)引用還是在其他段中引用的。段內(nèi)引用的類(lèi)型屬性是Near,段間引用的類(lèi)型屬性是Far。,4.2.2 運(yùn)算符與表達(dá)式,1. 算術(shù)運(yùn)算符 (加)、(減)、*(乘)、/(除)、MOD(取余除) 例如: MOV AL,4*85 ;數(shù)值表達(dá)式 MOV SI,OFFSET BUF12 ;地址表達(dá)式,4.2.2 運(yùn)算符與表達(dá)式,2. 邏輯運(yùn)算符 AND(與)、OR(或)、XOR(異或)、NOT(非) 說(shuō)明: 邏輯運(yùn)算符只能用于數(shù)值表達(dá)式中,不能用于地址表達(dá)式中。 邏輯運(yùn)算符和邏輯運(yùn)算指令是有區(qū)別的。邏輯運(yùn)算符的功能在匯編階段完成,邏輯運(yùn)算指令的功能在程序執(zhí)行階段完成。例如,在匯編階段, 指令 AND AL,78H AND 0FH 等價(jià)于 指令 AND AL,08H,4.2.2 運(yùn)算符與表達(dá)式,3. 關(guān)系運(yùn)算符 EQ(相等) LT(小于) LE(小于等于) GT(大于) GE(大于等于) NE(不等于) 說(shuō)明: 關(guān)系運(yùn)算符要有兩個(gè)運(yùn)算對(duì)象。兩個(gè)運(yùn)算對(duì)象要么都是數(shù)值、要么都是同一個(gè)段內(nèi)的地址。運(yùn)算結(jié)果為真時(shí),表示為0FFFFH (-1),運(yùn)算結(jié)果為假時(shí),表示為0000H (0)。 例如: 指令MOV BX,32 EQ 45 等價(jià)于 MOV BX,0 指令MOV BX,56 GT 30 等價(jià)于 MOV BX,0FFFFH,4.2.2 運(yùn)算符與表達(dá)式,4. 取值運(yùn)算符 變量和標(biāo)號(hào)具有段屬性、偏移屬性和類(lèi)型屬性等,要從變量和標(biāo)號(hào)中取出它們的段地址、偏移地址,變量的類(lèi)型、元素的個(gè)數(shù)和占用內(nèi)存的大小等,就要使用取值運(yùn)算符(又稱(chēng)分析運(yùn)算符)。這些運(yùn)算符是: SEG:取段地址 OFFSET:取偏移地址 TYPE :返回變量類(lèi)型 LENGTH:返回變量所包含的數(shù)據(jù)個(gè)數(shù) SIZE :返回變量的字節(jié)數(shù),4.2.2 運(yùn)算符與表達(dá)式,例如:SCORE DW 30 DUP(0) 上述偽指令定義了一個(gè)變量SCORE ,取值運(yùn)算符使用如下: MOV AL, TYPE SCORE MOV AH, LENGTH SCORE MOV BL, SIZE SCORE 則 (AL)=2 ,(AH)=30 ,(BL)=60,4.2.2 運(yùn)算符與表達(dá)式,5. 合成運(yùn)算符 也稱(chēng)為修改屬性運(yùn)算符,它能修改變量或標(biāo)號(hào)的原有的類(lèi)型屬性并賦予新的類(lèi)型。這類(lèi)運(yùn)算符是PTR和THIS。 PTR的格式: 類(lèi)型 PTR 表達(dá)式 其中類(lèi)型可以是BYTE、WORD、DWORD、NEAR、FAR,表達(dá)式是被修改的變量或標(biāo)號(hào)。 例如: NUM DB 1,3,5,7 則 MOV AX,NUM 非法的!因?yàn)镹UM是字節(jié)定義,而AX是字! 而應(yīng)改為: MOV AX, WORD PTR NUM,PTR運(yùn)算符應(yīng)用例子: 數(shù)據(jù)段定義: VAR1 DB 10H,18H,25H,34H VAR2 DW 1223H,1200H 代碼段定義: MOV AX, WORD PTR VAR1 ;執(zhí)行后:AX=1810H MOV BL, BYTE PTR VAR2 ;執(zhí)行后:BL=23H,4.2.2 運(yùn)算符與表達(dá)式, THIS的格式: 新符號(hào)名 EQU THIS 類(lèi)型 原符號(hào)名 類(lèi)型 參數(shù), THIS的功能與PTR相同,只是格式不同。THIS語(yǔ)句中建立一個(gè)新的符號(hào)名并指定它有THIS后的類(lèi)型,而新符號(hào)名指向下一語(yǔ)句的原符號(hào)名的內(nèi)存地址。 例如用下面的THIS語(yǔ)句代替。 DNUM EQU THIS WORD NUM DB 1,3,5,7 其中DNUM是字型并指向NUM所指的內(nèi)存單元,DNUM的存取以字為單位,而NUM仍是字節(jié)類(lèi)型。 MOV AX,DNUM ;合法的,4.3 偽指令,1. 符號(hào)定義偽指令 等值偽指令EQU 格式:EQU 例如: CONSTANT EQU 256 ;將數(shù)256賦以符號(hào)名 B EQU BP+8 ;變址引用賦以符號(hào)名B AB EQU DATA_ONE +2 ; DATA_ONE必須先定義,否則出錯(cuò),4.3 偽指令, 等號(hào)偽指令 = 例如: EMP=6 或 EMP EQU 6 EQU定義的表達(dá)式名不允許重復(fù)使用。而偽指令則允許重復(fù)使用。,4.3 偽指令, 定義符號(hào)名偽指令LABEL LABEL偽指令可以定義變量或標(biāo)號(hào). 格式: LABEL LABEL只指出所定義的變量或標(biāo)號(hào)的類(lèi)型,可以是BYTE、WORD、DWORD、NEAR、FAR。具體的變量或標(biāo)號(hào)的段屬性和偏移屬性則由下一條可分配內(nèi)存的變量或標(biāo)號(hào)的屬性決定。例如: DATW LABEL WORD DATB DB 20H DUP(0) FLPT LABEL FAR NLPT: MOV AX,BX,4.3 偽指令, 解除定義偽指令PURGE:解除指定符號(hào)的定義。 格式:PURGE 解除符號(hào)定義后,可用EQU重新定義。 例如: Y1 EQU 7 ;定義Y1的值為7 PURGE Y1 ;解除Y1的定義 Y1 EQU 36 ;重新定義Y1的值為36,4.3 偽指令,(5)DUP按照給定的次數(shù)來(lái)復(fù)制某個(gè)(或某些)操作數(shù),可以避免多次重復(fù)輸入同一個(gè)數(shù)據(jù)。 例1: Data1 DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH Data2 DB 6 DUP(0FFH) 例2:操作數(shù)?可以保留存儲(chǔ)空間,但不存入數(shù)據(jù)。 Array1 DB 2 DUP(0,1,2,?) Array3 DB 100 DUP(?),4.3 偽指令,2. 數(shù)據(jù)定義偽指令 格式: 變量 助記符 操作數(shù),操作數(shù);注釋 該類(lèi)偽指令用來(lái)定義存貯空間及其所存數(shù)據(jù)的長(zhǎng)度。 DB:定義字節(jié),即每個(gè)數(shù)據(jù)是1個(gè)字節(jié)。 DW:定義字,即每個(gè)數(shù)據(jù)占1個(gè)字(2個(gè)字節(jié))。 DD:定義雙字,即每個(gè)數(shù)據(jù)占2個(gè)字。低字部分在低地址,高字部分在高地址。 DQ:定義4字長(zhǎng),即每個(gè)數(shù)據(jù)占4個(gè)字。 DT:定義10個(gè)字節(jié)長(zhǎng),用于壓縮式十進(jìn)制數(shù)據(jù)。 例如:DATA1 DB 10H,6,78H,100 表示從DATA1單元開(kāi)始連續(xù)存放10H,6,78H,100,共占4個(gè)字節(jié)地址。,4.3 偽指令,定義數(shù)據(jù)偽指令 DATA1 DB 20H DATA2 DW 0240H,1000H DATA3 DB (-1*3),(15/3) DATA4 DD 12345H DATA5 DB 3210 DATA6 DW AB,C,D DATA7 DB ? DATA8 DD ? DATA9 DB 5DUP(00) DATA10 DW 3DUP(?),4.3 偽指令,課后練習(xí) 例1:請(qǐng)圖示下面?zhèn)沃噶疃x的數(shù)據(jù)在內(nèi)存中的存放形式。 (1)BUF1 DB 12,12,12H,2*6,-1 (2)BUF2 DW 12,12H,1234H (3)BUF3 DB 2 DUP(5,4,3DUP(8),4.3 偽指令,例2:下面是一個(gè)定義數(shù)據(jù)的程序段,設(shè)DATA值為1200H,請(qǐng)圖示各數(shù)據(jù)在內(nèi)存的存放形式。 Data segment org 100H Buf1 DB 10H,20H,30H Buf2 DW Buf1 Buf3 DD Buf2 Count EQU Buf2-Buf1 Buf4 DW Buf2-Buf1 Data ends,4.3 偽指令,3. 段定義偽指令 SEGMENT和ENDS 段定義偽指令 該指令能對(duì)程序分段,其格式為: 段名 SEGMENT 定位類(lèi)型組合類(lèi)型類(lèi)別 段名 ENDS,4.3 偽指令,DATA1 SEGMENT DATA1 ENDS STACK1 SEGMENT STACK STACK1 ENDS CODE1 SEGMENT ASSUME CS:CODE1,DS:DATA1,SS:STACK1 MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX CODE1 ENDS,4.3 偽指令, ASSUME 段寄存器指派偽指令 該偽指令用來(lái)通知匯編程序哪一個(gè)段寄存器是該段的段寄存器 格式: ASSUME 段寄存器:段名,段寄存器:段名 注意:由于ASSUME偽指令只指明某一個(gè)段地址應(yīng)存于哪一個(gè)段寄存器中,并沒(méi)有包含將段地址送入該寄存器的操作。因此除CS外,DS、ES 和SS中的段地址要在程序中通過(guò)MOV指令裝入。,4.3 偽指令,例子: DATA1 SEGMENT DATA1 ENDS STACK1 SEGMENT STACK STACK1 ENDS CODE1 SEGMENT ASSUME CS:CODE1,DS:DATA1,SS:STACK1 MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX CODE1 ENDS,裝入DS數(shù)據(jù)段寄存器,裝入SS堆棧段寄存器,4.3 偽指令, ORG 移動(dòng)地址指針的偽指令 格式為: ORG 常量表達(dá)式 該指令指定地址指針相對(duì)于當(dāng)前指針的偏移位置,常用表達(dá)式給出偏移量。當(dāng)指定新的地址指針以后,其后的程序和數(shù)據(jù)就從此指針指示的起始地址開(kāi)始存放。例如 ORG 100H 地址計(jì)數(shù)器用來(lái)保存當(dāng)前正在匯編的指令的地址,這個(gè)地址指針用$表示。如ORG $+5 ,則表示地址指針從當(dāng)前地址跳過(guò)5個(gè)字節(jié)。,4.3 偽指令,4. 過(guò)程定義偽指令PROC和ENDP 在程序設(shè)計(jì)中,可將具有一定功能的程序段看成為一個(gè)過(guò)程(相當(dāng)于一個(gè)子程序),它可以被別的程序調(diào)用。一個(gè)過(guò)程由偽指令PROC和ENDP來(lái)定義。 過(guò)程名 PROC 類(lèi)型 過(guò)程體 RET 過(guò)程名 ENDP 其中過(guò)程名是為過(guò)程所起的名稱(chēng),不能省略,過(guò)程的類(lèi)型由FAR(遠(yuǎn)過(guò)程,為段間調(diào)用)和NEAR(近過(guò)程,在本段內(nèi)調(diào)用)來(lái)確定,如果缺省類(lèi)型,則該過(guò)程就默認(rèn)為近過(guò)程。ENDP表示過(guò)程結(jié)束。過(guò)程體內(nèi)至少應(yīng)有一條RET指令,以便返回被調(diào)用處。過(guò)程可以嵌套,也可以遞歸使用。,4.3 偽指令,4. 過(guò)程定義偽指令PROC和ENDP DELAY PROC MOV BL,10 DELY:MOV CX,2801 WAIT:LOOP WAIT DEC BL JNZ DELY RET DELAY ENDP,4.3 偽指令,5. 程序標(biāo)題偽指令TITLE Title偽指令指定一個(gè)標(biāo)題,以便在列表文件每一頁(yè)的第一行打印出這個(gè)標(biāo)題。一般放置在程序的第一行開(kāi)始處。 格式:TITLE 文本 其中,文本是用戶給出的字符串,要求長(zhǎng)度不超過(guò)6個(gè)字符。,4.3 偽指令,6、EVEN 偽指令 使下一個(gè)變量或指令開(kāi)始于偶數(shù)字節(jié)地址。,4.3 偽指令,7. 基數(shù)控制偽指令 二進(jìn)制數(shù) 由一串0和1組成其后跟以字母B,如00101100B 十進(jìn)制數(shù) 由09的數(shù)字組成的數(shù)。一般情況下,后面不必加上標(biāo)記,在指定其它基數(shù)的情況下,后面可跟字母D,例如178D。 十六進(jìn)制數(shù) 由09及AF組成的數(shù),后面跟字母H。這個(gè)數(shù)的第一個(gè)字符必須是09,所以如果第一個(gè)字符是AF時(shí),應(yīng)在其前面加上數(shù)字0,如0FFFFH。,4.3 偽指令, 八進(jìn)制數(shù) 由數(shù)字07組成的數(shù),后面可跟字母O或Q,如1777O。 .RADIX RADIX偽指令可以把默認(rèn)的基數(shù)改變?yōu)?16范圍內(nèi)的任何基數(shù)。格式如下: .RADIX EXPRESSION 字符串 字符串可以看成串常量,可以用單引號(hào)或雙引號(hào)把字符串放在其中,得到的是字符串的ASCII碼值,例如,ABCD。,4.4 宏指令,宏匯編是一種與子程序類(lèi)似而又獨(dú)具特色的簡(jiǎn)化程序設(shè)計(jì)的工具。宏匯編給用戶提供了自行設(shè)計(jì)指令并使用的手段,也就是用一條自定義的指令來(lái)代替一段完成某種功能的程序段,這種自定義的指令稱(chēng)為宏指令。 宏匯編主要包括3個(gè)步驟:宏定義,宏調(diào)用和宏展開(kāi)。,P128,4.4 宏指令,1.宏指令定義 將一段代碼定義成宏指令,相當(dāng)于用戶自定義了一條指令。格式如下: 宏指令名 MACRO 形式參數(shù)1,形式參數(shù)2, 形式參數(shù)N ;宏指令體(宏體) ENDM 例4.1 定義一條從鍵盤(pán)輸入一個(gè)字符的宏指令I(lǐng)NPUT input macro mov ah 1 int 21h endm,例4.2 定義一條換行宏指令LF LF MACRO MOV DL,10 10 是換行符的ASCII碼 MOV AH,2 INT 21H ENDM 例4.3 定義一條回車(chē)宏指令CR CR MACRO MOV DL,13 13 是回車(chē)符的ASCII碼 MOV AH,2 INT 21H ENDM,4.4 宏指令,2. 宏調(diào)用 在程序需要的地方插入宏指令,其語(yǔ)法與其他匯編語(yǔ)言指令相同。 宏指令名 實(shí)際參數(shù)1,實(shí)際參數(shù)2, 實(shí)際參數(shù)N 見(jiàn)例4.4 定義一條INOUT宏指令,既可以引用它輸入一串字符,也可以引用它來(lái)顯示一串提示字符。exmacro.asm,; 定義一條InOut指令,既可以引用它輸入一串字符,也可引用它顯示一串提示字符 inout macro x, y mov ah,x lea dx,y int 21h endm data segment input db Please input any characters:,$ keybuff db 10,11 dup(?),13,10,$ data ends code segment assume cs:code ,ds:data start: mov ax,data mov ds,ax inout 9,input ;顯示一串提示符的宏指令調(diào)用 lf cr inout 10,keybuff ;輸入一串字符串的宏指令調(diào)用 inout 9,Keybuff+2 ;顯示輸入的一串字符串的宏調(diào)用 mov ah,4ch int 21h code ends end start,4.4 宏指令,3. 宏展開(kāi) 匯編時(shí),匯編程序并不對(duì)宏定義指令進(jìn)行匯編,只有在宏調(diào)用時(shí)才對(duì)宏指令體進(jìn)行語(yǔ)法檢查和代碼塊的插入。這個(gè)過(guò)程稱(chēng)為宏展開(kāi)(即在匯編源程序是,在宏調(diào)用的位置用宏定義的程序代碼代替宏指令)。 在masm匯編生成的列表文件(.lst)中,可以看到宏展開(kāi)。用記事本打開(kāi)可以看到宏展開(kāi)的地方有1作標(biāo)志。 見(jiàn)EXMACRO.LST,4.5 系統(tǒng)功能調(diào)用,4.5.1 DOS軟中斷指令 8086系統(tǒng)規(guī)定對(duì)這些功能的調(diào)用,統(tǒng)一使用軟中斷INT指令,格式如下: INT n 其中,n是中斷類(lèi)型碼。,4.5 系統(tǒng)功能調(diào)用,4.5.2 DOS系統(tǒng)功能調(diào)用(INT 21H) 帶顯示的單字符鍵盤(pán)輸入(1號(hào)功能) 格式: MOV AH,1 INT 21H 輸出單字符(2號(hào)調(diào)用) 格式: MOV DL,A;A字符的ASCII碼置入DL中 MOV AH,2 INT 21H,4.5 系統(tǒng)功能調(diào)用, 不帶顯示的單字符鍵盤(pán)輸入(7號(hào)、8號(hào)調(diào)用) 字符串輸出(9號(hào)調(diào)用) 字符串輸入(0AH號(hào)調(diào)用) 返回操作系統(tǒng)(4CH號(hào)調(diào)用) 格式: MOV AH,4CH INT 21H,4.6 匯編語(yǔ)言程序設(shè)計(jì)舉例,用這三種基本結(jié)構(gòu)作為表示一個(gè)良好算法的基本單元。 順序結(jié)構(gòu) 選擇結(jié)構(gòu) 循環(huán)結(jié)構(gòu):它又稱(chēng)重復(fù)結(jié)構(gòu),即反復(fù)執(zhí)行某一部分的操作。有兩類(lèi)循環(huán)結(jié)構(gòu):當(dāng)型(WHILE型)循環(huán)結(jié)構(gòu)和直到型(UNTIL型)循環(huán)結(jié)構(gòu)。,圖4.3 順序結(jié)構(gòu)圖,箭頭:程序執(zhí)行的方向 方框:語(yǔ)句 棱形框:條件判斷 學(xué)會(huì)畫(huà)程序結(jié)構(gòu)流程圖,4.6.1 順序程序結(jié)構(gòu),例4.5 編程序計(jì)算:SUM=3*(X+Y)+(Y+Z)/(Y-Z),其中X、Y、Z都是16無(wú)符號(hào)數(shù)。假設(shè)運(yùn)算過(guò)程中間結(jié)果都不超出16位二進(jìn)制數(shù)的范圍,要求結(jié)果存入SUM單元。程序片段如下:,MOV AX,X ;取X ADD AX,Y ;AXX+Y MOV CX,3 MUL CX ;DX:AX3*X+Y MOV CX,AX ;CX3*X+Y保存 MOV AX,Y ;取Y ADD AX,Z ;AXY+Z XOR DX,DX ;DX0 MOV BX,Y ;取Y SUB BX,Z ;BXY-Z DIV BX ;AXY+Z/Y-Z的商 ADD AX,CX ;AX3*X+Y+Y+Z/Y-Z MOV SUM,AX ;存結(jié)果,4.6.1 順序程序結(jié)構(gòu),開(kāi)始,結(jié)束,從存儲(chǔ)單元取得兩個(gè)數(shù),并相加,將高4位轉(zhuǎn)化為ASCII字符碼輸出,將低4位轉(zhuǎn)化為ASCII字符碼輸出,例4.6程序流程結(jié)構(gòu)圖,4.6.1 順序程序結(jié)構(gòu),例4.6 將兩個(gè)字節(jié)數(shù)據(jù)相加,并存放到一個(gè)結(jié)果單元中。,DATA SEGMENT AD1 DB 4CH ;定義第1個(gè)加數(shù) AD2 DB 25H ;定義第2個(gè)加數(shù) SUM DB ? ;定義結(jié)果單元 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,AD1 ;取出第1個(gè)加數(shù) ADD AL,AD2 ;和第2個(gè)加數(shù)相加 MOV SUM,AL ;存放結(jié)果 MOV BL,AL ;顯示16進(jìn)制結(jié)果 MOV CL,4,4.6.1 順序程序結(jié)構(gòu),4.6.1 順序程序結(jié)構(gòu),SHR AL,CL ; 右移4位 AND AL,0FH ;高4位清0 ADD AL,30H ;加30H,變成ASCII碼。 MOV DL,AL ;顯示高4位 MOV AH,2 INT 21H MOV AL,BL AND AL,0FH ADD AL,30H MOV DL,AL ;顯示低4位 MOV AH,2 INT 21H MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,4.6.1 順序程序結(jié)構(gòu),數(shù)據(jù)處理并顯示過(guò)程,ASCII碼,二進(jìn)制數(shù),Ascii碼(串),計(jì)算機(jī)直接按二進(jìn)制數(shù)的運(yùn)算規(guī)則來(lái)進(jìn)行算術(shù)運(yùn)算,4.6.2 分支程序設(shè)計(jì),分支程序結(jié)構(gòu)可以有兩種形式,如下圖所示。它們分別相當(dāng)于高級(jí)語(yǔ)言中的IF_THEN_ELSE語(yǔ)句和CASE語(yǔ)句,適用于要求根據(jù)不同條件作不同處理的情況。IF_THEN_ELSE語(yǔ)句可以引出兩個(gè)分支。CASE語(yǔ)句則可以引出多個(gè)分支。不論哪一種形式,它們的共同特點(diǎn)是:運(yùn)行方向是向前的,在某一種特定條件下,只能執(zhí)行多個(gè)分支中的一個(gè)分支。,4.6.2 分支程序設(shè)計(jì),例4.7 編制程序?qū)崿F(xiàn)符號(hào)函數(shù)。 1 X0 Y= 0 X=0 (-128X+127) -1 X0 程序部分如下:,圖4.6 例4.7程序流程圖,CMP X,0 JL PNUM ;X0轉(zhuǎn)移到PNUM JZ ZERO ;X=0轉(zhuǎn)移到ZERO MOV Y,1 JMP EXIT ;X0 PNUM: MOV Y,-1 JMP EXIT ;X0 ZERO: MOV Y,0 ;X=0 EXIT: ,4.6.2 分支程序設(shè)計(jì),3.利用地址跳轉(zhuǎn)表實(shí)現(xiàn)分支 利用地址跳轉(zhuǎn)表的方法主要用于三路分支(或以上)的情況,類(lèi)似CASE結(jié)構(gòu)。 例4.8 在調(diào)用DOS文件管理功能時(shí),如出現(xiàn)了錯(cuò)誤(如使用了非法功能號(hào)),DOS則根據(jù)AX中的錯(cuò)誤碼,將相應(yīng)的錯(cuò)誤信息顯示出來(lái).(AX)=15各表示一種錯(cuò)誤,其錯(cuò)誤信息分別為ER1ER5.AX除15之外的數(shù)碼是無(wú)效(代碼見(jiàn) ch4_8table.doc,本題關(guān)鍵是找到AX與地址跳躍表的字符串地址ER1ER5的對(duì)應(yīng)關(guān)系)。,4.6.2 分支程序設(shè)計(jì),title ch4_8.asm data segment outrang db Error code is not in valid range(15),0dh,0ah,$ er1 db Invalid function number,0dh,0ah,$ er2 db File not found,0dh,0ah,$ er3 db Path not found,0dh,0ah,$ er4 db Too many open file,0dh,0ah,$ er5 db Acess violation,0dh,0ah,$ even ertab dw er1,er2,er3,er4,er5 data ends,code segment assume cs:code,ds:data show_err proc far start: mov si,data mov ds,si push ax ;保存正在工作的寄存器 push bx push dx mov ax,2 ;假設(shè)AX=2 cmp ax,5 ;跟5比較 jg outr ;大于5則超出范圍 cmp ax,1 ;小于5,則看是否大于1 jge tab_addr ;若大于1則查找錯(cuò)誤信息表地址 outr: lea dx,outrang ;超出范圍時(shí)的錯(cuò)誤信息 jmp short disp_msg ;跳轉(zhuǎn)至輸出信息,4.6.2 分支程序設(shè)計(jì),4.6.2 分支程序設(shè)計(jì),tab_addr: mov bx,ax ;(AX)-1)*2=bx dec bx shl bx,1 mov dx,ertabbx ;將錯(cuò)誤信息首地址送給dx,以便輸出 disp_msg: mov ah,09 ;輸出錯(cuò)誤信息字符串 int 21h pop dx ;彈出工作寄存器 pop bx pop ax,4.6.2 分支程序設(shè)計(jì),mov ax,4c00h int 21h show_err endp code ends end start,作業(yè),習(xí)題4 第1,2,3題 第5題,編程并畫(huà)出程序流程圖,4.6.3 循環(huán)程序設(shè)計(jì),1. 循環(huán)程序結(jié)構(gòu) DO_WHILE結(jié)構(gòu) :DO_WHILE結(jié)構(gòu)把對(duì)循環(huán)控制條件的判斷放在循環(huán)的入口,先判斷條件,滿足條件就執(zhí)行循環(huán)體,否則就退出循環(huán)。 DO_UNTIL結(jié)構(gòu):DO_UNTIL結(jié)構(gòu)則先執(zhí)行循環(huán)體,然后再判斷控制條件,不滿足條件則繼續(xù)執(zhí)行循環(huán)操作,一旦滿足條件則退出循環(huán)。,(a) DO WHILE結(jié)構(gòu),(b) DO UNTIL結(jié)構(gòu),4.6.3 循環(huán)程序設(shè)計(jì),循環(huán)程序都可由如下三部分組成: 設(shè)置循環(huán)的初始狀態(tài): 如設(shè)置循環(huán)次數(shù)的計(jì)數(shù)值,以及為循環(huán)體正常工作而建立的初始狀態(tài)等。 循環(huán)體:循環(huán)工作的主體,它由循環(huán)的工作部分及修改部分組成。 循環(huán)控制部分,與循環(huán)有關(guān)的指令,LOOP 標(biāo)號(hào) ;基本循環(huán)指令 LOOPZ/LOOPE 標(biāo)號(hào) ;為零/相等時(shí)循環(huán) LOOPNZ/LOOPNE 標(biāo)號(hào);不為零/不等時(shí)循環(huán) 說(shuō)明 條件循環(huán)指令除測(cè)試CX外還測(cè)試ZF,因此要注意將條件循環(huán)指令緊接在形成ZF的指令之后 在多重循環(huán)的程序結(jié)構(gòu)中,注意對(duì)循環(huán)計(jì)數(shù)器的保存與恢復(fù)。循環(huán)指令不影響條件碼。,4.6.3 循環(huán)程序設(shè)計(jì),2. 循環(huán)控制方法 循環(huán)的結(jié)束判斷是循環(huán)程序的一個(gè)重要部分,控制循環(huán)的執(zhí)行并判斷是否結(jié)束循環(huán)的方法主要有三種:計(jì)數(shù)控制、條件控制、邏輯尺控制。下邊分別進(jìn)行討論。 計(jì)數(shù)控制 這是一種最常用的循環(huán)控制方法,適用于事先已知循環(huán)次數(shù)的情況??捎醚h(huán)指令LOOP實(shí)現(xiàn),也可用條件轉(zhuǎn)移指令實(shí)現(xiàn)。,4.6.3 循環(huán)程序設(shè)計(jì),例4.9: 在首地址為BUFF的內(nèi)存緩沖區(qū)中,存放著20H個(gè)帶符號(hào)字?jǐn)?shù)據(jù)。編制程序找出其中的最小值,并將最小值存入MIN單元。程序片段如下:,LEA SI,BUFF ;設(shè)地址指針 MOV CX,20H ;CX循環(huán)次數(shù) MOV AX,SI ;AX第一個(gè)數(shù)據(jù) INC SI INC SI ;SI指向第二個(gè)數(shù) DEC CX AGAIN:CMP AX,SI JLE NEXT ;小于或等于時(shí)轉(zhuǎn)移 MOV AX,SI NEXT: INC SI INC SI ;修改地址指針指向下一個(gè)數(shù) LOOP AGAIN MOV MIN,AX,完整程序見(jiàn)ch4-9.asm,4.6.3 循環(huán)程序設(shè)計(jì), 條件控制 適用于事先不知道循環(huán)次數(shù)的場(chǎng)合,但可以用給定的某種條件來(lái)判斷是否結(jié)束循環(huán)。 例4.10 編程統(tǒng)計(jì)AX寄存器中1的個(gè)數(shù),并將結(jié)果存入SUM單元,4.6.3 循環(huán)程序設(shè)計(jì),程序片段如下: MOV BL,0 ;計(jì)數(shù)單元BL清0 AGAIN:OR AX,AX ;測(cè)試AX=0? JZ EXIT ;若 AX=0,則轉(zhuǎn)移到結(jié)束點(diǎn)。 SHL AX,1 ;將AX最高位移至CF JNC NEXT ;CF=0,轉(zhuǎn)去AGAIN繼續(xù) INC BL ;CF0,BL加1 NEXT:JMP AGAIN EXIT:MOV SUM,BL,4.6.3 循環(huán)程序設(shè)計(jì),3.邏輯尺控制 適用于沒(méi)有規(guī)律但必須連續(xù)執(zhí)行的情況。 例4.11 編寫(xiě)一個(gè)顯示程序,要求顯示A和B14次,顯示次序?yàn)锳顯示3次,B顯示1次,B顯示1次,A顯示4次,B顯示3次。分析: 設(shè)邏輯尺:0001101000011100 0表示顯示A 1表示顯示B 逐位測(cè)試邏輯尺,是0則執(zhí)行顯示A的分支,是1則執(zhí)行顯示B的分支代碼見(jiàn)ch4_11logicrule.doc,Title邏輯尺 Data segment A db * B db Logic_rule dw 1A1CH Data ends Code segment assume cs:code,ds:data Start: mov ax,data Mov ds,ax Mov cx,14 Mov bx,logic_rule Next : Shl bx,1 Jc showB,Mov dl,A Jmp Display showB: Mov dl,B Display: Mov ah,02h Int 21h Loop next Mov ax,4c00h Int 21h Code ends end start,4.6.3 循環(huán)程序設(shè)計(jì),4.6.3 循環(huán)程序設(shè)計(jì),3. 雙重循環(huán)程序設(shè)計(jì) 例4.12編制程序?qū)崿F(xiàn)延時(shí)1ms。延時(shí)程序就是讓計(jì)算機(jī)執(zhí)行一些空操作或無(wú)用操作,來(lái)占用CPU的時(shí)間,從而達(dá)到延時(shí)的目的。通常用循環(huán)程序?qū)崿F(xiàn)。程序片段如下: MOV CX,374 DELAY1:PUSHF ;10T POPF ;8T LOOP DELAY1 ;3.4T,4.6.3 循環(huán)程序設(shè)計(jì),上邊程序段的循環(huán)體和循環(huán)控制部分是由指令PUSHF、POPF和LOOP構(gòu)成。這三條指令執(zhí)行所花費(fèi)的時(shí)鐘周期個(gè)數(shù)和為10+8+3.4=21.4。若CPU的主頻為8MHz,那么它的時(shí)鐘周期為0.125S。如果要實(shí)現(xiàn)延時(shí)1ms,則該循環(huán)體重復(fù)連續(xù)執(zhí)行的次數(shù)為: 循環(huán)次數(shù)=1ms/(0.125S21.4)374,4.6.3 循環(huán)程序設(shè)計(jì),如果要延時(shí)100 ms,那么只需將這個(gè)程序再執(zhí)行100次,從而構(gòu)成一個(gè)雙重循環(huán)。其程序片段如下: MOV BL,100 ;4T1 DELAY2:MOV CX,374 ;4T2 DELAY1:PUSHF ;10T POPF ;8T LOOP DELAY1 ;3.4T DEC BL ;2T JNZ DELAY2 ;8T 顯然,該程序的準(zhǔn)確延時(shí)時(shí)間為:T=4T+100(4T+21.4T374+2T+8T)=100.22ms,4.6.3 循環(huán)程序設(shè)計(jì),延時(shí)程序: Mov di,30000 Delay: Mov si,30000 Delay1: dec si Jnz Delay1 dec di jnz Delay,4.6.4 子程序設(shè)計(jì),1. 子程序的調(diào)用和返回 過(guò)程具有特定功能的代碼塊 過(guò)程名 proc attribute 過(guò)程名 endp 其中,過(guò)程名為標(biāo)識(shí)符,又是子程序入口的符號(hào)地址,attribute是類(lèi)型屬性,可以是Near或Far 調(diào)用程序和過(guò)程在同一個(gè)代碼段中則使用Near屬性 調(diào)用程序和過(guò)程不在同一個(gè)代碼段中則使用Far屬性 子程序用CALL指令調(diào)用,返回用ret指令。,調(diào)用子程序的過(guò)程:,CALL ProcA,主程序,RET,子程序,下一條指令,ProcA:,斷點(diǎn)(CS:IP) 放入堆棧區(qū),4.6.4 子程序設(shè)計(jì),例4.24 子程序的定義、調(diào)用和返回示意 CODE1 SEGMENT CALL PROC1 AAA: PROC1 PROC RET PROC1 ENDP PROC2 PROC FAR RET PROC2 ENDP CODE1 ENDS CODE2 SEGMENT CALL PROC2 BBB: CODE2 ENDS,例4.24中,CALL PROC1匯編后形成段內(nèi)調(diào)用,CALL PROC2形成段間調(diào)用。AAA和BBB是兩個(gè)返回地址。,4.6.4 子程序設(shè)計(jì),子程序最后一條執(zhí)行的指令一定是返回指令RET,RET指令能按照CALL指令的不同格式,由匯編程序匯編形成段內(nèi)返回(過(guò)程PROC1中的RET指令)和段間返回(PROC2中的RET指令),并將控制返回到主程序斷點(diǎn)。如在例4.24中,子程序PROC1返回后,從AAA處開(kāi)始執(zhí)行,子程序PROC2返回后,從BBB處開(kāi)始執(zhí)行。,4.6.4 子程序設(shè)計(jì),2.編制子程序時(shí)的注意事項(xiàng) 子程序設(shè)計(jì)要求:通用性強(qiáng),獨(dú)立性好,程序目標(biāo)代碼短,占用內(nèi)存少,執(zhí)行速度快,結(jié)構(gòu)清晰,有詳細(xì)的功能、參數(shù)說(shuō)明。 需要注意如下三點(diǎn): 參數(shù)傳遞 主程序每次調(diào)用子程序時(shí),必須給它賦予處理的數(shù)據(jù)到約定的地址單元中,這些數(shù)據(jù)被稱(chēng)為參數(shù)。 主程序和子程序間的數(shù)據(jù)傳遞稱(chēng)為參數(shù)傳遞。 主程序傳遞給子程序的參數(shù)稱(chēng)為子程序的入口參數(shù), 子程序返回給主程序的參數(shù)稱(chēng)為出口參數(shù)。,4.6.4 子程序設(shè)計(jì), 信息保護(hù) 保護(hù)現(xiàn)場(chǎng):將子程序用到的寄存器壓入堆棧保護(hù)的過(guò)程稱(chēng)為保護(hù)現(xiàn)場(chǎng)。 恢復(fù)現(xiàn)場(chǎng):將寄存器從堆棧中彈出恢復(fù)的過(guò)程。 保護(hù)和恢復(fù)現(xiàn)場(chǎng)的工作可以在調(diào)用程序中進(jìn)行,也可以在子程序中進(jìn)行。 子程序的說(shuō)明 子程序名、功能、技術(shù)指標(biāo) 子程序入口、出口參數(shù) 子程序使用到的寄存器和存儲(chǔ)單元 是否又調(diào)用其他子程序,4.6.4 子程序設(shè)計(jì),3.主程序與子程序之間的參數(shù)傳遞 (1) 利用寄存器和存儲(chǔ)區(qū)傳送參數(shù) 寄存器傳遞參數(shù):這種方式方便,快速,但只適合參數(shù)較少的情況. 存儲(chǔ)區(qū)傳遞參數(shù):主程序和子程序之間可以利用指定的存儲(chǔ)變量進(jìn)行參數(shù)傳遞,這種方式適合參數(shù)較多的情況。見(jiàn)CH414_1.doc (2) 利用地址表傳送參數(shù) 轉(zhuǎn)子程序前,將參數(shù)地址放入一個(gè)表中,將表的首地址作為入口參數(shù)傳遞給子程序,由子程序根據(jù)參數(shù)表中的地址取出對(duì)應(yīng)參數(shù)。見(jiàn)ch414_2.doc,4.6.4 子程序設(shè)計(jì),(3)用堆棧傳遞參數(shù) 堆棧適合傳送參數(shù)多,并且子程序有嵌套、遞歸調(diào)用的情況,轉(zhuǎn)子程序前,將子程序用到的參數(shù)壓入堆棧; 進(jìn)入子程序后,由子程序從堆棧中取出所用參數(shù); 對(duì)于這種參數(shù)傳遞方法,在子程序中經(jīng)常采用使用帶位移量的返回指令RET n,它可以在恢復(fù)斷點(diǎn)后,將堆棧指針SP加n,從而跳過(guò)參數(shù)區(qū),使SP指向參數(shù)壓入堆棧前的那個(gè)單元。 見(jiàn)ch414_3.doc,略,4.6.5實(shí)用程序舉例排序,一. 排序 例4.17 設(shè)有一個(gè)首地址為ARRAY的N字節(jié)數(shù)組,編程序?qū)⑺鼈儼磸拇蟮叫〉捻樞蚺帕?算法設(shè)計(jì):采用冒泡法排序(從大到?。?。,8 16 15 85 32,原始數(shù)據(jù),第1趟,第2趟,第3趟,第4趟,16 15 85 32 8,16 85 32 15 8,85 32 16 158,85 3216158,圖4.13 冒泡排序法程序流程 從大到小排序 有N個(gè)數(shù),則排序N-1次 每一次排序過(guò)程,兩兩比較,若前一個(gè)小于后一個(gè)則交換(即小的交換到后面),否則繼續(xù)。 雙重循環(huán)實(shí)現(xiàn),外循環(huán)控制比較次數(shù),內(nèi)循環(huán)控制相鄰元素的比較,第i輪比較的內(nèi)循環(huán)次數(shù)是N-i次。 標(biāo)志位的設(shè)立是提高程序效率。,課后思考:若要求從小到大排序,如何實(shí)現(xiàn)?,8 16 15 85 32,原始數(shù)據(jù),8 15 16 32 85,第1趟,第2趟,8 15 16 32 85,第3趟,8 15 16 32 85,4.6.5實(shí)用程序舉例代碼轉(zhuǎn)換,二. 代碼轉(zhuǎn)換 數(shù)據(jù)輸入輸出過(guò)程,ASCII碼,鍵盤(pán)輸入,內(nèi)部存儲(chǔ),二進(jìn)制數(shù),顯示,Ascii碼(串),計(jì)算機(jī)直接按二進(jìn)制數(shù)的運(yùn)算規(guī)則來(lái)進(jìn)行算術(shù)運(yùn)算,字符碼與二進(jìn)制數(shù)的轉(zhuǎn)換,二進(jìn)制十六進(jìn)制,BCD碼十進(jìn)制數(shù),二進(jìn)制十進(jìn)制數(shù),4.6.5實(shí)用程序舉例代碼轉(zhuǎn)換,(1) ASCII字符碼轉(zhuǎn)換為二進(jìn)制數(shù) 從鍵盤(pán)上獲得的是ASCII碼,需轉(zhuǎn)換成二進(jìn)制數(shù)才能參數(shù)算術(shù)邏輯運(yùn)算。以輸入數(shù)字78(ASCII碼為3738H)為例,轉(zhuǎn)換的過(guò)程如
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 游戲注意安全
- 內(nèi)蒙古化工職業(yè)學(xué)院《銀行業(yè)務(wù)模擬實(shí)訓(xùn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 新疆科信職業(yè)技術(shù)學(xué)院《口腔正畸學(xué)基礎(chǔ)與臨床》2023-2024學(xué)年第二學(xué)期期末試卷
- 柳州鐵道職業(yè)技術(shù)學(xué)院《固態(tài)電子與光電子》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東省棗莊市第十六中學(xué)2025年高考摸底測(cè)試語(yǔ)文試題含解析
- 三峽電力職業(yè)學(xué)院《外國(guó)文學(xué)導(dǎo)讀》2023-2024學(xué)年第一學(xué)期期末試卷
- 蒸氣管道安裝方案
- 2025經(jīng)濟(jì)適用房轉(zhuǎn)讓合同書(shū)范文
- 2025星辰科技經(jīng)銷(xiāo)合同書(shū)
- 承壓水罐施工方案
- 壓裂施工安全操作規(guī)定(正式)
- 生理衛(wèi)生教學(xué)【青春期男生性教育】走向成熟課件
- 人工呼吸的三種方式和操作方法課件
- 項(xiàng)目基坑坍塌事故專(zhuān)項(xiàng)應(yīng)急預(yù)案桌面演練腳本
- 無(wú)創(chuàng)通氣常用模式與參數(shù)調(diào)節(jié)
- 清遠(yuǎn)市城市樹(shù)木修剪技術(shù)指引(試行)
- GB∕T 8427-2019 紡織品 色牢度試驗(yàn) 耐人造光色牢度:氙弧
- 退休人員實(shí)行社區(qū)管理申請(qǐng)書(shū)
- 全國(guó)同等學(xué)力工商管理大綱重點(diǎn)整理
- 機(jī)耕道監(jiān)理實(shí)施細(xì)則完整
評(píng)論
0/150
提交評(píng)論