版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
M/
《微型計(jì)算機(jī)原理與接口技術(shù)》第5版第3章8086的尋址方式和指令系統(tǒng)§3.38086的指令系統(tǒng)3.3.1數(shù)據(jù)傳送指令3.3.2算術(shù)運(yùn)算指令3.3.3邏輯運(yùn)算和移位指令3.3.4字符串處理指令3.3.5控制轉(zhuǎn)移指令3.3.6處理器控制指令3.3.3邏輯運(yùn)算和移位指令邏輯運(yùn)算和移位指令,對字節(jié)或字操作數(shù)進(jìn)行按位操作,見表3.7。1.邏輯運(yùn)算指令(LogicalOperations)1)NOT取反指令
(LogicalNot)指令格式:NOT 目的指令功能:目的←目的取反目的操作數(shù)可以是8位或16位寄存器或存儲(chǔ)器,對存儲(chǔ)器操作數(shù)要說明類型。例3.65NOT指令只有一個(gè)操作數(shù),介紹幾種用法。NOTAX ;AX←AX取反NOTBL ;BL←BL取反NOTBYTEPTR[BX]
;對存儲(chǔ)器字節(jié)單元內(nèi)容取反后送回該單元
以下為雙操作數(shù)指令。源操作數(shù)可以是8或16位立即數(shù)、寄存器、存儲(chǔ)器,目的操作數(shù)只能是寄存器或存儲(chǔ)器,兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器。指令執(zhí)行后,均將CF和OF清0,ZF、SF和PF反映操作結(jié)果,AF未定義,源操作數(shù)不變。2)AND邏輯與指令
(LogicalAND)指令格式:AND 目的,源指令功能:
目的←目的∧源主要用于使操作數(shù)的某些位保留(和“1”相與),而使某些位清除(和“0”相與)。例3.66設(shè)AX中是數(shù)字5和8的ASCII碼,即AX=3538H,將它們轉(zhuǎn)換成BCD碼,結(jié)果仍放回AX。指令如下:AND AX,0F0FH ;AX←0508H。屏蔽高4位,
;截得低4位3)OR邏輯或指令
(LogicalOR)指令格式:OR 目的,源指令功能:目的←目的∨源它主要用于使操作數(shù)的某些位保留(和“0”相或),而使某些位置1(和“1”相或)。例3.67設(shè)AX中存有兩個(gè)BCD數(shù)0508H,要將它們分別轉(zhuǎn)換成ASCII碼,結(jié)果仍在AX中。可用如下指令實(shí)現(xiàn):OR AX,3030H ;AX←3538H1.邏輯運(yùn)算指令1.邏輯運(yùn)算指令4)XOR異或操作指令
(ExclusiveOR)指令格式:XOR 目的,源指令功能:對兩個(gè)操作數(shù)進(jìn)行按位邏輯異或運(yùn)算,結(jié)果送回目的操作數(shù),即目的←目的源用于使操作數(shù)的某些位保留(和“0”相異或),而使某些位取反(和“1”相異或)。例3.68若AL中存有某外設(shè)端口的狀態(tài)信息,其中D1位控制揚(yáng)聲器發(fā)聲,要求該位在0和1之間來回變化,原來是1變成0,原來是0變成1,其余各位保留不變。可用以下指令實(shí)現(xiàn):XORAL,00000010B1.邏輯運(yùn)算指令5)TEST測試指令
(Test)指令格式:TEST目的,源指令功能:目的∧源,并修改標(biāo)志位,但不回送結(jié)果它常用在要檢測某些條件是否滿足,但又不希望改變原有操作數(shù)的情況下。1.邏輯運(yùn)算指令例3.69設(shè)AL寄存器中存有報(bào)警標(biāo)志。若D7=1,表示溫度報(bào)警,程序要轉(zhuǎn)到溫度報(bào)警處理程序T_ALARM;D6=1,則轉(zhuǎn)壓力報(bào)警程序P_ALARM。為此,可用TEST指令來實(shí)現(xiàn)這種功能: TEST AL,80H ;查AL的D7=1? JNZ T_ALARM ;是1(非零),則轉(zhuǎn)
;溫度報(bào)警程序 TEST AL,40H ;D7=0,D6=1? JNZ P_ALARM ;是1,轉(zhuǎn)壓力報(bào)警其中,JNZ為條件轉(zhuǎn)移指令,表示結(jié)果非0(ZF=1)則轉(zhuǎn)移。2.算術(shù)邏輯移位指令
(ShiftArithmeticandShiftLogical)可對寄存器或存儲(chǔ)器中的字或字節(jié)的各位進(jìn)行算術(shù)移位或邏輯移位,移動(dòng)的次數(shù)由指令中的計(jì)數(shù)值決定,如圖3.17。1)SAL算術(shù)左移指令
(ShiftArithmeticLeft)指令格式:SAL 目的,計(jì)數(shù)值2)SHL邏輯左移指令
(ShiftLogicLeft)指令格式:SHL 目的,計(jì)數(shù)值指令功能:以上兩條指令的功能完全相同。均將目的操作數(shù)的各位左移,每移一次,最低位LSB補(bǔ)0,最高位MSB進(jìn)標(biāo)志位CF。移動(dòng)一次,相當(dāng)于將目的操作數(shù)乘以2。計(jì)數(shù)值表示移位次數(shù),可以是1。若大于1,則用CL存放,并要事先將次數(shù)存入CL。移位次數(shù)最多為31(即00011111B)。2.算術(shù)邏輯移位指令例3.70MOV AH,00000110B;AH=06HSAL AH,1 ;將AH內(nèi)容左移一位后,
;AH=0CHMOV CL,03H ;CL←移位次數(shù)3SHL DI,CL ;將DI內(nèi)容左移3次SAL BYTEPTR[BX],1
;將內(nèi)存單元字節(jié)左移1位2.算術(shù)邏輯移位指令3)SHR邏輯右移指令
(ShiftLogicRight)指令格式:SHR目的,計(jì)數(shù)值指令功能:使目的操作數(shù)各位右移,每移一次,最低位進(jìn)入CF,最高位補(bǔ)0。右移次數(shù)由計(jì)數(shù)值決定,同SAL/SHL指令一樣。若目的操作數(shù)為無符號(hào)數(shù),每右移一次,使目的操作數(shù)除以2。例3.71用右移的方法做除法133/8=16…5,即:MOV AL, 10000101B ;AL=133MOV CL, 03H ;CL=移位次數(shù)SHR AL, CL ;右移3次,AL=10H,余數(shù)5丟失
2.算術(shù)邏輯移位指令4)SAR算術(shù)右移指令
(ShiftArithmeticRight)指令格式:SAR目的,計(jì)數(shù)值指令功能:每移位一次,最低位進(jìn)入CF,但最高位(即符號(hào)位)保持不變,而不是補(bǔ)0。相當(dāng)于對帶符號(hào)數(shù)進(jìn)行除2操作。例3.72用SAR指令計(jì)算-128/8=-16的程序段如下:MOV AL,10000000B ;AL=128MOV CL,03H ;右移次數(shù)為3SAR AL,CL ;算術(shù)右移3次后,
;AL=0F0H=163.循環(huán)移位指令(Rotate)算術(shù)邏輯移位指令,移出的操作數(shù)數(shù)位均丟失。循環(huán)移位指令則把數(shù)位從操作數(shù)的一端移到其另一端,從操作數(shù)中移走的位不會(huì)丟失。1)ROL循環(huán)左移指令
(RotateLeft)指令格式:ROL目的,計(jì)數(shù)值
2)ROR循環(huán)右移指令
(RotateRight)指令格式:ROR目的,計(jì)數(shù)值3)RCL通過進(jìn)位位循環(huán)左移
(RotatethroughCarryLeft)指令格式:RCL目的,計(jì)數(shù)值
4)RCR通過進(jìn)位位循環(huán)右移(RotatethroughCarryRight)指令格式:RCR目的,計(jì)數(shù)值3.循環(huán)移位指令(Rotate)3.循環(huán)移位指令
目的操作數(shù)可以是8/16位的寄存器操作數(shù)或內(nèi)存操作數(shù),計(jì)數(shù)值含義同上,即1或由CL指定。ROL和ROR為小循環(huán)移位指令,沒有把CF包含在循環(huán)中;RCL和RCR為大循環(huán)指令,把CF作為整個(gè)循環(huán)的一部分參加循環(huán)移位。CF的值由最后一次被移出的值決定。例3.73ROL BX,CL
;將BX中的數(shù),不帶進(jìn)位位左移規(guī)定次數(shù)RORWORDPTR[SI],1
;將內(nèi)存單元的字,不帶進(jìn)位右移1次3.循環(huán)移位指令
例3.74設(shè)CF=1,AL=10110100B若執(zhí)行指令ROLAL,1則AL=01101001B,CF=1,OF=1;若執(zhí)行指令RORAL,1則AL=01011010B,CF=0,OF=1;若執(zhí)行指令RCRAL,1則AL=11011010B,CF=0,OF=0;若執(zhí)行指令MOVCL,3和RCLAL,CL則AL=10100110B,CF=1,OF不確定?!?.38086的指令系統(tǒng)3.3.1數(shù)據(jù)傳送指令3.3.2算術(shù)運(yùn)算指令3.3.3邏輯運(yùn)算和移位指令3.3.4字符串處理指令3.3.5控制轉(zhuǎn)移指令3.3.6處理器控制指令3.3.4字符串處理指令字符串是指一系列存放在存儲(chǔ)器中的字或字節(jié)數(shù)據(jù)。使用字符串操作指令時(shí),可用指令中的源串和目的串名(即操作數(shù))來表明是字節(jié)還是字,也可在指令助記符后加B說明是字節(jié),加W說明是字操作,每種指令就都有3種格式。5條1字節(jié)字符串操作指令見表3.8。字符串指令執(zhí)行時(shí),必須遵守以下的隱含約定:(1)源串位于數(shù)據(jù)段中,源串字符的始址(或末址)為DS:SI。(2)目的串位于附加段中,目的串字符的始址(或末址)為ES:DI。(3)每執(zhí)行一次字符串指令,指針SI和DI會(huì)自動(dòng)修改,指向下一待操作單元。(4)DF標(biāo)志控制字符串處理的方向:DF=0遞增。執(zhí)行一次字節(jié)串操作,SI、DI各+1;字串操作,SI和DI各+2;DF=1遞減。執(zhí)行一次字節(jié)串操作,SI、DI各1;字串操作,SI和DI各2。STD指令使DF=1,CLD指令使DF=0。(5)CX=要處理的字符串長度(字節(jié)或字?jǐn)?shù))。字符串處理指令為加快串運(yùn)算指令的執(zhí)行速度,可在基本指令前加重復(fù)前綴,使數(shù)據(jù)串指令重復(fù)執(zhí)行。每重復(fù)執(zhí)行一次,SI和DI都根據(jù)方向標(biāo)志自動(dòng)修改,CX的值則自動(dòng)減1。能與基本指令配合使用的重復(fù)前綴有:REP 無條件重復(fù)
(Repeat)REPE/REPZ 相等/結(jié)果為零則重復(fù)
(RepeatwhileEqual/Zero)REPNE/REPNZ 不相等/結(jié)果非零則重復(fù)
(RepeatwhileNotEqual/NotZero)
1.MOVS字符串傳送指令(MoveString)指令格式:MOVS目的串,源串指令功能:把源串中的一個(gè)字節(jié)或字,傳送目的串中,且自動(dòng)修改指針SI和DI。利用MOVS指令,能很方便地將數(shù)據(jù)從內(nèi)存的某一地址(源地址)傳送到另一個(gè)地址(目的地址),還能自動(dòng)修改源和目的地址。若使用重復(fù)前綴,可用一條指令傳送一批數(shù)據(jù)。例3.75要求把數(shù)據(jù)段中以SRC-MESS為偏移地址的一串字符“HELLO!”,傳送到附加段中以NEW-LOC開始的單元中。實(shí)現(xiàn)該操作的程序如下:比較發(fā)現(xiàn),使用有重復(fù)前綴REP的MOVSB指令,程序更簡潔。2.CMPS字符串比較指令(CompareString)指令格式:CMPS 目的串,源串指令功能:將源串中數(shù)據(jù)減去目的串?dāng)?shù)據(jù),但不改變兩數(shù)據(jù)串的原始值,結(jié)果反映在標(biāo)志位上。操作后源串和目的串指針會(huì)自動(dòng)修改。常用此指令來比較兩個(gè)串是否相同,并由其后的條件轉(zhuǎn)移指令,根據(jù)CMPS執(zhí)行后的標(biāo)志位值,決定程序的轉(zhuǎn)向。CMPS指令前可加重復(fù)前綴,下面每兩條指令功能相同:REPECMPS
;若CX≠0(未比完)和REPZCMPS
;ZF=1(兩串相等),則重復(fù)REPNECMPS
;若CX≠0(串沒有結(jié)束)和串不相等REPNZCMPS;(ZF=0),則重復(fù)比較。2.CMPS字符串比較指令例3.76比較兩個(gè)字符串,一個(gè)是在程序中設(shè)定的口令串PASSWORD,另一個(gè)是從鍵盤輸入的字符串IN-WORD,若輸入串與口令串相同,程序開始執(zhí)行。否則程序驅(qū)動(dòng)揚(yáng)聲器發(fā)聲,警告用戶口令不符,拒絕往下執(zhí)行。這可以用CMPS指令來實(shí)現(xiàn),有關(guān)程序段如下:DATASEGMENT
;數(shù)據(jù)段PASSWORDDB ‘8086CPUI’ ;口令串IN_WORD DB ‘8088CPU’ ;從鍵盤輸入的串COUNT EQU 8 ;串長度DATA ENDS2.CMPS字符串比較指令CODESEGMENT
;代碼段 ASSUMEDS:DATA,ES:DATA … LEASI,PASSWORD ;源串指針
LEADI,IN_WORD
;目的串指針 MOVCX,COUNT ;串長度 CLD ;地址增量
REPZCMPSB;CX≠0且串相等時(shí)重復(fù)比較 JNESOUND;若不相等,轉(zhuǎn)發(fā)聲程序OK: … ;比完且相等,往下執(zhí)行 …SOUND: … ;使PC機(jī)揚(yáng)聲器發(fā)聲 … ;并退出CODEENDS3.SCAS字符串掃描指令(ScanString)指令格式:SCAS目的串指令功能:從AL(字節(jié)操作)或AX(字操作)寄存器的內(nèi)容,減去ES:DI為指針的目的串元素,結(jié)果反映在標(biāo)志位上,但不改變源操作數(shù)。串操作后目的串指針DI會(huì)自動(dòng)修改。利用SCAS指令,可在內(nèi)存中搜索所需要的數(shù)據(jù)(關(guān)鍵字)。指令執(zhí)行前,必須事先將它存在AL(字節(jié))或AX(字)中。SCAS指令前也可加重復(fù)前綴。3.SCAS字符串掃描指令例3.77在某字符串中搜尋字符A。若有,搜索次數(shù)送到BX;若無,將BX清0。設(shè)字符串始址STRING的偏址為0,字符串長度為CX。程序段如下:MOVDI,OFFSETSTRING;DI=字符串偏移地址MOVCX,COUNT ;CX=字符串長度MOVAL,‘A’ ;AL=關(guān)鍵字A的ASCII碼CLD ;清方向標(biāo)志REPNESCASB ;CX≠0(沒查完)和
;ZF=0(不相等)時(shí)重復(fù)JZFIND ;若ZF=1,已搜到,轉(zhuǎn)出MOVDI,0 ;若ZF=0,沒搜到,DI←0FIND:MOVBX,DI ;BX←搜索次數(shù)HLT ;停機(jī)4.LODS數(shù)據(jù)串裝入指令(LoadString)指令格式:LODS源串指令功能:把數(shù)據(jù)段中以SI作為指針的串元素,傳送到AL(字節(jié)操作)或AX(字操作)中,同時(shí)修改SI。為該指令加重復(fù)前綴沒有意義。因?yàn)槊恐貜?fù)傳送一次數(shù)據(jù),累加器中的內(nèi)容就被改寫,執(zhí)行重復(fù)傳送操作后,只能保留最后寫入的那個(gè)數(shù)據(jù)。
5.STOS數(shù)據(jù)串存儲(chǔ)指令(StoreString)指令格式:STOS目的串指令功能:將累加器AL或AX中的一個(gè)字節(jié)或字,傳送到以ES:DI為目標(biāo)指針的目的串中,同時(shí)修改DI,以指向串中的下一個(gè)單元。STOS指令與REP重復(fù)前綴連用,即執(zhí)行指令REPSTOS,能方便地用累加器中的一個(gè)常數(shù),對一個(gè)數(shù)據(jù)串進(jìn)行初始化。例如,初始化為全0的串。5.STOS數(shù)據(jù)串存儲(chǔ)指令例3.78數(shù)據(jù)段中有個(gè)數(shù)據(jù)塊,
存有8位帶符號(hào)數(shù),始址BLOCK,要求將正、負(fù)數(shù)分開,正數(shù)送到附加段中始址為PLUS_DATA的緩沖區(qū),負(fù)數(shù)送到附加段中始址為MINUS_DATA的緩沖區(qū)。數(shù)據(jù)塊可看成一個(gè)數(shù)據(jù)串,用SI作源串指針,DI和BX作正、負(fù)數(shù)目的緩沖區(qū)指針,CX控制循環(huán)次數(shù)。程序段如下:
START:MOVSI,OFFSETBLOCK ;SI為源串指針MOVDI,OFFSETPLUS_DATA
;DI為正數(shù)目的區(qū)指針MOVBX,OFFSETMINUS_DATA
;BX為負(fù)數(shù)目的區(qū)指針MOVCX,COUNT ;CX放循環(huán)次數(shù)CLDGOON:
LODSBLOCK ;AL←取源串的一個(gè)字節(jié)TESTAL,80H ;是負(fù)數(shù)?JNZ MINUS ;是,轉(zhuǎn)MINUS
STOSB
;非負(fù)數(shù),將字節(jié)送正數(shù)區(qū)JMPAGAIN ;處理下一個(gè)字節(jié)MINUS:
XCHGBX,DI ;交換正負(fù)數(shù)指針STOSB
;負(fù)數(shù)送入負(fù)數(shù)區(qū)XCHGBX,DI ;恢復(fù)正負(fù)數(shù)指針AGAIN:
DECCX ;次數(shù)減1JNZ GOON ;未處理完,繼續(xù)傳送HLT ;已完,停機(jī)5.STOS數(shù)據(jù)串存儲(chǔ)指令程序中,正負(fù)數(shù)的存儲(chǔ)均使用STOSB指令,該指令必須以SI為源指針,DI為目的指針。但存儲(chǔ)負(fù)數(shù)時(shí),負(fù)數(shù)區(qū)的目的指針在BX中,因此要用XCHG指令將BX內(nèi)容送進(jìn)DI,讓DI指向負(fù)數(shù)區(qū),同時(shí)也把DI中的正數(shù)區(qū)目的指針保護(hù)起來。執(zhí)行STOSB指令后,再用XCHG指令將BX和DI交換回來,以便下次轉(zhuǎn)回GOON標(biāo)號(hào)后,LODS指令仍能正確執(zhí)行?!?.38086的指令系統(tǒng)3.3.1數(shù)據(jù)傳送指令3.3.2算術(shù)運(yùn)算指令3.3.3邏輯運(yùn)算和移位指令3.3.4字符串處理指令3.3.5控制轉(zhuǎn)移指令3.3.6處理器控制指令3.3.5控制轉(zhuǎn)移指令通常,程序中的指令都是順序地逐條執(zhí)行的,執(zhí)行順序由CS和IP決定,每取出一條指令,指令指針I(yè)P自動(dòng)進(jìn)行調(diào)整,指向下一個(gè)存儲(chǔ)單元。利用控制轉(zhuǎn)移指令可以改變CS和IP的值,從而改變指令的執(zhí)行順序。8086提供了5類轉(zhuǎn)移指令,如表3.9??刂妻D(zhuǎn)移指令1.無條件轉(zhuǎn)移和過程調(diào)用指令
(UnconditionalTransferandCall)1)JMP無條件轉(zhuǎn)移指令
(Jump)指令格式:JMP 目的指令功能:無條件地轉(zhuǎn)移到目的地址去執(zhí)行。這類指令又分成兩種類型:段內(nèi)轉(zhuǎn)移或近(NEAR)轉(zhuǎn)移。轉(zhuǎn)移指令的目的地址和JMP指令在同一代碼段中,轉(zhuǎn)移時(shí)僅改變IP的內(nèi)容,段地址CS的值不變。段間轉(zhuǎn)移,又稱遠(yuǎn)(FAR)轉(zhuǎn)移。轉(zhuǎn)移指令的目的地址和JMP指令不在同一段中,轉(zhuǎn)移時(shí),CS和IP的值都要改變,程序要轉(zhuǎn)移到另一個(gè)代碼段去執(zhí)行。無條件轉(zhuǎn)移指令就轉(zhuǎn)移地址提供的方式而言,又可分為兩種方式:直接轉(zhuǎn)移。在指令碼中直接給出轉(zhuǎn)移的目的地址,目的操作數(shù)用一個(gè)標(biāo)號(hào)來表示。它又可分為段內(nèi)直接轉(zhuǎn)移和段間直接轉(zhuǎn)移。間接轉(zhuǎn)移。目的地址包含在某個(gè)16位寄存器或存儲(chǔ)單元中,CPU必須根據(jù)寄存器或存儲(chǔ)器尋址方式,間接地求出轉(zhuǎn)移地址。同樣,這種轉(zhuǎn)移類型又可分為段內(nèi)間接轉(zhuǎn)移和段間間接轉(zhuǎn)移。所以無條件轉(zhuǎn)移指令可分成段內(nèi)直接轉(zhuǎn)移、段內(nèi)間接轉(zhuǎn)移、段間直接轉(zhuǎn)移和段間間接轉(zhuǎn)移四種不同類型和方式,如表3.10所示。無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令
(1)段內(nèi)直接轉(zhuǎn)移指令指令格式:
JMPSHORT標(biāo)號(hào)
JMPNEARPTR標(biāo)號(hào)(或JMP標(biāo)號(hào))段內(nèi)相對轉(zhuǎn)移指令,目的操作數(shù)均用標(biāo)號(hào)表示。轉(zhuǎn)向的有效地址=IP+8位/16位位移量(DISP)。若轉(zhuǎn)移范圍在-128~+127字節(jié)內(nèi),稱為短轉(zhuǎn)移,指令中只需要用8位位移量,在標(biāo)號(hào)前加說明符SHORT。若位移量是16位,稱為近轉(zhuǎn)移,目的地址與當(dāng)前IP的距離在-32768~字節(jié)之間。可加說明符NEARPTR,也可省略。這類指令用得最多。無條件轉(zhuǎn)移指令例3.79給出一個(gè)含有一條無條件轉(zhuǎn)移指令的簡單程序的列表文件,它是由匯編語言源程序經(jīng)匯編程序翻譯后產(chǎn)生的。即
對程序的解釋請參看教材。無條件轉(zhuǎn)移指令(2)段內(nèi)間接轉(zhuǎn)移指令轉(zhuǎn)向的16位地址存放在一個(gè)16位寄存器或字存儲(chǔ)器單元中。用寄存器間接尋址的段內(nèi)轉(zhuǎn)移指令,轉(zhuǎn)向的地址存放在寄存器中,執(zhí)行操作:IP←寄存器內(nèi)容。例3.80JMPBX
若指令執(zhí)行前,BX=4500H;指令執(zhí)行時(shí),IP←4500H,程序轉(zhuǎn)到代碼段內(nèi)偏移地址為4500H處執(zhí)行。無條件轉(zhuǎn)移指令用存儲(chǔ)器間接尋址的段內(nèi)轉(zhuǎn)移指令,先計(jì)算出存儲(chǔ)單元的物理地址,再從中取一個(gè)字送到IP。即IP←字存儲(chǔ)單元內(nèi)容。例3.81JMPWORDPTR5[BX]
;WORDPTR說明是字操作設(shè)指令執(zhí)行前DS=2000H,BX=100H,(20105H)=4F0H;則指令執(zhí)行后IP=(20000H+100H+5H)=(20105H)=4F0H,
轉(zhuǎn)到段內(nèi)IP=4F0H處執(zhí)行。無條件轉(zhuǎn)移指令(3)段間直接(遠(yuǎn))轉(zhuǎn)移指令指令中用遠(yuǎn)標(biāo)號(hào)直接給出轉(zhuǎn)向的CS:IP,程序從一個(gè)代碼段轉(zhuǎn)到另一個(gè)代碼段。例3.82JMPFARPTRPROG_F
;FARPTR說明PROG_F為遠(yuǎn)標(biāo)號(hào)指令執(zhí)行的操作:IP←PROG_F的段內(nèi)偏移量CS←PROG_F所在段的段地址設(shè)標(biāo)號(hào)PROG_F的邏輯地址=3500H:080AH,則:指令執(zhí)行后,IP=080AH,CS=3500H,程序轉(zhuǎn)到3500:080AH處執(zhí)行。無條件轉(zhuǎn)移指令(4)段間間接轉(zhuǎn)移指令操作數(shù)為存儲(chǔ)器,要轉(zhuǎn)移的目的地址CS:IP存放在存儲(chǔ)器中。需加說明符DWORDPTR,表示轉(zhuǎn)向地址需取雙字。例3.83JMPDWORDPTR[SIH]設(shè)指令執(zhí)行前,CS=1200H,IP=05H,DS=2500H,SI=1300H;內(nèi)存單元(26425H)=4500H,(26427H)=32F0H,指令中的位移量DISP=0125H。指令的執(zhí)行過程如圖3.20。無條件轉(zhuǎn)移指令過程調(diào)用指令2)過程調(diào)用和返回指令
(CallandReturn)把某些能完成特定功能又常用的程序段,編寫成獨(dú)立模塊,稱為過程(Procedure)或子程序(Subroutine)。在主程序中用CALL語句調(diào)用這些過程,格式為: CALL過程名過程以PROC開頭,ENDP結(jié)束。過程中要安排一條返回指令RET,過程執(zhí)行完后能正確返回主程序。若在過程運(yùn)行中又調(diào)用另一過程,稱為過程嵌套。主程序和過程在同一代碼段,稱為近調(diào)用,不在同一段則稱為遠(yuǎn)調(diào)用。過程調(diào)用的尋址方式與轉(zhuǎn)移指令類似,但沒有段內(nèi)短調(diào)用。由于調(diào)用結(jié)束后需返回原程序繼續(xù)運(yùn)行,要執(zhí)行保護(hù)和恢復(fù)返址操作,比轉(zhuǎn)移復(fù)雜。過程調(diào)用指令CALL指令分兩步執(zhí)行:第一步:返址入棧,將CALL下面指令的地址推入堆棧
近調(diào)用執(zhí)行的操作:SP←SP-2,IP入棧
遠(yuǎn)調(diào)用執(zhí)行的操作:SP←SP-2,CS入棧 SP←SP-2,IP入棧第二步:轉(zhuǎn)到子程序入口執(zhí)行相應(yīng)的子程序。入口地址由CALL指令的目的操作數(shù)提供,尋址方法與JMP指令類似。執(zhí)行過程中的RET指令時(shí),從棧中彈出返址,使程序返回主程序繼續(xù)執(zhí)行。也有兩種情況:從近過程返回,從棧中彈出1個(gè)字→IP,并且使SP←SP+2。從遠(yuǎn)過程返回,先從棧中彈出1個(gè)字→IP,并且使SP←SP+2;再彈出1個(gè)字→CS,并使SP←SP+2。設(shè)調(diào)用前:CS:IP=2000H:1050H,SS:SP=5000H:0100H,PROG-N與CALL指令之間的字節(jié)距離等于1234H(即DISP=1234H)。下面舉例說明CALL和RET指令的4種尋址方式。(1)段內(nèi)直接調(diào)用和返回例3.84CALLPROG-N ;PROG-N是一個(gè)近標(biāo)號(hào)該指令含3個(gè)字節(jié),編碼格式為:過程調(diào)用指令例3.84則執(zhí)行CALL指令的過程:SP←SP-2
即新的SP=0100H-2=00FEH返回地址的IP入棧由于存放CALL指令的內(nèi)存首地址為CS:IP=2000:1050H,該指令占3字節(jié),所以返回地址為2000:1053H,即IP=1053H。于是1053H被推入堆棧。根據(jù)當(dāng)前IP值和位移量DISP計(jì)算出新的IP值,作為子程序的入口地址,即
IP=IP+DISP=1053HH=2287H程序轉(zhuǎn)到本代碼段中偏移地址為2287H處執(zhí)行指令CALLPROG_N的執(zhí)行過程如圖3.21(a)RET指令的尋址方式與CALL一樣,在本例中也是段內(nèi)直接調(diào)用。執(zhí)行過程如下:IP←(SP和SP+1)單元內(nèi)容即返址IP=1053H從棧中彈出SP←SP+2SP=00FEH+2=0100H,即恢復(fù)原SP結(jié)果,返回CALL下面的那條指令,即從2000:1053處繼續(xù)執(zhí)行程序,如圖3.21(b)。過程調(diào)用指令(2)段內(nèi)間接調(diào)用和返回例3.85下面是兩條段內(nèi)間接調(diào)用指令的例子,返址在寄存器或內(nèi)存中。 CALL BX CALL WORDPTR[BX+SI]它們執(zhí)行的操作分三步,前兩步與直接調(diào)用相同,第三步不同,具體為:SP←SP-2IP入棧IP←EA,計(jì)算出目的地址的有效地址EA,送入IP,以此轉(zhuǎn)移。過程調(diào)用指令設(shè):DS=1000H,BX=200H,SI=300H,(10500H)=3210HCALLBX
轉(zhuǎn)移地址在BX中,此調(diào)用指令執(zhí)行后,IP←0200H,轉(zhuǎn)到段內(nèi)偏移地址為0200H處執(zhí)行。CALLWORDPTR[BX+SI]子程序入口地址在內(nèi)存字單元中,其值為(16×DS+BX+SI)=(10000HHH)=(10500H)=3210H,即EA=3210H
此指令執(zhí)行后,IP←3210H,轉(zhuǎn)到段內(nèi)偏移地址為3210H處執(zhí)行。對應(yīng)的RET指令執(zhí)行的操作與段內(nèi)直接過程的返回指令類似。
過程調(diào)用指令(3)段間直接調(diào)用
例3.86
CALLFARPTRPROG_F;PROG_F是一個(gè)遠(yuǎn)標(biāo)號(hào)
該指令含5個(gè)字節(jié),編碼格式為:設(shè)調(diào)用前:CS:IP=1000:205AH,SS:SP=2500:0050H,標(biāo)號(hào)PROG-F所在單元的地址指針CS:IP=3000:0500H。存放CALL指令的內(nèi)存首址為1000:205AH,由于該指令長度為5個(gè)字節(jié),所以返回地址應(yīng)為1000:205FH。過程調(diào)用指令執(zhí)行遠(yuǎn)調(diào)用CALL指令的過程如圖3.22所示,具體為:SP←SP-2 即SP=0050H-2=004EHCS入棧
即CS=1000H入棧
SP←SP-2 即SP←004CHIP入棧
即IP=205FH入棧轉(zhuǎn)子程序入口
將PROG-F的段地址和
偏移地址送CS:IP
即CS←3000H,IP←0500H執(zhí)行子程序PROG-F過程調(diào)用指令過程PROG-F中的RET指令的尋址方式也是段間直接調(diào)用,返回時(shí)執(zhí)行的操作為:SP←SP+2 即SP←004C+2=004EHIP←棧中內(nèi)容
IP←205FHSP←SP+2 SP←004EH+2=0050HCS←棧中內(nèi)容
CS←1000H所以程序轉(zhuǎn)返回地址CS:IP=1000:205FH處執(zhí)行。過程調(diào)用指令過程調(diào)用指令(4)段間間接調(diào)用操作數(shù)必須是存儲(chǔ)單元,從該單元開始存放的雙字表示過程的入口地址,指令中用DWORDPTR說明是對存儲(chǔ)單元進(jìn)行雙字操作。例3.87CALLDWORDPTR[BX]設(shè)調(diào)用前,DS=1000H,BX=200H,(10200H)=31F4H,(10202)=5200H。執(zhí)行時(shí)先將返址的CS:IP推入堆棧,再轉(zhuǎn)向過程入口。指令中操作數(shù)地址=DS×16+BX=10000H+200H=10200H從中取得的雙字就是過程入口地址,即:IP←(10200H) 即IP=31F4HCS←(10202H) 即CS=5200H過程調(diào)用指令8086還有另一種帶參數(shù)的返回指令,形式為:RETnn稱為彈出值,它讓CPU在彈出返回地址后,再從堆棧中彈出n個(gè)字節(jié)的數(shù)據(jù),也就是讓SP再加上n。n可以是0000~FFFFH范圍內(nèi)的任何一個(gè)偶數(shù)。例如,指令RET8,表示從堆棧中彈出地址后,再使SP的值加上8。過程調(diào)用指令2.條件轉(zhuǎn)移指令(ConditionalTransfer)將上條指令執(zhí)行后的狀態(tài)標(biāo)志,作為測試條件,來決定是否轉(zhuǎn)移。當(dāng)條件成立,程序轉(zhuǎn)向指令中給出的目的地址去執(zhí)行;否則,仍順序執(zhí)行。條件轉(zhuǎn)移均為段內(nèi)短轉(zhuǎn)移,轉(zhuǎn)移指令與目的地址必須在同一代碼段中。轉(zhuǎn)移距離范圍為-128~+127字節(jié)。8位偏移量需用符號(hào)擴(kuò)展法擴(kuò)展到16位后才能與IP相加。在指令中,目的地址均用標(biāo)號(hào)表示,指令格式:
條件操作符
標(biāo)號(hào)條件轉(zhuǎn)移指令共18條,歸類成直接標(biāo)志轉(zhuǎn)移和間接標(biāo)志轉(zhuǎn)移兩大類。
1)直接標(biāo)志轉(zhuǎn)移指令助記符中直接給出標(biāo)志狀態(tài)測試條件,以CF、ZF、SF、OF和PF等5個(gè)標(biāo)志的10種狀態(tài)為判斷條件,形成10條指令,如表3.11。有的指令有兩種助記符,代表同樣的指令,如JZ/JE。2.條件轉(zhuǎn)移指令例3.88求AL和BL中的兩數(shù)之和,若有進(jìn)位,則AH置1,否則AH清0。
程序如下: ADD AL,BL ;兩數(shù)相加 JC NEXT ;若有進(jìn)位,轉(zhuǎn)NEXT MOV AH,0 ;無進(jìn)位,AH清0 JMP EXIT ;往下執(zhí)行NEXT:
MOV AH,1 ;有進(jìn)位,AH置1EXIT:… ;程序繼續(xù)進(jìn)行2.條件轉(zhuǎn)移指令2)間接標(biāo)志轉(zhuǎn)移不在指令助記符中直接給出標(biāo)志狀態(tài)位的測試條件,但仍以某一個(gè)或幾個(gè)標(biāo)志的狀態(tài)組合為測試條件,若條件成立則轉(zhuǎn)移,否則順序往下執(zhí)行。間接標(biāo)志轉(zhuǎn)移指令共有8條,列于表3.12中。每條指令都有兩種不同的助記符。在無符號(hào)數(shù)比較測試指令中,指令助記符中的“A”是英文Above的縮寫,表示“高于”之意,“B”是英文Below的縮寫,表示“低于”之意。2.條件轉(zhuǎn)移指令間接標(biāo)志條件轉(zhuǎn)移指令2.條件轉(zhuǎn)移指令例3.89設(shè)AL=F0H,BL=35H,執(zhí)行指令CMPAL,BL ;AL-BLJAE NEXT;AL大于等于BL,則轉(zhuǎn)到NEXTJAE/JNB根據(jù)CF標(biāo)志是否為0決定轉(zhuǎn)移。若CF=0,即無進(jìn)位,則轉(zhuǎn)移,這與直接標(biāo)志轉(zhuǎn)移指令中的JNC功能完全一樣。同樣,JB/JNAE與JC指令的功能相同。帶符號(hào)數(shù)進(jìn)行比較時(shí),不能僅根據(jù)SF或OF標(biāo)志來判定,而要將它們組合起來考慮。指令助記符中,“G”(Greatthan)表示“大于”,“L”(Lessthan)表示“小于”。2.條件轉(zhuǎn)移指令例3.90設(shè)某學(xué)生的英語成績已存放在AL中,如低于60分打印F(FAIL);高于或等于85分,打印G(GOOD);在6084分之間,打印P(PASS)。程序?yàn)? CMPAL,60 ;與60分比較 JB FAIL ;<60,轉(zhuǎn)FAIL CMPAL,85 ;≥60,與85分比較 JAEGOOD ;≥85,轉(zhuǎn)GOOD MOVAL,‘P’ ;其它,將AL←‘P’ JMPPRINT ;轉(zhuǎn)打印程序FAIL:MOVAL,‘F’ ;AL←‘F’ JMPPRINT ;轉(zhuǎn)打印程序GOOD:MOVAL,‘G’ ;AL←‘G’PRINT:… ;打印存在AL中的字符2.條件轉(zhuǎn)移指令例3.91
設(shè)某溫度控制系統(tǒng)中,從溫度傳感器輸入一個(gè)8位二進(jìn)制攝氏溫度值。當(dāng)溫度低于100℃時(shí),打開加熱器;溫度升到100℃或以上時(shí),關(guān)閉加熱器。
溫度傳感器端口號(hào)為320H,控制加熱器的輸出信號(hào)連到端口321H的最低有效位,當(dāng)它置1加熱器打開,清0則關(guān)閉。
實(shí)現(xiàn)上述溫度控制的程序:GET-TEMP:
MOV DX,320H ;DX指向溫度輸入端口 IN AL,DX ;讀取溫度值 CMP AL,100 ;與100℃比較 JB HEAT_ON ;<100℃,加熱 JMP HEAT_OFF ;≥100℃,停止加熱HEAT-ON:
MOV AL,01H ;D0位置1,加熱 MOV DX,321H ;加熱器口地址 OUT DX,AL ;打開加熱器 JMP GET_TEMP ;繼續(xù)檢測溫度HEAT-OFF:
MOV AL,00 ;D0位置0,停止加熱 MOV DX,321H OUT DX,AL ;關(guān)閉加熱器
… ;進(jìn)行其它處理2.條件轉(zhuǎn)移指令例3.92在首地址為TABLE的10個(gè)內(nèi)存字節(jié)單元中,存放了10個(gè)帶符號(hào)數(shù),統(tǒng)計(jì)其中正數(shù)、負(fù)數(shù)和零的個(gè)數(shù),結(jié)果存入PLUS、NEGT和ZERO單元。TABLEDB 01H,80H,0F5H,32H,86H DB 74H,49H,0AFH,25H,40HPLUS DB 0 ;存正數(shù)個(gè)數(shù)NEGTDB 0 ;存負(fù)數(shù)個(gè)數(shù)ZERODB 0 ;存0的個(gè)數(shù) … MOVCX,10 ;數(shù)據(jù)總數(shù)MOVBX,0 ;BX清02.條件轉(zhuǎn)移指令A(yù)GAIN: CMPTABLE[BX],0 ;取一個(gè)數(shù)與0比 JGEGRET_EQ ;≥0,轉(zhuǎn)GRET_EQ INC NEGT ;<0,負(fù)數(shù)個(gè)數(shù)加1 JMP NEXT ;往下執(zhí)行GRET-EQ: JG P-INC ;>0,轉(zhuǎn)P-INC INC ZERO ;=0,零個(gè)數(shù)加1 JMP NEXT ;往下執(zhí)行P-INC:
INC PLUS ;正數(shù)個(gè)數(shù)加1NEXT: INC BX ;數(shù)據(jù)地址指針加1 DEC CX ;數(shù)據(jù)計(jì)數(shù)器減1 JNZ AGAIN ;未完,繼續(xù)統(tǒng)計(jì)3.循環(huán)控制指令(IterationControl)是一組增強(qiáng)型條件轉(zhuǎn)移指令,用來控制程序段的重復(fù)執(zhí)行,重復(fù)次數(shù)由CX中的內(nèi)容決定,轉(zhuǎn)移目標(biāo)都是短標(biāo)號(hào),偏移量都是負(fù)值,即只能向前轉(zhuǎn)移。均不影響任何標(biāo)志。1)LOOP循環(huán)指令
(Loop)指令格式:LOOP短標(biāo)號(hào)指令功能:重復(fù)執(zhí)行一系列指令。重復(fù)次數(shù)放在CX中,執(zhí)行一次指令,CX1。如減1后CX≠0,轉(zhuǎn)到指令給定的標(biāo)號(hào)處繼續(xù)循環(huán);CX=0,結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行LOOP指令后的那條指令。一條LOOP指令相當(dāng)于執(zhí)行以下兩條指令: DEC CX JNZ 標(biāo)號(hào)3.循環(huán)控制指令例3.93商店里有8種商品,價(jià)格為83元,76元,65元,84元,71元,49元,62元和58元,要將每種商品提價(jià)7元,編程計(jì)算每種商品提價(jià)后的價(jià)格。先將商品原價(jià)按BCD碼形式,依次存放在以O(shè)LD開始的8個(gè)存儲(chǔ)單元中,新價(jià)格存放進(jìn)以NEW開始的8個(gè)單元,然后用LOOP指令來實(shí)現(xiàn)8次循環(huán)。即
OLD DB 83H,76H,65H,84HDB 71H,49H,62H,58HNEW DB 8DUP(?)… 例3.93 MOV CX,08H ;共8種商品 MOV BX,00H ;BX作指針,初值為0NEXT: MOV AL,OLD[BX]
;讀入一個(gè)商品的原價(jià) ADD AL,7 ;加上提價(jià)因子 DAA ;調(diào)整為十進(jìn)制數(shù) MOV NEW[BX],AL ;存放結(jié)果 INC BX ;地址指針加1 LOOP NEXT ;未加滿8次,繼續(xù)循環(huán) … ;已加完8次3.循環(huán)控制指令循環(huán)操作也可以只含一條指令,即LOOP指令自身,這樣的程序段常用來實(shí)現(xiàn)延時(shí)。例如: MOV CX,10 ;循環(huán)次數(shù)為10DELAY:
LOOPDELAY ;本指令重復(fù)執(zhí)行10次3.循環(huán)控制指令例3.94用循環(huán)和跳轉(zhuǎn)指令,編寫控制PC機(jī)揚(yáng)聲器發(fā)聲的程序。在PC機(jī)中,61H口的D1和D0位接到揚(yáng)聲器接口電路上。在D0=0的情況下,當(dāng)D1=1時(shí),揚(yáng)聲器被接通;當(dāng)D1=0時(shí),則斷開。通過控制D1位的值,就能產(chǎn)生一個(gè)由1和0構(gòu)成的二進(jìn)制序列,使揚(yáng)聲器發(fā)聲。61H口中的其它位則用來控制PC機(jī)的內(nèi)部開關(guān)狀態(tài)、奇偶校驗(yàn)及鍵盤狀態(tài)等。要將這些狀態(tài)保存起來??刂茡P(yáng)聲器發(fā)聲程序:
IN AL,61H ;AL←從61H口讀取數(shù)據(jù) ANDAL,0FCH ;保護(hù)D7~D2位,D0位清0MORE:
XORAL,02;觸發(fā)D1位使之在0和1間變化 OUT61H,AL ;控制揚(yáng)聲器開關(guān)通斷 MOVCX,260 ;CX=循環(huán)次數(shù)DELAY:LOOP DELAY ;循環(huán)延時(shí) JMPMORE ;再次觸發(fā)本例中,LOOP指令重復(fù)執(zhí)行260遍,起延時(shí)作用,使開關(guān)通斷維持一定時(shí)間。否則開關(guān)動(dòng)作太快,發(fā)出的聲音頻率太高,人耳聽不出來。3.循環(huán)控制指令2)LOOPE/LOOPZ相等或結(jié)果為0時(shí)循環(huán)
(LoopIfEqual/Zero)指令格式:LOOPE標(biāo)號(hào)或LOOPZ標(biāo)號(hào)指令功能:LOOPE是相等時(shí)循環(huán),LOOPZ是結(jié)果為0時(shí)循環(huán)。它們能完成相同功能,具有不同助記符,用來控制重復(fù)執(zhí)行一組指令。指令執(zhí)行前,先將重復(fù)次數(shù)送入CX,每執(zhí)行一次CX1,若1后CX≠0和ZF=1,則轉(zhuǎn)到指令指定的標(biāo)號(hào)處重復(fù)執(zhí)行;若CX=0或ZF=0,便退出循環(huán),執(zhí)行本指令后的那條指令。例3.95設(shè)1個(gè)50字節(jié)組成的數(shù)組存在ARRAY開始的內(nèi)存中,測試數(shù)組中的元素,若為0,且不是最后1個(gè),便繼續(xù)進(jìn)行下個(gè)元素的測試,直到找到第一個(gè)非零元素或查完了為止。ARRAY DB ××,××,… ;含50個(gè)元素的數(shù)組 MOV BX,OFFSETARRAY
;BX指向數(shù)組開始單元 DEC BX ;指針1 MOV CX,50 ;CX=元素個(gè)數(shù)NEXT:
INC BX ;指向數(shù)組的下個(gè)元素 CMP[BX],00H ;數(shù)組元素與0比較 LOOPE NEXT ;若元素為0和CX≠0,循環(huán)… ;否則,結(jié)束查找3.循環(huán)控制指令3)LOOPNE/LOOPNZ不相等或結(jié)果不為0循環(huán)
(LoopIfNotEqual/NotZero)指令格式:
LOOPNE標(biāo)號(hào)或
LOOPNZ標(biāo)號(hào)指令功能:LOOPNE是不相等循環(huán),而LOOPNZ是結(jié)果ZF≠1循環(huán),它們也是一對功能相同但形式不一樣的指令。指令執(zhí)行前,應(yīng)將重復(fù)次數(shù)送入CX,每執(zhí)行一次,CX自動(dòng)1,若1后CX≠0和ZF=0,則轉(zhuǎn)移到標(biāo)號(hào)所指定的地址重復(fù)執(zhí)行;若CX=0或ZF=1,則退出循環(huán),順序執(zhí)行下一條指令。例3.96
設(shè)一個(gè)由17個(gè)字符組成的字符串存放在以STRING開始的內(nèi)存中,查找字符串中是否包含空格符。若沒有找到空格符和尚未查完,則繼續(xù)查找,直到找到第一個(gè)空格符或查完了,才退出循環(huán)。STRINGDB‘PersonalComputer’;字符串MOVBX,OFFSETST
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工素質(zhì)培訓(xùn)教學(xué)
- 獎(jiǎng)懲管理辦法培訓(xùn)
- 高考物理題目解析-萬有引力定律應(yīng)用經(jīng)典試題
- 倉庫主管培訓(xùn)教程課件
- 員工數(shù)據(jù)安全培訓(xùn)
- 員工心態(tài)培訓(xùn)學(xué)習(xí)
- 塔吊司索培訓(xùn)
- 員工安全培訓(xùn)方案
- 塑粉車間安全培訓(xùn)
- 托管中心安全巡邏制度
- 鐵精粉選廠合同協(xié)議
- 黑龍江哈爾濱2024年中考語文現(xiàn)代文閱讀真題
- 知識(shí)圖譜構(gòu)建實(shí)踐
- 部編版五年級(jí)語文上冊快樂讀書吧測試題及答案
- 衛(wèi)星傳輸專業(yè)試題題庫及答案
- 細(xì)胞治療GMP生產(chǎn)中的工藝控制
- DL-T+5220-2021-10kV及以下架空配電線路設(shè)計(jì)規(guī)范
- 視覺傳播概論(第2版)課件全套 任悅 第1-12章 視覺傳播概述- 視覺傳播中的倫理道德與法規(guī)
- 進(jìn)社區(qū)宣講民法典
- 《被壓扁的沙子》優(yōu)質(zhì)教案與反思
- GB/T 27866-2023鋼制管道和設(shè)備防止焊縫硫化物應(yīng)力開裂的硬度控制技術(shù)規(guī)范
評論
0/150
提交評論