匯編語(yǔ)言程序設(shè)計(jì)-課件全套 -第1-8章 計(jì)算機(jī)基礎(chǔ)知識(shí) -輸入、輸出和中斷程序設(shè)計(jì)_第1頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)-課件全套 -第1-8章 計(jì)算機(jī)基礎(chǔ)知識(shí) -輸入、輸出和中斷程序設(shè)計(jì)_第2頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)-課件全套 -第1-8章 計(jì)算機(jī)基礎(chǔ)知識(shí) -輸入、輸出和中斷程序設(shè)計(jì)_第3頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)-課件全套 -第1-8章 計(jì)算機(jī)基礎(chǔ)知識(shí) -輸入、輸出和中斷程序設(shè)計(jì)_第4頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)-課件全套 -第1-8章 計(jì)算機(jī)基礎(chǔ)知識(shí) -輸入、輸出和中斷程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩342頁(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)介

第1章計(jì)算機(jī)基礎(chǔ)知識(shí)1.1計(jì)算機(jī)系統(tǒng)概述硬件系統(tǒng):構(gòu)成計(jì)算機(jī)的各種物質(zhì)實(shí)體的總和

軟件系統(tǒng)

:計(jì)算機(jī)上全部可運(yùn)行程序的總和

一、硬件存儲(chǔ)程序和程序控制的原理

計(jì)算機(jī)由5大部分組成:總線:地址總線、數(shù)據(jù)總線、控制總線存儲(chǔ)器:分為主存儲(chǔ)器和輔助存儲(chǔ)器。主存儲(chǔ)器(MainMemory),又稱為內(nèi)存儲(chǔ)器。RAM和ROM。高速緩沖存儲(chǔ)器(Cache),高速緩沖存儲(chǔ)器是利用了程序和數(shù)據(jù)的局部性原理。輔助存儲(chǔ)器(AuxiliaryMemory),也稱為外存儲(chǔ)器。外存分為磁表面存儲(chǔ)器、光存儲(chǔ)器和半導(dǎo)體閃速存儲(chǔ)器(固態(tài)硬盤)等三大類。二、軟件指計(jì)算機(jī)上可運(yùn)行的全部程序、文檔及各種數(shù)據(jù)的集合。分成系統(tǒng)軟件和應(yīng)用軟件

三、軟件與硬件之間的關(guān)系1.2計(jì)算機(jī)中的數(shù)制一、數(shù)的表示形式位、字節(jié)、字、雙字、K、M、G、T、P、E、Z、Y、B、N、D二、數(shù)制

十進(jìn)制數(shù)(D)、二進(jìn)制數(shù)(B)、八進(jìn)制數(shù)(O或Q)和十六進(jìn)制數(shù)(H)三、不同數(shù)制之間的相互轉(zhuǎn)換

四、二進(jìn)制數(shù)的算術(shù)運(yùn)算

加、減、乘、除五、計(jì)算機(jī)中的邏輯運(yùn)算

與、或、非、異或等1.3計(jì)算機(jī)中的數(shù)和字符的表示一、字符表示

標(biāo)準(zhǔn)ASCII碼,擴(kuò)展ASCII碼二、BCD碼BCD碼有壓縮BCD碼和非壓縮BCD碼兩種形式。三、無(wú)符號(hào)數(shù)和帶符號(hào)數(shù)

數(shù)的補(bǔ)碼表示:當(dāng)數(shù)X為正數(shù)時(shí),則用[X]補(bǔ)=X來(lái)表示X的補(bǔ)碼當(dāng)數(shù)X為負(fù)數(shù)時(shí),則用[X]補(bǔ)=2n-|X|來(lái)表示可以看到,[+0]補(bǔ)=[-0]補(bǔ)=00000000,在補(bǔ)碼表示法中0只有一種表示,即00000000。對(duì)于10000000這個(gè)數(shù),在補(bǔ)碼表示法中被定義為-128。這樣,8位補(bǔ)碼能表示數(shù)的范圍為-128~+127。

四、補(bǔ)碼的加法和減法補(bǔ)碼加法的公式:[X]補(bǔ)+[Y]補(bǔ)=[X+Y]補(bǔ)(mod2n)補(bǔ)碼減法運(yùn)算的公式:[X-Y]補(bǔ)=[X]補(bǔ)+[-Y]補(bǔ) (mod2n)補(bǔ)碼加減法規(guī)則如下:(1)參與運(yùn)算的兩個(gè)操作數(shù)均用補(bǔ)碼表示。(2)符號(hào)位要作為數(shù)的一部分一起參加運(yùn)算。(3)若做加法,則兩數(shù)直接相加;若做減法,則將被減數(shù)與減數(shù)的負(fù)數(shù)相加。(4)在模2n的意義下相加,即大于2n的進(jìn)位要丟掉。(5)運(yùn)算結(jié)果仍是補(bǔ)碼表示。1.4機(jī)器語(yǔ)言、匯編語(yǔ)言、高級(jí)語(yǔ)言一、機(jī)器語(yǔ)言機(jī)器語(yǔ)言(MachineLanguage)是各種不同功能機(jī)器指令的集合

二、匯編語(yǔ)言

三、高級(jí)語(yǔ)言

匯編語(yǔ)言的主要優(yōu)點(diǎn)就是可以直接控制計(jì)算機(jī)硬件,可以編寫(xiě)在時(shí)間和空間兩方面更有效的程序。但是匯編語(yǔ)言的缺點(diǎn)也是明顯的,它與處理器密切相關(guān),要求程序員熟悉計(jì)算機(jī)硬件系統(tǒng),考慮許多細(xì)節(jié)問(wèn)題,所以程序煩瑣,調(diào)試、維護(hù)、交流和移植困難。

應(yīng)用場(chǎng)合如下:(1)程序要具有較短的運(yùn)行時(shí)間,或者只能占用較小的存儲(chǔ)容量。例如操作系統(tǒng)的核心程序段,實(shí)時(shí)控制系統(tǒng)的軟件等。(2)程序與計(jì)算機(jī)硬件密切相關(guān),程序要直接控制硬件。例如I/O接口電路的初始化程序段,外部設(shè)備的底層驅(qū)動(dòng)程序等。(3)大型軟件需要提高性能、優(yōu)化處理的部分。例如計(jì)算機(jī)系統(tǒng)頻繁調(diào)用的子程序、動(dòng)態(tài)鏈接庫(kù)等。(4)沒(méi)有適合的高級(jí)語(yǔ)言的時(shí)候。例如開(kāi)發(fā)最新的處理器程序時(shí),暫時(shí)沒(méi)有支持新指令的編譯程序。(5)匯編語(yǔ)言還有許多實(shí)際應(yīng)用,例如分析具體系統(tǒng)尤其是該系統(tǒng)的底層軟件、加密解密軟件、分析和防治計(jì)算機(jī)病毒等。第2章80X86微處理器及系統(tǒng)結(jié)構(gòu)2.180X86微處理器1.微處理器的產(chǎn)生和發(fā)展2.8086微處理器的結(jié)構(gòu)8086微處理器的結(jié)構(gòu)可簡(jiǎn)化為如下頁(yè)圖所示。該處理器分為兩大組成部分:指令執(zhí)行單元EU(ExecutionUnit)和總線接口單元BIU(BusInterfaceUnit)。

EU部分負(fù)責(zé)指令的執(zhí)行。

BIU負(fù)責(zé)與存儲(chǔ)器接口,即8086CPU與存儲(chǔ)器之間的信息傳送。二者并行工作的思想。指令隊(duì)列是一個(gè)6個(gè)字節(jié)寄存器,隊(duì)列中同時(shí)最多可存6個(gè)字節(jié)指令。指令隊(duì)列是一個(gè)先進(jìn)先出的棧。2.280X86微處理器的寄存器

8086共有14個(gè)16位寄存器供系統(tǒng)使用,它們可以分成四種類型,分別是數(shù)據(jù)寄存器、指針及變址寄存器、段寄存器和控制寄存器。

2.380X86存儲(chǔ)器的組織一、存儲(chǔ)單元的地址和內(nèi)容

在存儲(chǔ)器里以字節(jié)為單位存儲(chǔ)信息。由于8086存放存儲(chǔ)器地址的寄存器字長(zhǎng)為16位,因此每個(gè)存儲(chǔ)單元若用16位二進(jìn)制數(shù)表示地址,那么16位二進(jìn)制數(shù)可以表示多少個(gè)字節(jié)單元的地址呢?顯然答案應(yīng)該是有216=65536個(gè),所以它可以表示的地址范圍應(yīng)該是0~65535,即64KB(1K=210=1024),其地址編號(hào)的范圍用十六進(jìn)制數(shù)表示為0000H~FFFFH。同樣的道理,8086的地址總線為20位,那么其可以訪問(wèn)的字節(jié)單元地址范圍為00000H~FFFFFH;80286的地址總線寬度為24位,可訪問(wèn)的地址范圍為000000H~FFFFFFH;80386、80486和Pentium的地址總線寬度為32位,相應(yīng)的地址范圍為00000000H~FFFFFFFFH。字節(jié)內(nèi)容 地址

0000H 0001H 0002H 34H 0003H 12H 0004H 56H 0005H 78H 0006H …… ……

0ABH 1234H 0CDH 1235H 0EFH 1236H 1237H 1238H 1239H 二、存儲(chǔ)器地址的分段

8086微處理器的地址總線寬度為20位,可訪問(wèn)的存儲(chǔ)器的最大容量為1MB,其尋址范圍為00000H~0FFFFFH,這是因?yàn)椋?20=1048576=1024K=1M那么在16位字長(zhǎng)的機(jī)器里,用什么辦法來(lái)提供20位地址呢?解決的辦法就是采用存儲(chǔ)器地址分段的方法。物理地址,邏輯地址,段地址,偏移地址等。三、特殊內(nèi)存區(qū)域

中斷向量區(qū):00000H~003FFH,共存256個(gè)中斷向量

顯示緩沖區(qū):單顯是B0000H~B0F9FH,4000B;彩顯是B8000H~BBF3FH,16KB

啟動(dòng)區(qū):FFFF0H~FFFFFH,16B

2.480X86微處理器工作模式一、實(shí)模式

相當(dāng)于一臺(tái)快速的8086處理器二、保護(hù)模式

多任務(wù)、內(nèi)存分頁(yè)管理和優(yōu)先級(jí)保護(hù)等機(jī)制三、虛擬8086模式

在保護(hù)模式下,支持8086模式。第3章80x86指令系統(tǒng)計(jì)算機(jī)的指令由操作碼字段和操作數(shù)字段兩個(gè)部分構(gòu)成。8086指令系統(tǒng)中操作數(shù)字段可以是零個(gè)操作數(shù)、一個(gè)操作數(shù)或兩個(gè)操作數(shù),稱為零地址指令、一地址指令和二地址指令。3.1尋址方式3.1.1操作數(shù)類型操作數(shù)依其所在的不同位置可分為三種類型:立即數(shù),寄存器操作數(shù),存儲(chǔ)器操作數(shù)。3.1尋址方式3.1.1操作數(shù)類型操作數(shù)的尋址方式就是尋找操作數(shù)所在地址的方式。1.立即尋址方式操作數(shù)類型為立即數(shù),存放在指令中。3.1尋址方式2.寄存器尋址方式操作數(shù)在寄存器中,在指令中指明寄存器的名稱。寄存器尋址方式通常用于寄存器之間傳送數(shù)據(jù)。3.1尋址方式3.直接尋址方式直接尋址方式中操作數(shù)地址的是16位偏移量(有效地址EA)直接包含在指令中,而操作數(shù)則默認(rèn)在數(shù)據(jù)段中。3.1尋址方式4.寄存器間接尋址方式在寄存器間接尋址方式中,操作數(shù)在內(nèi)存中。操作數(shù)的有效地址在變址寄存器SI、DI或基址寄存器BX、BP中。只有SI、DI、BX、BP這四個(gè)寄存器可以用來(lái)存放地址。

3.1尋址方式5.寄存器相對(duì)尋址方式寄存器相對(duì)尋址方式是以指定的寄存器內(nèi)容,加上指令中給出的位移量D(8位或16位),并以一個(gè)段寄存器為基準(zhǔn),給出操作數(shù)的地址。指定的寄存器一般是一個(gè)基址寄存器(BX、BP)或一個(gè)變址寄存器(SI、DI)。3.1尋址方式6.基址變址尋址方式基址變址尋址方式是用一個(gè)基址寄存器與一個(gè)變址寄存器的值相加作為操作數(shù)的偏移地址。通常把BX和BP看作是基址寄存器,把SI和DI看作變址寄存器。也就是說(shuō),把(BX,BP)寄存器其中一個(gè)的值與(SI,DI)寄存器其中一個(gè)的值相加作為操作數(shù)的偏移地址。不允許的搭配為[BX+BP],[SI+DI]。3.1尋址方式7.相對(duì)基址變址尋址方式相對(duì)基址變址尋址方式中操作數(shù)的偏移地址由三個(gè)部分構(gòu)成:基址寄存器的值+變址寄存器的值+位移量D(8位或16位)。基址寄存器、變址寄存器及對(duì)應(yīng)的缺省段與基址變址尋址相同。3.2指令系統(tǒng)[標(biāo)號(hào):]指令助記符目的操作數(shù),源操作數(shù)[;注釋]OPD:表示目的操作數(shù)OPS:表示源操作數(shù)mem:表示內(nèi)存單元reg:表示通用寄存器seg:表示段寄存器imm:表示立即數(shù)3.2.1數(shù)據(jù)傳送指令1.?dāng)?shù)據(jù)傳送指令MOV指令格式:MOVOPD,OPS(1)MOVreg/mem,imm;立即數(shù)送寄存器或內(nèi)存單元(2)MOVseg/reg/mem,reg;寄存器的內(nèi)容傳送到段寄存器、寄存器、內(nèi)存單元(3)MOVseg/reg,mem;內(nèi)存單元內(nèi)容送寄存器或段寄存器(4)MOVreg/mem,seg;段寄存器內(nèi)容送寄存器或內(nèi)存單元

①兩個(gè)存儲(chǔ)單元之間不可以直接傳送數(shù)據(jù)。兩個(gè)內(nèi)存單元之間不能進(jìn)行操作,適用于所有指令。②目的操作數(shù)不能是CS及立即數(shù),CS寄存器的內(nèi)容是由操作系統(tǒng)給出的。③OPD,OPS的位數(shù)必須一致(字節(jié)類型或者字類型),同樣適用于所有指令。④計(jì)算機(jī)根據(jù)寄存器默認(rèn)其缺省的段寄存器,所以指令中只要給出偏移地址。⑤在內(nèi)存和寄存器之間傳送字類型數(shù)據(jù)是高地址和高8位寄存器對(duì)應(yīng),低地址和低8位寄存器對(duì)應(yīng)。2.XCHG指令指令格式:XCHGOPD,OPS具體格式有:XCHG reg,memXCHG reg,regXCHG mem,reg示例2內(nèi)存交換數(shù)據(jù)

3.查表指令XLAT指令格式:XLATTABLE或

XLAT指令功能:把待查表格的一個(gè)字節(jié)內(nèi)容送到AL累加器中。待查表格存于內(nèi)存單元中,TABLE為待查表格的首地址。執(zhí)行前,應(yīng)將待查表格的首地址TABLE先送至BX寄存器中,然后將待查字節(jié)與其距表首地址的位移量送AL。執(zhí)行后,將有效地址為(BX)+(AL)的內(nèi)存單元的內(nèi)容傳送給給AL。即(AL)←((BX)+(AL))。示例4.堆棧指令PUSH和POP指令格式:PUSH OPDPOP OPD指令功能:PUSH指令將棧頂指針SP自動(dòng)減2,即(SP)←(SP)-2,把OPD壓入堆棧;POP指令將棧頂?shù)囊粋€(gè)字?jǐn)?shù)據(jù)送到OPD,棧頂指針SP自動(dòng)加2,即(SP)←(SP)+2。OPD必須是16為寄存器、16位內(nèi)存單元和段寄存器。示例5.標(biāo)志傳送指令(1)標(biāo)志位送AH指令LAHF指令格式:LAHF指令功能:取標(biāo)志寄存器FLAG的低8位傳送到AH。該指令不影響標(biāo)志寄存器內(nèi)容。(2)AH送標(biāo)志寄存器指令SAHF指令格式:SAHF指令功能:將AH寄存器的內(nèi)容傳送到標(biāo)志寄存器FLAG的低8位。該條指令影響FLAG中的SF、ZF、AF、PF、CF標(biāo)志。(3)標(biāo)志進(jìn)棧指令PUSHF指令格式:PUSHF指令功能:先將(SP)←(SP)-2,然后標(biāo)志寄存器入棧。該指令不影響標(biāo)志寄存器內(nèi)容。(4)標(biāo)志出棧指令POPF指令格式:POPF指令功能:與PUSHF指令的功能相反,將棧頂內(nèi)容送標(biāo)志寄存器,(SP)←(SP)+2。該指令影響標(biāo)志。PUSHF指令和POPF指令主要用于子程序和中斷過(guò)程中對(duì)FLAG內(nèi)容的保護(hù)和恢復(fù)。6.地址傳送指令(1)有效地址指令LEA指令格式:LEAOPD,OPSOPD可為一個(gè)16位的通用寄存器,通常為:BX、BP、SI、DI。OPS可為變量名、標(biāo)號(hào)或地址表達(dá)式。示例,指令的區(qū)別(2)取地址指令LDS及LES指令格式:LDS OPD,OPSLES OPD,OPS其中OPD為任意一個(gè)16位的寄存器,OPS為的存儲(chǔ)器地址。指令功能:是將OPS所指向的存儲(chǔ)單元的連續(xù)4個(gè)字節(jié)(32位)的內(nèi)容分別傳送到OPD和DS寄存器中。示例3.2.2算術(shù)運(yùn)算指令1.加法指令(1)ADD加法指令指令格式:ADDOPD,OPS(2)ADC帶進(jìn)位加法指令指令格式:ADCOPD,OPS(3)INC指令指令格式:INCOPD2.減法指令(1)減法指令SUB指令格式:SUBOPD,OPS(2)帶借位減法指令SBB指令格式:SBBOPD,OPS(3)減1指令DEC指令格式:DECOPD,其中OPD的含義與INC指令相同。(4)求補(bǔ)指令NEG指令格式:NEGOPD(OPD可以是reg或mem)對(duì)0求補(bǔ)時(shí),CF=0,其他情況CF=1(5)比較指令CMP指令格式:CMPOPD,OPS3.乘法指令(1)無(wú)符號(hào)數(shù)乘法指令MUL指令格式:MULOPD,操作數(shù)可以是reg或mem,不能是立即數(shù)。(2)有符號(hào)數(shù)乘法指令I(lǐng)MUL指令格式:IMULOPD乘法指令對(duì)標(biāo)志位的影響:如果乘積的高一半為低一半的符號(hào)擴(kuò)展則CF=0;OF=0;否則,CF=1;OF=1。4.除法指令(1)無(wú)符號(hào)除法指令DIV指令格式:DIVOPD,操作數(shù)可以是reg或mem,不能是立即數(shù)。(2)有符號(hào)數(shù)除法法指令I(lǐng)DIV指令格式:IDIVOPD除法指令對(duì)標(biāo)志位的影響:除法指令對(duì)標(biāo)志沒(méi)有定義。5.符號(hào)擴(kuò)展指令(1)字節(jié)擴(kuò)展為字CBW指令格式:CBW(2)字?jǐn)U展為雙字CWD指令格式CWD注意:符號(hào)擴(kuò)展的隱含操作數(shù)是AL和AH以及AX和DX,與其他寄存器無(wú)關(guān)。例設(shè)B1,B2,B3為有符號(hào)字節(jié)類型變量,寫(xiě)出完成(B1×B2+B3)/B2功能的指令序列。MOV AL,B1IMUL B2 ;乘積存于AX中MOV CX,AX ;為什么要寫(xiě)這一句?MOV AL,B3 ;B1×B2為16位數(shù)據(jù),B3為8位數(shù)據(jù),不能相加,需要擴(kuò)展CBWADD AX,CXIDIV B2;結(jié)果的余數(shù)在AH中,商在AL中若把題目中的式子改為:(B1+B2+B3)/B2,指令序列該如何寫(xiě)?6.十進(jìn)制數(shù)調(diào)整指令十進(jìn)制數(shù)調(diào)整指令分成壓縮BCD碼和非壓縮BCD碼調(diào)整。(1)壓縮BCD碼加法調(diào)整指令DAA指令格式:DAA(2)壓縮BCD碼減法調(diào)整指令DAS指令格式:DAS(3)非壓縮BCD碼加法調(diào)整指令A(yù)AA指令格式:AAA(4)非壓縮BCD碼減法調(diào)整指令A(yù)AS指令格式:AAS(5)非壓縮BCD碼乘法調(diào)整指令A(yù)AM指令格式:AAM(6)非壓縮BCD碼除法調(diào)整指令A(yù)AD指令格式:AAD因?yàn)锳AA和AAS指令在調(diào)整中有可能產(chǎn)生了進(jìn)位或借位,所以AH要加上進(jìn)位或減去借位,同時(shí)CF=AF=1,否則CF=AF=0;調(diào)整指令對(duì)其他標(biāo)志無(wú)定義。

3.2.3邏輯運(yùn)算指令1.邏輯與運(yùn)算指令A(yù)ND指令格式:ANDOPD,OPS對(duì)標(biāo)志位的影響:設(shè)置CF=OF=0,根據(jù)結(jié)果確定SF、ZF和PF狀態(tài),而對(duì)AF未定義。2.邏輯或運(yùn)算指令OR指令格式:OROPD,OPS對(duì)標(biāo)志位的影響同AND指令。3.邏輯非指令NOT指令格式:NOTOPD不影響標(biāo)志位。4.邏輯異或運(yùn)算XOR指令格式:XOROPD,OPS對(duì)標(biāo)志位的影響同AND指令。5.測(cè)試指令TEST指令格式:TESTOPD,OPS建立結(jié)果狀態(tài)標(biāo)志。特別注意邏輯運(yùn)算指令的應(yīng)用3.2.4移位指令指令格式SAL/SHLOPD,OPS SAROPD,OPS SHROPD,OPS對(duì)標(biāo)志位的影響:對(duì)AF無(wú)定義。CF由移后的值確定,并根據(jù)移位后的結(jié)果設(shè)置SF、ZF、PF;當(dāng)移動(dòng)1位時(shí),移位后如果符號(hào)位發(fā)生變化,則OF=1,符號(hào)位不發(fā)生變化,則OF=0,移位次數(shù)大于1時(shí),OF不確定。

舉例:若X,Y為字節(jié)類型數(shù),求Z=((X+Y)×8-X)/2

MOV AX,XADD AX,YMOV CL,3SAL AX,CL ;左移3位就是×8SUB AX,XSAR AX,1 ;除2MOV Z,AX

2.循環(huán)移位指令指令格式:ROLOPD,OPS;不帶進(jìn)位循環(huán)左移ROROPD,OPS;不帶進(jìn)位循環(huán)右移RCLOPD,OPS;帶進(jìn)位循環(huán)左移RCROPD,OPS;帶進(jìn)位循環(huán)右移對(duì)標(biāo)志位的影響同一般移位指令。

3.2.5控制轉(zhuǎn)移指令控制轉(zhuǎn)移類指令用于實(shí)現(xiàn)分支、循環(huán)、過(guò)程等程序結(jié)構(gòu),是匯編中的常用指令。1.無(wú)條件轉(zhuǎn)移指令JMP指令格式:JMPLABLE

LABLE是將要轉(zhuǎn)移到的目標(biāo)地址,按LABLE是否與當(dāng)前指令在一個(gè)代碼段,無(wú)條件轉(zhuǎn)移可分為段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移;而按LABLE的不同尋址方式又可分為直接尋址和間接尋址。直接尋址:轉(zhuǎn)移地址在指令代碼中。間接尋址:轉(zhuǎn)移地址在寄存器或內(nèi)存單元中。(1)段內(nèi)轉(zhuǎn)移:在當(dāng)前代碼段范圍64KB內(nèi)轉(zhuǎn)移(±32KB范圍)稱為近轉(zhuǎn)移(NEARPTR)。轉(zhuǎn)移范圍在段內(nèi)-128~+127范圍內(nèi)稱為短轉(zhuǎn)移(SHORT)。段內(nèi)轉(zhuǎn)移CS段地址不變,只要改變IP偏移地址。

JMPSHORTLABLE ;短轉(zhuǎn)移,直接尋址,目標(biāo)地址為L(zhǎng)ABLEJMPNEARPTRLABLE;近轉(zhuǎn)移,直接尋址,目標(biāo)地址為L(zhǎng)ABLEJMPSI;間接尋址,目標(biāo)地址在SI寄存器中JMPWORDPTR[BX];間接尋址,目標(biāo)地址在內(nèi)存單元中(2)段間轉(zhuǎn)移:遠(yuǎn)轉(zhuǎn)移(FARPTR)從當(dāng)前代碼段轉(zhuǎn)移到另一個(gè)代碼段(設(shè)為代碼段2),轉(zhuǎn)移范圍1MB。需要改變CS段地址和IP偏移地址。因此目標(biāo)地址必須用一個(gè)32位數(shù)表達(dá)。

指令JMPFARPTRLABLE的功能是遠(yuǎn)轉(zhuǎn)移到代碼段2的LABLE,IP←[LABLE],CS←[代碼段2的段地址]。

指令JMPFARPTRMEM,其中MEM是內(nèi)存單元的地址,從MEM開(kāi)始的4個(gè)連續(xù)單元中存放著2個(gè)16位的地址,一個(gè)是目標(biāo)地址的偏移地址,一個(gè)是目標(biāo)地址的段地址。即IP←[MEN],CS←[MEM+2]。

2.條件轉(zhuǎn)移語(yǔ)句JCC條件轉(zhuǎn)移語(yǔ)句都是段內(nèi)短轉(zhuǎn)移。條件轉(zhuǎn)移指令的一般格式為:JCCLABLE

指令中的條件即為狀態(tài)標(biāo)志的狀態(tài),條件轉(zhuǎn)移指令可分成三類:判斷單個(gè)標(biāo)志位狀態(tài)、比較無(wú)符號(hào)數(shù)高低、比較有符號(hào)數(shù)大小。(1)判斷單個(gè)標(biāo)志位狀態(tài)①JZ/JE和JNZ/JNE②JS和JNS③JO和JNO④JP/JPE和JNP/JPO⑤JC/JB/JNAE和JNC/JNB/JAE(2)比較無(wú)符號(hào)數(shù)高低(條件為一個(gè)標(biāo)志或標(biāo)志組合)指令中的A表示高(Above),B表示低(Below),利用CF確定高低、利用ZF標(biāo)志確定相等。JB/JNAE/JCJNB/JAE/JNCJBE/JNAJNBE/JA(3)比較有符號(hào)數(shù)大?。l件為標(biāo)志組合)指令中的G表示大(Greater),L表示?。↙ess)JL/JNGEJNL/JGEJLE/JNGJNLE/JG例:在AL,BL,CL中有三個(gè)有符號(hào)數(shù),找出最大數(shù)存于AL中。

CMP AL,BL

JG LL XCHG AL,BLLL: CMP AL,CL

JG EXIT XCHG AL,CLEXIT:例:AL寄存器中存放一個(gè)字符,如果是數(shù)字字符,則改為*。

CMP AL,'0'

JB EXIT

CMP AL,'9'

JA EXIT

MOV AL,'*'EXIT:

(4)測(cè)試CX的值為0,則轉(zhuǎn)移的指令指令格式:JCXZLABLE

3.循環(huán)控制指令循環(huán)指令默認(rèn)利用CX計(jì)數(shù)器,屬于段內(nèi)短轉(zhuǎn)移。指令格式:LOOPLABLELOOPZ/LOOPELABLELOOPNZ/LOOPNELABLE

例:求1+3+5+7+……19,結(jié)果存于AX寄存器中。 MOV AX,0 MOV CX,10 MOV BX,1AGAIN: ADD AX,BX ADD BX,2 LOOP AGAIN ……4.子程序調(diào)用及返回指令(1)子程序調(diào)用指令CALLCALL指令位于主程序,CALL調(diào)用的子程序與CALL指令可以處于同一代碼段內(nèi),也可以在不同的代碼段,因而分段內(nèi)調(diào)用和段間調(diào)用。段內(nèi)直接調(diào)用、段內(nèi)間接調(diào)用、段間直接調(diào)用、段間間接調(diào)用。CALLNEARPTRLABLECALLR16/M16CALLFARPTRLABLE

CALLMEM(2)返回指令RET是子程序最后執(zhí)行的指令。根據(jù)子程序與主程序是否同處于一個(gè)代碼段內(nèi),返回指令也分為段內(nèi)返回和段間返回。RETRETnRETRETn

RETn為有參數(shù)返回,n為1個(gè)16位立即數(shù),則堆棧指針SP將增加,即SP←SP+n。主要用于程序可以方便地從堆棧中去除若干執(zhí)行CALL指令以前入棧的參數(shù),因?yàn)檫@些參數(shù)在子程序返回后就不再需要了。將AL中的數(shù)轉(zhuǎn)換成2位十進(jìn)制數(shù)的ASCII碼,存于BX寄存器中。設(shè)AL=20H=32D,則BH=33H,BL=32H。主程序: MOV AL,20H CALL PROC …… PROC: MOV AH,0 MOV CL,10 DIV CL OR AL,30H MOV BH,AL OR AH,30H

MOV BL,AH RET3.2.7處理器控制指令1.空操作指令NOP2.指令封鎖前綴指令LOCK3.暫停指令HLT4.交權(quán)指令ESC5.等待指令WAIT6.標(biāo)志操作指令CLCSTCCMCCLDSTDCLISTI3.2.8輸入輸出指令1.端口

2.輸入輸出指令I(lǐng)N和OUT指令格式:INAL,nOUTn,ALINAX,nOUTn,AXINAX,DXOUTDX,ALINAL,DXOUTDX,AX3.2.9

中斷指令和中斷返回指令1.中斷的概念

2.中斷的類型3.中斷處理程序4.中斷向量表5.中斷指令指令格式:INTnIRETINTO6.中斷指令執(zhí)行過(guò)程(1)取中斷類型號(hào)n,n×4作為中斷向量表的指針。(2)將標(biāo)志寄存器內(nèi)容壓入堆棧。(3)保護(hù)斷點(diǎn),將當(dāng)前CS,IP壓入堆棧。(4)備份TF標(biāo)志,并將IF和TF清0,以禁止外部中斷。(5)取中斷處理程序的入口地址送IP、CS,即n×4→IP,n×4+2→CS。(6)轉(zhuǎn)去中斷處理程序。匯編語(yǔ)言執(zhí)行的步驟為編程→匯編→連接→調(diào)試(1)編程:用編輯程序建立ASM文件;(2)匯編:用匯編語(yǔ)言MASM程序?qū)SM文件轉(zhuǎn)換成目標(biāo)文件OBJ;(3)連接:用連接程序LINK把OBJ文件轉(zhuǎn)換成可執(zhí)行的EXE文件;(4)調(diào)試:在DOS狀態(tài)下鍵入文件名調(diào)試、運(yùn)行程序。第4章匯編語(yǔ)言程序格式4.1匯編語(yǔ)言格式一、匯編語(yǔ)言語(yǔ)句格式1.指令語(yǔ)句語(yǔ)句格式:[標(biāo)號(hào):]指令助記符操作數(shù)[,操作數(shù)][;注釋]標(biāo)號(hào):標(biāo)號(hào)的名字由用戶自定義,是不能以數(shù)字開(kāi)頭的字符、數(shù)字串,長(zhǎng)度不超過(guò)31個(gè)字符,不能使用保留字,保留字包括指令助記符、偽指令助記符、寄存器符號(hào)等。注釋:匯編程序在翻譯源程序時(shí)不對(duì)它們做任何處理。

2.偽指令語(yǔ)句偽指令是在程序匯編期間由匯編程序處理的操作。[名字]偽指令助記符參數(shù),參數(shù)…[;注釋]名字:是反映偽指令偏移地址的標(biāo)識(shí)符,后面沒(méi)有冒號(hào)。取名與標(biāo)號(hào)的取名一樣。偽指令助記符:表示偽指令的所要完成的操作。參數(shù):偽指令要求的內(nèi)容,常數(shù)、變量、表達(dá)式,允許多個(gè)。二、匯編語(yǔ)言程序格式完整的匯編語(yǔ)言源程序由若干個(gè)代碼段、數(shù)據(jù)段、附加段或堆棧段組成;段與段之間的順序可隨意排列;可運(yùn)行的程序必須包含一個(gè)代碼段,并指明程序的起始語(yǔ)句,數(shù)據(jù)段、附加段、堆棧段不是必須;指令語(yǔ)句必須位于某一個(gè)代碼段內(nèi),偽指令語(yǔ)句可按需要位于任一段內(nèi)。;N01.ASM(文件名N01,注釋語(yǔ)句)STACK SEGMENTSTACK ;定義堆棧段DW512DUP(?)STACK ENDS ;堆棧段結(jié)束DATA SEGMENT ;定義數(shù)據(jù)段 STRING DB'welcome!','$'DATA ENDS

;數(shù)據(jù)段結(jié)束CODE SEGMENT ;定義代碼段

ASSUMECS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA ;建立DS段地址

MOV DS,AX MOV DX,OFFSETSTRING MOV AH,9 INT 21H MOV AX,4C00H ;返回DOS的參數(shù)

INT 21H ;返回DOSCODE ENDS ;代碼段結(jié)束

END START ;源程序結(jié)束4.2匯編語(yǔ)句參數(shù)匯編語(yǔ)句的參數(shù)可分為兩類:數(shù)值型參數(shù)和地址型參數(shù)。指令語(yǔ)句中指令操作數(shù)可以是立即數(shù)、寄存器和存儲(chǔ)單元,其中立即數(shù)就是數(shù)值型參數(shù)。標(biāo)號(hào)或變量的名字屬于地址型參數(shù)。偽指令語(yǔ)句中參數(shù)給匯編程序提供必要的信息,使匯編程序能夠完成對(duì)源程序的匯編。一、數(shù)值型參數(shù)1.常數(shù)一般數(shù)、字符串?dāng)?shù)、符號(hào)常數(shù)2.符號(hào)常數(shù)定義偽指令(EQU、=)EQU偽指令格式:符號(hào)名EQU數(shù)值表達(dá)式符號(hào)名EQU<字符串>注意:EQU與=的區(qū)別EQU和=右邊也允許出現(xiàn)符號(hào),但必須先定義3.?dāng)?shù)值表達(dá)式數(shù)值表達(dá)式是由常數(shù)、寄存器、變量及標(biāo)號(hào)等用運(yùn)算符連接起來(lái)的式子,可分為算術(shù)表達(dá)式、邏輯表達(dá)式、關(guān)系表達(dá)式??沙霈F(xiàn)在指令語(yǔ)句或偽指令語(yǔ)句中(1)算術(shù)運(yùn)算符:+,-,*,/,MOD,SHL,SHR例如:MOVAX,5*(7-3)等價(jià)于MOVAX,20MOVAL,1010010BSHL2等價(jià)于MOVAL,01001000B(2)邏輯運(yùn)算符:AND,OR,XOR,NOT例如:ANDAL,03HOR05H

等效于ANDAL,07H(3)關(guān)系運(yùn)算符:EQ,NE,GT,LT,GE,LE若關(guān)系成立用0FFFFH(補(bǔ)碼-1)表示條件為真;若關(guān)系不成立用0000H表示條件為假。例如:MOVBX,((PSGE0)AND11H)OR((PSLT0)AND77H)(4)運(yùn)算符的優(yōu)先順序①(),<>,[];②*,/,MOD,SHL,SHR;③+,-;④EQ,NE,GT,LT,GE,LE;⑤NOT;⑥AND;⑦OR,XOR4.2.2地址型參數(shù)地址型參數(shù)指標(biāo)號(hào)、變量和地址表達(dá)式,包括變量名、段名、過(guò)程名,以及在指令語(yǔ)句中出現(xiàn)的含有存儲(chǔ)單元地址的參數(shù)等,可以出現(xiàn)在指令語(yǔ)句和偽指令語(yǔ)句中。1.標(biāo)號(hào)標(biāo)號(hào)是代碼段中可執(zhí)行語(yǔ)句的地址符號(hào),后面跟著冒號(hào)。被用于轉(zhuǎn)移指令和過(guò)程調(diào)用指令中做為目的地址操作數(shù)。標(biāo)號(hào)具有三種屬性。(1)段屬性:段地址在CS段中(2)偏移量屬性:距CS段首地址的偏移量(3)類型屬性:NEAR表示段內(nèi)標(biāo)號(hào),F(xiàn)AR表示段間標(biāo)號(hào),在過(guò)程調(diào)用指令中指明。2.變量變量是在地址段或其他段中存儲(chǔ)單元的地址符號(hào),做為指令的存儲(chǔ)器操作數(shù)來(lái)引用。變量具有三種屬性。(1)段屬性:變量所在的段,可以是CS,DS,SS,ES。(2)偏移量屬性:距所在段首地址的偏移量。(3)類型屬性:變量的類型由偽指令來(lái)定義,指定存取變量的一個(gè)元素所需要的數(shù)據(jù)的字節(jié)數(shù)(類型),包括DB(字節(jié))、DW(字,2字節(jié))、DD(雙字,4字節(jié))、DQ(8個(gè)字節(jié))、DT(10字節(jié))3.地址表達(dá)式地址表達(dá)式由變量、標(biāo)號(hào)、常量、寄存器及運(yùn)算符組成。地址表達(dá)式的結(jié)果是由匯編程序計(jì)算出的存儲(chǔ)器地址,沒(méi)有屬性。三、特殊運(yùn)算符特殊的運(yùn)算符只對(duì)本語(yǔ)句有效,并沒(méi)有改變變量的屬性。1.屬性替代運(yùn)算符(1)強(qiáng)制類型運(yùn)算符PTR用于給已分配的存儲(chǔ)地址賦予另一種屬性,僅在本語(yǔ)句有效,不影響原有屬性。(2)定義類型運(yùn)算符THISTHIS指令是與EQU或=配合使用,給當(dāng)前偏移地址指定一種類型屬性,同時(shí)定義了一個(gè)名字。與PTR類似,用于建立同一地址的不同類型的變量或標(biāo)號(hào),方便不同情況下使用。該名字不分配存儲(chǔ)單元,段屬性為所在的段,偏移地址為所在位置的下一個(gè)可用的存儲(chǔ)單元。格式:名字EQUTHIS類型名例如: BARRAYEQUTHISBYTE WARRAYDW3344H …… MOVAL,BARRAY ;AL=44H MOVAX,WARRAY ;AX=3344H(3)短取代運(yùn)算符SHORTSHORT設(shè)定標(biāo)號(hào)為短轉(zhuǎn)移,只用于JMP指令。轉(zhuǎn)移范圍為-128~+127字節(jié)。如:JMPSHORTNEXT2.?dāng)?shù)值返回操作符這一類操作數(shù)不改變操作數(shù)屬性,只回送操作數(shù)的某一屬性值。OFFSET變量或標(biāo)號(hào)偏移地址SEG變量或標(biāo)號(hào)段地址TYPE 變量標(biāo)號(hào)類型(DB=1,DW=2,DD=4)LENGTH 變量長(zhǎng)度(僅對(duì)DUP語(yǔ)句有效,其他變量均=1)SIZE 變量 LENGTH*TYPE例:BUF的段地址是0500H,偏移地址為0015H,BUF為字類型變量。BUFDW1111H,2255H,3333HBUF1DB9DUP(1)求下列指令執(zhí)行后寄存器的值。MOV SI,OFFSETBUF ;SI=0015HMOV BX,SEGBUF ;BX=0500HMOV DI,TYPEBUF ;DI=2MOV CX,LENGTHBUF1 ;CX=9MOV DX,SIZEBUF1 ;DX=9MOV AL,BYTEPTRBUF+3 ;AL=22H4.3匯編偽指令語(yǔ)句偽指令是非執(zhí)行指令,在程序匯編其間由匯編程序處理的語(yǔ)句。偽指令有符號(hào)定義偽指令,數(shù)據(jù)定義偽指令,段定義偽指令,其他偽指令等。一、符號(hào)定義偽指令格式:符號(hào)名LABEL類型例:

WAR LABELWORD AR DB3,4,5 …… MOV AX,WAR ;WAR為字類型

MOV AL,AR ;AR為字節(jié)類型

L2 LABELFAR L1: MOV AL,0二、數(shù)據(jù)定義偽指令格式:[變量名]偽指令助記符初值表變量是符號(hào)地址表示初值表首個(gè)數(shù)據(jù)的偏移地址偽指令助記符指DB、DW、DD等,表示變量的類型。初值表是由一系列用逗號(hào)分割開(kāi)的參數(shù),可以是常數(shù)、表達(dá)式、問(wèn)號(hào)、DUP等。問(wèn)號(hào)(?)表示初值不確定,即不賦初值;DUP為重復(fù)分配操作符格式為:重復(fù)次數(shù)DUP(被重復(fù)數(shù)據(jù)列表)例:A1DB10A2DW2345H,34DFHA3DB3DUP(2)A4DB'abcd'A5DB'a','b','c','d'A6DW2DUP(1,2)A7DW67H,2DUP(?)例:A1DB10A2DW2345H,34DFHA3DB3DUP(2)A4DB'abcd'A5DB'a','b','c','d'A6DW2DUP(1,2)A7DW67H,2DUP(?)

例:下列數(shù)據(jù)段定義后P3=?DATA SEGMENT P1DW25,4DUP(0,1) P2DB0

P3EQUP2-P1DATA END三、地址計(jì)數(shù)器與對(duì)準(zhǔn)偽指令

1.地址計(jì)數(shù)器JMP$+8例:下列數(shù)據(jù)段定義后,變量PD的值為多少? DATASEGMENT PADW66 PBDB18DUP(?) PDEQU$-PA DATAENDS

2.ORG偽指令ORG偽指令用來(lái)設(shè)置當(dāng)前地址計(jì)數(shù)器的值。

格式:ORGN

例:

ORG30 DATDB1,2,3,4例:AA DB0AH,0BHARRAY DW0011H,2233H,4455H,6677HORG20HBB DW20DUP(?)問(wèn):以下指令執(zhí)行后寄存器的值為多少?LEA SI,ARRAYMOV AX,ARRAYMOV BX,ARRAY+2MOV DX,[ARRAY+2] MOV DI,OFFSETARRAY+2MOV SI,OFFSETBBMOV CX,SIZEBB

3.EVEN偽指令EVEN偽指令使下一個(gè)變量或指令開(kāi)始于偶數(shù)字節(jié)地址。

格式:EVEN

例:

EVEN WARYDW20DUP(0)

4.ALIGN對(duì)齊偽指令A(yù)LIGN偽指令使下面的內(nèi)容變量必須從下一個(gè)能被NUM整除的地址開(kāi)始分配。

格式:ALIGNNUM;NUM必須是2的冪

例:見(jiàn)P83例4.18

四、段和模塊定義偽指令1.段定義偽指令指令格式: 段名 SEGMENT[定位][組合][段字]['類別'] …… 段名 ENDS段名必須相同,SEGMENT和ENDS必須成對(duì)出現(xiàn)。(1)定位屬性:指定邏輯段的起始地址BYTE:段起始地址為下一個(gè)可用的字節(jié)地址;WORD:段起始地址為下一個(gè)可用的偶數(shù)地址;DWORD:段起始地址為下一個(gè)可被4整除的地址;PARA:段起始地址為下一個(gè)可被16整除的地址;PAGE:段起始地址為下一個(gè)可被256整除的地址。默認(rèn)的定位類型為PARA,其低4位是0,所以默認(rèn)情況下數(shù)據(jù)段的偏移地址從0開(kāi)始。(2)組合屬性:指定段與段之間的關(guān)系。可為:無(wú):本段與其他段沒(méi)有邏輯關(guān)系,不與其他段合并。每段都有自己的段地址。PUBLIC:連接程序把本段與所有同名同類型的其他段相鄰地連接在一起,然后為所有這些段指定一個(gè)共同的段地址,也就是合成一個(gè)物理段。STACK:指定堆棧段。連接程序?qū)⑺蠸TACK段按照與PUBLIC段的同樣方式進(jìn)行合并。通常組合屬性在多模塊設(shè)計(jì)時(shí)使用。單模塊下,除堆棧段必須使用組合屬性STACK外,各段相互獨(dú)立,不與其他段合并,無(wú)須指定組合屬性。(3)段字屬性:只有使用了.386等方式的偽指令這個(gè)屬性才起作用,它有以下兩種類型:USE16:該段按16為尋址,與8086尋址方式相同;USE32:該段按32位尋址。(4)‘類別名’屬性:為保持所有代碼和數(shù)據(jù)的連續(xù),將類別名相同的段連續(xù)存放,但各有各的段地址。通常使用‘code’,‘data’和‘stack’等類別名。

2.指定段寄存器偽指令格式1:ASSUME段寄存器:段名[,段寄存器:段名……]如ASSUMECS:CODE,DS:DATA格式2:ASSUME段寄存器:NOTHING功能:對(duì)指令給出的段寄存器取消已經(jīng)指定的缺省關(guān)系。

3.過(guò)程定義偽指令一個(gè)匯編程序可以由一個(gè)主過(guò)程和若干個(gè)子過(guò)程組成。過(guò)程定義偽指令就是將邏輯上相對(duì)獨(dú)立的程序段定義成過(guò)程,便于程序的閱讀和調(diào)試。格式:過(guò)程名PROCNEAR/FAR

…… RET過(guò)程名ENDP例:同一代碼段內(nèi)調(diào)用程序DATA SEGMENTSTR2 DB'TheFirstSubroutione!','$'STR3 DB'TheSecondSubroutione!','$'DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA

MOV DS,AX CALL FIRST CALL SECOND MOV AH,4CH INT

21HFIRST PROC LEADX,STR2 MOVAH,09H INT 21H RETFIRST ENDPSECOND PROC LEA DX,STR3 MOVAH,09H INT21H RET SECOND ENDPCODE ENDS

END START

4.模塊通信偽指令匯編語(yǔ)言可以由多個(gè)模塊構(gòu)成,一個(gè)模塊也可以分成幾個(gè)子模塊。(1)全局符號(hào)說(shuō)明偽指令PUBLIC格式:PUBLIC符號(hào)[,…]符號(hào)可以是常量、變量、標(biāo)號(hào),過(guò)程名。(2)外部符號(hào)說(shuō)明為指令EXTRNEXTRN指明的符號(hào)是由其他模塊定義的,并由PUBLIC語(yǔ)句說(shuō)明過(guò)的,符號(hào)在本模塊被引用。格式:EXTRN符號(hào):類型[,…]符號(hào)的含義與PUBLIC相同例:見(jiàn)課本P86五、其他偽指令1.程序開(kāi)始定義偽指令在程序的開(kāi)始可以用NAME或TITLE作為模塊的名字。格式:NAME 模塊名也可使用TITLE偽指令指定模塊名,其格式: TITLE 標(biāo)題名TITLE偽指令的主要作用是指定列表文件的每一頁(yè)上打印的標(biāo)題,在沒(méi)有NAME偽指令時(shí),匯編程序?qū)⒂脴?biāo)題名中的前6個(gè)字符作為模塊名,標(biāo)題最多可有60個(gè)字符。如果程序中既無(wú)NAME又無(wú)TITLE偽指令,則用源文件名作為模塊名。所以NAME及TITLE偽指令并不是不可缺少的,但一般經(jīng)常使TITLE,以便在列表文件中能打印出標(biāo)題來(lái)。

2.源程序結(jié)束定義偽指令 格式:END標(biāo)號(hào)匯編程序?qū)⒃谟鯡ND時(shí)結(jié)束匯編

第5章基本程序設(shè)計(jì)一般來(lái)說(shuō),編寫(xiě)匯編程序應(yīng)遵循如下步驟:(1)分析問(wèn)題,確定算法(2)繪制流程圖(3)分配資源(4)根據(jù)流程圖編寫(xiě)程序(5)上機(jī)調(diào)試程序從程序結(jié)構(gòu)上看,匯編程序有順序、分支、循環(huán)和子程序四種基本結(jié)構(gòu)形式。

5.1順序程序設(shè)計(jì)順序程序設(shè)計(jì)也稱為簡(jiǎn)單程序設(shè)計(jì)或直接程序設(shè)計(jì)。順序程序是程序的基本組成部分。一、存儲(chǔ)單元內(nèi)容移位將存儲(chǔ)單元A中的內(nèi)容左移4位,存儲(chǔ)單元B中的內(nèi)容右移2位(移位后的空位為0)。分析:實(shí)現(xiàn)存儲(chǔ)單元內(nèi)容移位,可以直接使用移位指令。但要求移后空位為0,故應(yīng)使用邏輯移位指令。程序段如下: MOV CL,4 SHL A,CL MOV CL,2 SHR B,CL二、

屏蔽與組合將字類型變量A的高4位和低4位置0,其余各位保持不變。分析:對(duì)字或字節(jié)變量中的部分位進(jìn)行置0操作,稱為屏蔽操作。它們是數(shù)據(jù)處理常用的方法之一。多用于數(shù)據(jù)或碼型變換中,它們可用邏輯運(yùn)算指令實(shí)現(xiàn)。程序段如下: MOV AX,A AND AX,0FF0H MOV A,AX三、

拆字

將存儲(chǔ)單元A中兩個(gè)壓縮BCD數(shù)拆成兩個(gè)非壓縮BCD數(shù)(高位BCD數(shù)放C單元中,低位BCD數(shù)放B單元中),然后分別轉(zhuǎn)換為兩個(gè)ASCII代碼。分析:將A單元BCD數(shù)拆開(kāi)可以采用移位,對(duì)高位BCD數(shù)可右移4位而成為非壓縮數(shù)。低位BCD數(shù),可用屏蔽其高4位而成為非壓縮BCD數(shù)。然后分別與30H進(jìn)行邏輯或運(yùn)算而成為ASCII代碼。程序段如下: MOV AL,A MOV CL,4 SHR AL,CL OR AL,30H MOV C,AL MOV AL,A AND AL,0FH OR AL,30H MOV B,AL四、查表程序設(shè)計(jì)平方表、立方表等可以使用查表指令來(lái)完成XLAT五、加減運(yùn)算已知Z=(X+Y)-(W+Z),其中X,Y,Z,W均為字節(jié)存儲(chǔ)單元,存放的數(shù)據(jù)均用壓縮BCD碼表示。編寫(xiě)完成上式的程序段。分析:這也是一種典型的順序程序,在這里要注意是BCD數(shù)相加,要進(jìn)行十進(jìn)制調(diào)整。程序段如下: MOV AL,Z MOV BL,W ADD AL,BL DAA MOV BL,AL MOV AL,X MOV DL,Y ADD AL,DL DAA SUB AL,BL DAS MOV Z,AL六、乘法運(yùn)算將寄存器BL內(nèi)容進(jìn)行乘10運(yùn)算。分析:對(duì)一個(gè)數(shù)進(jìn)行乘10運(yùn)算,這在數(shù)值運(yùn)算中是經(jīng)常用到的。它可以直接使用乘法指令實(shí)現(xiàn),程序段如下: MOV AL,10 MUL BL但執(zhí)行過(guò)程至少需要70個(gè)時(shí)鐘周期,所用時(shí)間太長(zhǎng)。

如果利用移位操作,左移一位,相當(dāng)于原數(shù)乘2,因此也可以用移位操作實(shí)現(xiàn)乘10運(yùn)算。 MOV AL,BL MOV AH,0 SAL AX,1 MOV BX,AX SAL AX,1 SAL AX,1 ADD AX,BX使用上述程序段,只需15個(gè)時(shí)鐘周期,雖然程序顯得繁瑣些,但執(zhí)行時(shí)間比直接使用乘法指令要快得多。也可以使用加法實(shí)現(xiàn)乘10運(yùn)算 MOV AL,BL MOV AH,0 ADD AX,AX MOV BX,AX ADD AX,AX ADD AX,AX ADD AX,BX 上述程序段所需時(shí)間為18個(gè)時(shí)鐘周期。所以完成簡(jiǎn)單的乘法運(yùn)算,還是使用移位或加法運(yùn)算為快。七、

混合運(yùn)算用順序結(jié)構(gòu)來(lái)編程實(shí)現(xiàn)求無(wú)符號(hào)數(shù)S=(X2+Y2)/Z的值,將最后結(jié)果放入RESULT單元保存。分析:本題中要定義四個(gè)變量,X、Y、Z是計(jì)算表達(dá)式涉及到的數(shù)據(jù),RESULT單元是結(jié)果的存放單元。為方便數(shù)據(jù)的重復(fù)使用,采用寄存器來(lái)存放中間結(jié)果X2和Y2。源程序:DATA SEGMENT

X DB 5

Y DB 7 Z DB 2RESULT DB ?DATA ENDSCODE SEGMENT

ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AL,X MUL X MOV BX,AX MOV AL,Y MUL Y ADD AX,BX DIV Z MOV RESULT,AL MOV AH,4CH INT 21HCODE ENDS END START

八、求數(shù)的補(bǔ)碼與反碼將字變量A轉(zhuǎn)換為補(bǔ)碼和反碼,分別存入字變量B和C中。分析:數(shù)據(jù)取反可以直接使用非邏輯指令;對(duì)數(shù)據(jù)求補(bǔ)碼操作,應(yīng)該先取反,末位再加1即可。 MOV AX,A NOT AX MOV B,AX INC AX MOV C,AX當(dāng)然,取補(bǔ)操作也可以直接通過(guò)取補(bǔ)指令實(shí)現(xiàn)。 MOV AX,A NEG AX MOV C,AX DEC AX MOV B,AX5.2分支程序設(shè)計(jì)條件轉(zhuǎn)移指令和無(wú)條件轉(zhuǎn)移指令JMP用于實(shí)現(xiàn)程序的分支在條件轉(zhuǎn)移指令前,通常需要安排算術(shù)運(yùn)算指令、比較指令或測(cè)試指令等能夠影響標(biāo)志位的相關(guān)指令一、單分支程序設(shè)計(jì)編程實(shí)現(xiàn)將鍵盤輸入的小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母顯示出來(lái)。分析:從鍵盤接收數(shù)據(jù)后,在程序中要判斷接收的是否是小寫(xiě)字母,是則進(jìn)行轉(zhuǎn)換,否則不予轉(zhuǎn)換,這樣就需要判斷所輸入字符是否在'a'和'z'的范圍內(nèi),采用單分支結(jié)構(gòu)即可實(shí)現(xiàn)。轉(zhuǎn)換后結(jié)果的顯示通過(guò)DOS功能調(diào)用的02號(hào)功能,將要顯示字符的ASCII碼放在DL中。參考程序如下:CODESEGMENT ASSUMECS:CODESTART:MOVAH,01H ;用DOS調(diào)用的01號(hào)

INT 21H ;功能,從鍵盤輸入字符,AL

CMP AL,'a'

JB EXIT

CMP AL,'z'

JA EXIT

SUB AL,20H MOVDL,AL

MOVAH,02H INT 21HEXIT:MOVAH,4CH INT 21HCODEENDS END START

二、多分支程序設(shè)計(jì)多分支結(jié)構(gòu)具有若干個(gè)條件,每個(gè)條件對(duì)應(yīng)一個(gè)操作程序。程序必須判斷那個(gè)條件成立,從而轉(zhuǎn)去執(zhí)行該條件對(duì)應(yīng)的程序段。多分支程序可以采用用簡(jiǎn)單分支程序組合實(shí)現(xiàn),也可以利用地址表、轉(zhuǎn)移表的方法實(shí)現(xiàn)。1.簡(jiǎn)單分支程序組合實(shí)現(xiàn)編寫(xiě)程序,完成下面的分段函數(shù)的計(jì)算,給定X為帶符號(hào)的字節(jié)數(shù)據(jù)。分析:這是三路分支的程序設(shè)計(jì),根據(jù)題目要求X為內(nèi)存中的一個(gè)帶符號(hào)數(shù)。采用兩重條件判斷:首先判斷X值的正負(fù),若為負(fù)數(shù),將-1送到Y(jié)中保存;若為正數(shù),再判斷X是否為0,如果為0,將0送到Y(jié)中保存,否則將1送到Y(jié)中保存。

1X>0

Y=0X=0

-1X<0源程序:DATA SEGMENT X DB-10 Y DB?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA

MOV DS,AX MOV AL,X CMP AL,0 JGE BIG MOV BL,-1

JMP EXITBIG: JE MIN MOV BL,1

JMP EXITMIN: MOV BL,0EXIT: MOV Y,BL MOV AH,4CH INT 21HCODE ENDS END START2.跳轉(zhuǎn)表法多分支程序設(shè)計(jì)所謂跳轉(zhuǎn)表法是指:把轉(zhuǎn)移到各分支程序的入口地址集中存放在一張表中,如果是段內(nèi)轉(zhuǎn)移,則為16位地址;如果是段間轉(zhuǎn)移,則為32位地址。這張表稱為分支跳轉(zhuǎn)表。把各分支轉(zhuǎn)移程序的入口地址在表中的位置(離表首地址的位移量)作為條件。當(dāng)進(jìn)行多分支條件判斷時(shí),把當(dāng)前條件,位移量加上表首地址作為轉(zhuǎn)移地址,轉(zhuǎn)到表的相應(yīng)位置,取出所轉(zhuǎn)向的子程序的人口地址,達(dá)到多分支的目的。根據(jù)AL中各位被置位情況,控制轉(zhuǎn)移到8個(gè)子程序P1~P8之一中去。分析:對(duì)于這種程序關(guān)鍵要找出每種情況的轉(zhuǎn)移地址,從圖中可見(jiàn)表地址=表基地址+偏移量,而偏移量可由AL各位所在位置×2求得。源程序:DATA SEGMENTBASE DWSR0,SR1,SR2,SR3,SR4,SR5,SR6,SR7DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,ES:DATABEGIN:

PUSH DS XOR AX,AX PUSH AX

MOV AX,DATA MOV DS,AX LEA BX,BASE IN AL,PORTGETBIT:RCR AL,1

JC GETAD

INC BX INC BX

JMP GETBITGETAD:JMP WORD PTR[BX] CODE ENDS END BEGIN5.3循環(huán)程序設(shè)計(jì)主要內(nèi)容包括循環(huán)程序的結(jié)構(gòu)、循環(huán)程序的控制方法、單重循環(huán)程序的設(shè)計(jì)和多重循環(huán)程序的設(shè)計(jì)。5.3.1循環(huán)程序的結(jié)構(gòu)所謂循環(huán)程序是指重復(fù)執(zhí)行某個(gè)程序段若干次,直到滿足某個(gè)條件才結(jié)束的程序。循環(huán)程序一般由四部分組成:(1)置循環(huán)初值部分(2)循環(huán)的工作部分(3)循環(huán)的修改部分(4)循環(huán)的判終控制部分循環(huán)程序的這四個(gè)部分中,工作部分、修改部分和判終控制部分有時(shí)相互包含,相互交叉。但是置循環(huán)初值部分一定在循環(huán)程序的最前部,并且一定不能包含在循環(huán)體內(nèi)。

5.3.2循環(huán)控制指令循環(huán)控制指令就是在循環(huán)結(jié)構(gòu)中用來(lái)控制循環(huán)的指令。例:已知有n個(gè)有符號(hào)二進(jìn)制數(shù),存放在以BUF為首地址的字節(jié)存儲(chǔ)區(qū),試統(tǒng)計(jì)其中正數(shù)和負(fù)數(shù)的個(gè)數(shù)。SI:BUF存儲(chǔ)區(qū)的地址指針,初始值為BUF的偏移地址,每循環(huán)一次,其值增1。CX:循環(huán)計(jì)數(shù)器,初值為0,每循環(huán)一次,其值加1。BX:用來(lái)存放正數(shù)的個(gè)數(shù),初始值為0。DX:用來(lái)存放負(fù)數(shù)的個(gè)數(shù),初始值為0。程序流程圖如下圖所示。源程序:DATA SEGMENTBUF DB -40,78,0,12,-19,4l,-34COUNT EQU $-BUFPLUS DW ?MlNUS DW ?DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATABEGIN: MOV AX,DATA MOV DS,AX MOV BX,0

MOV DX,0

LEA SI,BUF MOV CX,0LOP: MOV AL,[SI] CMP AL,0

JG P1 JE P2

INC DX JMP P2P1: INC BXP2: INC SI

INC CX CMPCX,COUNT JL LOP

MOV PLUS,BX

MOVMINIUS,DX

MOVAH,4CH INT 21HCODEENDS ENDBEGIN

回顧幾條指令:1.計(jì)數(shù)循環(huán)指令LOOP2.相等/為零循環(huán)指令LOOPE/LOOPZ3.不相等/不為零循環(huán)指令LOOPNE/LOOPNZ4.跳轉(zhuǎn)指令JCXZ例:編寫(xiě)程序段,求N1和N2兩個(gè)數(shù)組對(duì)應(yīng)的數(shù)據(jù)之和(數(shù)組中的數(shù)據(jù)個(gè)數(shù)為M),并將結(jié)果存入到新數(shù)組N3中。此計(jì)算一直進(jìn)行到兩數(shù)之和為0或數(shù)組結(jié)束,并將新數(shù)組的長(zhǎng)度存放在N4單元中。程序段如下:

MOV CX,M MOV BX,-1L1: INC BX

MOV AL,N1[BX] ADD AL,N2[BX]

MOV N3[BX],AL LOOPNZ L1 JZ L2 INC BXL2: MOV N4,BX5.3.3循環(huán)程序設(shè)計(jì)方法循環(huán)程序的控制方法一般有計(jì)數(shù)控制法、條件控制法、邏輯尺控制法和開(kāi)關(guān)控制法四種,其中,最常見(jiàn)的為計(jì)數(shù)控制法和條件控制法。

1.計(jì)數(shù)控制法通過(guò)某一計(jì)數(shù)器的值來(lái)控制程序循環(huán)次數(shù)的方法稱為計(jì)數(shù)控制法。計(jì)數(shù)控制法常用于循環(huán)次數(shù)已知的循環(huán)程序設(shè)計(jì)。用計(jì)數(shù)寄存器CX及專門的循環(huán)指令來(lái)控制程序的循環(huán)是最簡(jiǎn)單的循環(huán)程序?qū)崿F(xiàn)方法。設(shè)循環(huán)次數(shù)為n,以下三種方法實(shí)現(xiàn)計(jì)數(shù)控制。(1)先將循環(huán)次數(shù)n送入循環(huán)計(jì)數(shù)器CX中,再由LOOP指令來(lái)控制循環(huán)的結(jié)束,即

MOV CX,nLOP: …… ;循環(huán)體

…… LOOP LOP執(zhí)行LOOP指令時(shí),每循環(huán)一次,計(jì)數(shù)器CX的內(nèi)容自動(dòng)減l,直至循環(huán)計(jì)數(shù)器中的內(nèi)容為0時(shí)結(jié)束循環(huán)。(2)先將循環(huán)次數(shù)的負(fù)值送入循環(huán)計(jì)數(shù)器CX中,然后在循環(huán)體內(nèi)由指令對(duì)寄存器進(jìn)行加1運(yùn)算,直至寄存器的值為0時(shí)結(jié)束循環(huán),即

MOVCX,-nLOP:…… …… ;循環(huán)體

INC CX JNZ LOP每循環(huán)一次,計(jì)數(shù)器CX的內(nèi)容增1,直至循環(huán)計(jì)數(shù)器中的內(nèi)容為0時(shí)結(jié)束循環(huán)。(3)先將0送入循環(huán)計(jì)數(shù)器中,然后每循環(huán)一次,計(jì)數(shù)器加1,直至循環(huán)計(jì)數(shù)器的內(nèi)容為與循環(huán)次數(shù)n相等時(shí)退出循環(huán),即

MOV CX,0LOP:…… ……

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論