微機(jī)原理與接口技術(shù)教學(xué)課件_第1頁(yè)
微機(jī)原理與接口技術(shù)教學(xué)課件_第2頁(yè)
微機(jī)原理與接口技術(shù)教學(xué)課件_第3頁(yè)
微機(jī)原理與接口技術(shù)教學(xué)課件_第4頁(yè)
微機(jī)原理與接口技術(shù)教學(xué)課件_第5頁(yè)
已閱讀5頁(yè),還剩117頁(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ù)

講課教師:王愛(ài)學(xué)

本課程研究的內(nèi)容

1、計(jì)算機(jī)硬件:構(gòu)成計(jì)算機(jī)的各種元件、器件和設(shè)備實(shí)物。

2、計(jì)算機(jī)軟件:為應(yīng)用計(jì)算機(jī)所編制的程序。

微機(jī)原理課程與其它課程的關(guān)系:

數(shù)字邏輯一一計(jì)算機(jī)原理一一計(jì)算機(jī)匯編語(yǔ)言一一微機(jī)原理

——計(jì)算機(jī)網(wǎng)絡(luò)

一一單片機(jī)原理

本學(xué)期所學(xué)課程實(shí)際上包括了匯編語(yǔ)言部分。

匯編語(yǔ)言:是與計(jì)算機(jī)硬件密切相關(guān)的程序設(shè)計(jì)語(yǔ)言,其基本

語(yǔ)句對(duì)應(yīng)硬件的一個(gè)基本命令。

課程要求

1、3次以上(包括3次)不交作業(yè)的同學(xué)不許參加期

末考試,期末考試成績(jī)計(jì)為0分。

2、無(wú)故不上理論課累計(jì)3次以上(包括3次)的同學(xué)

不許參加期末考試,期末考試成績(jī)計(jì)為0分。

3、無(wú)故不上實(shí)驗(yàn)課累計(jì)3次以上(包括3次)的同學(xué)

不許參加期末考試,期末考試成績(jī)計(jì)為0分。

參考書

1、羅克露、徐潔:微型機(jī)原理與應(yīng)用(電子工業(yè)出版社)

2、沈美明、溫冬嬋:匯編語(yǔ)言程序設(shè)計(jì)(清華大學(xué)出版社)

3、熊桂喜:IBM—PC匯編語(yǔ)言程序設(shè)計(jì)(科學(xué)出版社)

4、周明德:微型計(jì)算機(jī)原理及應(yīng)用(清華大學(xué)出版社)

第一章基礎(chǔ)知識(shí)

1.1二進(jìn)制數(shù)、十進(jìn)制數(shù)及十六進(jìn)制數(shù)(及其轉(zhuǎn)換)(略)

1.2二進(jìn)制數(shù)與十六進(jìn)制數(shù)的運(yùn)算

1.2.1算術(shù)運(yùn)算(略)

1.2.2邏輯運(yùn)算

例:

X=OOFFH=OOOO00001111HUB

Y=5555H=0101010101010101B

按位“與”運(yùn)算

000000001111HUB

A0101010101010101B

0000000001010101B

按位“或”運(yùn)算

oooooooomiHUB

V0101010101010101B

0101010111111U1B

按位“異或”運(yùn)算

0000000011111111B

十0101010101010101B

0101010110101010B

1.3ASCII碼和BCD碼(略)

1.4數(shù)值與編碼的轉(zhuǎn)換

把ASCII碼和BCD等轉(zhuǎn)換成對(duì)應(yīng)的數(shù)值。

例:

2的ASCII碼為32H,轉(zhuǎn)換成數(shù)值為:00000010(計(jì)

算機(jī)中)

在程序中,使用一定的算法進(jìn)行轉(zhuǎn)換。

第二章IBM-PC計(jì)算機(jī)組織

2.1IBM-PC微型計(jì)算機(jī)的基本結(jié)構(gòu)

計(jì)算機(jī)由三大部分組成:

中央處理器CPU(包括運(yùn)算器、控制器)。

存儲(chǔ)器。

輸入/輸出設(shè)備。

各組成部分的功能:

運(yùn)算器:負(fù)責(zé)執(zhí)行所有的算術(shù)和邏輯運(yùn)算。

控制器:負(fù)責(zé)指令執(zhí)行時(shí)的控制工作(把指令逐條從

存儲(chǔ)器中取出,經(jīng)譯碼分析后發(fā)出取操作數(shù)、執(zhí)行、

存儲(chǔ)運(yùn)算結(jié)果等控制指令)。

存儲(chǔ)器(內(nèi)存):是計(jì)算機(jī)的記憶部件,它通過(guò)總線與

CPU相連。用來(lái)存放程序執(zhí)行時(shí)所需的指令和數(shù)據(jù)。

I/O設(shè)備:軟盤驅(qū)動(dòng)器、硬盤、顯示器、鍵盤、打印

機(jī)等設(shè)備。

總線:包括數(shù)據(jù)線、地址線、控制線。

圖2.1PC機(jī)的一般結(jié)構(gòu)

IBM-PC系列機(jī)CPU型號(hào):

Intel8086/8088

8088是一個(gè)準(zhǔn)16位的微處理器,即它的內(nèi)部結(jié)構(gòu)是16

位的,而外部的數(shù)據(jù)總線是8位的,因而它在一個(gè)

總線周期內(nèi)只能訪問(wèn)一個(gè)8位字節(jié)而不是一個(gè)16位

的字。

8086的內(nèi)部結(jié)構(gòu)和外部總線都是16位的,工作性能比

8088好。

80386,80486:是32位微處理器。

Pentium(80586):地址線36位,外部數(shù)據(jù)線64位。

目前,CPU主頻在2GHz左右是常見(jiàn)的計(jì)算機(jī)配置。

2.2IBM-PC上的軟件與匯編語(yǔ)言

軟件可分為兩大類:系統(tǒng)軟件和應(yīng)用軟件。

2.2.1系統(tǒng)軟件和應(yīng)用軟件

系統(tǒng)軟件:由PC機(jī)的生產(chǎn)廠家及其配套設(shè)備的供應(yīng)商

為用戶提供的一組程序,這些程序是用戶使用機(jī)器

時(shí)為產(chǎn)生、準(zhǔn)備和執(zhí)行用戶程序所必需的。(典型

的系統(tǒng)軟件:操作系統(tǒng))

應(yīng)用軟件:用戶自己和一些生產(chǎn)商為某種應(yīng)用而編寫

的專門軟件。

2.2.2高級(jí)語(yǔ)言、匯編語(yǔ)言、機(jī)器語(yǔ)言

機(jī)器指令是由二進(jìn)制代碼組成的,直接以指令來(lái)編程的

語(yǔ)言便是機(jī)器語(yǔ)言。(編程者使用不方便)

匯編語(yǔ)言:用符號(hào)以一定的簡(jiǎn)單語(yǔ)法來(lái)表示機(jī)器指令,

其語(yǔ)句與機(jī)器語(yǔ)言一一對(duì)應(yīng)。

高級(jí)涪言:以人們易于理解的語(yǔ)句和構(gòu)造來(lái)編程的語(yǔ)言

稱為高級(jí)涪言,如C,BASIC,PASCALFORTRAN,C+

+等。

高級(jí)溶言一一用編譯程序編譯一一機(jī)器語(yǔ)言

匯編語(yǔ)言源程序一一用匯編器匯編一一機(jī)器語(yǔ)言

高級(jí)語(yǔ)言易學(xué)易用,基本符合數(shù)學(xué)語(yǔ)言和自然語(yǔ)言的習(xí)

慣,而用匯編語(yǔ)言編程則要困難得多。

為什么要學(xué)習(xí)匯編語(yǔ)言?

1、通過(guò)匯編語(yǔ)言去理解計(jì)算機(jī)運(yùn)行軟件的過(guò)程。(匯

編語(yǔ)言與機(jī)器指令基本上是一一對(duì)應(yīng)的)

2、某些底層系統(tǒng)軟件必須用匯編涪言來(lái)編寫,例如主

板上的BIOS及一些設(shè)備的驅(qū)動(dòng)程序。這是由于要直接

與下層硬件打交道,高級(jí)語(yǔ)言很難勝任。

3、匯編語(yǔ)言程序的執(zhí)行效率高,運(yùn)行代碼占用內(nèi)存少。

有些軟件的程序段需要頻繁執(zhí)行且要求速度快,必須

使用匯編語(yǔ)言。

例:Windows環(huán)境下的寫屏軟件,圖形、圖像處理中的

壓縮還原過(guò)程。

2.2.3匯編語(yǔ)言的開發(fā)環(huán)境(略)

(以后在上機(jī)實(shí)驗(yàn)前進(jìn)行詳細(xì)的學(xué)習(xí)。)

2.3Intel8086/8088CPU的寄存器結(jié)構(gòu)

8086CPU:16位CPU,時(shí)鐘頻率:5MHz——10MHz

數(shù)據(jù)線:16根,可處理8位或16位數(shù)據(jù)

地址線:20根,地址空間:22。=1MB

8088CPU:16位CPU,時(shí)鐘頻率:5MHz——10MHz

內(nèi)部數(shù)據(jù)線:16根,可處理8位或16位數(shù)據(jù)

外部數(shù)據(jù)線:8根,可處理8位數(shù)據(jù)

地址線:20根,地址空間:22。=1MB

2.3.1通用寄存器

通用寄存器共8個(gè)(右圖)AHALAX

分兩組,數(shù)據(jù)寄存器(前4個(gè):AX,BX,

CX,DX)用作存放數(shù)據(jù)。BHBX

指針和變址寄存器(后4個(gè)),用CHCLCX

于存放指針。

1.數(shù)據(jù)寄存器DHDX

AX,BX,CX,DX可分別拆分成2個(gè)8位寄

存器。SP

AX:累加器(accumulator),在算術(shù)運(yùn)

算時(shí),用AX來(lái)存放操作數(shù)和運(yùn)算結(jié)果。BP

BX:基址寄存器(baseaddress),計(jì)算

存儲(chǔ)器地址時(shí)使用。SI

CX:計(jì)數(shù)寄存器(count),循環(huán)、串

操作時(shí)用于計(jì)數(shù)。DI

AX

BX

CX

DX

IP:指令指針寄存器(instructionpointer)是專用的16位寄

存器,它表示的是當(dāng)前要執(zhí)行的指令在代碼段中的偏移地址。

程序員不能直接訪問(wèn)IP,只有轉(zhuǎn)移指令、子程序調(diào)用及返回

指令、中斷調(diào)用及返回指令才能修改IP(有時(shí)還會(huì)修改CS)。

2.3.4標(biāo)志寄存器

OFDFIFTFSFZFAFPFCF

標(biāo)志寄存器:用于表示程序運(yùn)行時(shí)(數(shù)據(jù)處理時(shí))的狀態(tài)。

各標(biāo)志位的作用:

進(jìn)位標(biāo)志CF(carryflag):有進(jìn)位或借位時(shí)為1;

奇偶標(biāo)志PF(parityflag):結(jié)果低8位“1〃的個(gè)數(shù)為偶數(shù)時(shí)

為1。

輔助進(jìn)位標(biāo)志AF(auxiliarycarryflag):進(jìn)行算術(shù)運(yùn)算時(shí),

如果低4位產(chǎn)生了進(jìn)位時(shí)為1。此標(biāo)志用于十進(jìn)制運(yùn)算時(shí)的

調(diào)整。

零標(biāo)志ZF(zeroflag):運(yùn)算結(jié)果為0時(shí)為1。

符號(hào)標(biāo)志SF(signflag):等于運(yùn)算結(jié)果的最高位(符號(hào)位)。

以下幾個(gè)標(biāo)志可暫不講述。

跟蹤標(biāo)志TF(trapflag),當(dāng)TF=1時(shí),在執(zhí)行完一條指

令后就會(huì)產(chǎn)生單步中斷,然后由單步中斷處理程序把

TF置為0。TF標(biāo)志用于調(diào)試。

中斷標(biāo)志IF(interruptflag),當(dāng)IF=1時(shí),允許響應(yīng)可

屏蔽中斷,否則關(guān)閉中斷。

方向標(biāo)志DF(directionflag),DF用于控制串操作指令地

址的增減。如果DF=1,則每次串操作后使變址寄存

器SI和DI減1(字節(jié)指令)或減2(字指令);如果DF=0,

則每次串操作后使變址寄存器SI和DI加1(字節(jié)指令)或

加2(字指令)。

2.4PC機(jī)的內(nèi)存組織

Intel8086/8088:有20根地址線,總的內(nèi)存大小為2?。=1MB。

2.4.1內(nèi)存地址與字節(jié)、字的存放

8位二進(jìn)數(shù):一個(gè)字節(jié)(byte)。

位7654321cl

111111111111

內(nèi)存單元的基本單位為字節(jié),每個(gè)內(nèi)存單元都分配了一個(gè)唯一的

地址。

地址范圍:00000000000000000000B——

mimimimiHUB

十六進(jìn)制數(shù)表示:00000H—FFFFFH

16位的信息稱為1個(gè)字,任何相鄰兩個(gè)單元都可以組成1個(gè)字。

字的地址是第1個(gè)字節(jié)的地址。

在內(nèi)存中,低字節(jié)在前,高字節(jié)在后。

地址存儲(chǔ)單元(字節(jié))

00000H_________0

00001H

FFFFFH1MB

例:

(a)將字節(jié)12H及34H分別放入AH,AL寄存器;

AHAL

12H34H

例:

(b)將字1234H放入AX寄存器;

AHAL

12H34H

例:例:

(c)將至節(jié)12H及34H分別放入內(nèi)(d)將字1234H放入內(nèi)存單元

存單元1FFFFH及20000H處;1FFFFH處。

地址地址

1FFFFH1FFFFH

20000H20000H

例:將雙字12345678H(32位二進(jìn)制)存入內(nèi)存單元

1FFFFH處。

地址內(nèi)容

……1

1FFFFH78H

20000H56H

20001H34H

20002H-12H1

2.4.2內(nèi)存地址的分段

Intel8086/8088有20根地址線,其內(nèi)存尋址空間為1MB。

為了表示某個(gè)地址,需要20位。

機(jī)器字長(zhǎng)為16位,它能表示的最大內(nèi)存空間為216=64KBo

Intel8086/8088采用分段訪問(wèn)內(nèi)存的辦法,使得16位寄存器

可以訪問(wèn)20位地址(64K個(gè)段,每段最多64KB)。

位190

物理地址

位150

段地址0000

位150

段內(nèi)地址

2.4.3物理地址和邏輯地址

20位物理地址采用Intel的分段方法將其分為16位的段地

址和16位的段內(nèi)地址(偏移值)o

用段地址和偏移地址來(lái)表示內(nèi)存單元地址的形式稱為邏

輯地址,寫成“段地址:偏移地址”的格式。

例:物理地址00000H:

0000H:0000H

段地址乘以16(左移4位)再加上偏移地址,即可得到

物理地址。

段地址X16D(或10H)+偏移地址=物理地址

例:設(shè)邏輯地址為1234H:5678H,則物理地址為:

1234HX10H+5678H=12340H+5678H=179B8H

如果給定一個(gè)物理地址,要算出它的邏輯地址,則有很

多個(gè)結(jié)果。

例:179B8H的邏輯地址如下:

1000H:79B8H

1001H:79A8H

1234H:5678H

179BH:0008H

1234H:5678H只是各種分段結(jié)果中的一種。

段地址中增加1,內(nèi)存空間就增加16D(10H)。16字節(jié)稱為

1節(jié)(paragraph),英文簡(jiǎn)寫的para就代表1節(jié)。

2.4.4實(shí)際內(nèi)存分配方法

例:假定一個(gè)程序的代碼段大小為

4096D,數(shù)據(jù)段大小為8180D,堆棧段

大小為252D。

按節(jié)方式上舍入為4096D,8192D,256D,內(nèi)存

即1000H,2000H,lOOHo

設(shè)給此程序分配的內(nèi)存區(qū)從21000H開始21000H

(節(jié)邊界對(duì)齊),這三個(gè)段在內(nèi)存中的代碼段

位置為:21FFFH

22000H

段寄存器

數(shù)據(jù)段

CS2100H23FFFH

DS2200H24000H

SS2400H堆棧段

ES240FFH

內(nèi)存起始地址21000H,起始段地址為2100H。

代碼段、數(shù)據(jù)段、堆棧段大小依次為:

1000H,2000H,lOOHo

SS=DS+200H=2400Ho

代碼段、數(shù)據(jù)段及堆棧段的偏移地址范圍分別為:

O-OFFFH,0-1FFFH,0?FFH。

2.5堆棧

堆棧(stack):是內(nèi)存中的一塊特定區(qū)域,用于暫時(shí)緩存數(shù)據(jù)。

2.5.1堆棧在哪里

堆棧由軟件設(shè)置,是在內(nèi)存中劃出一塊區(qū)域作為堆棧。堆棧的

一端位置固定(棧底),另一端是浮動(dòng)的(棧頂)。信息的

存取在棧頂進(jìn)行。

堆棧的位置和大小由SS及SP寄存器確定。

例:

設(shè)開始時(shí)(棧底)位置為:SS=2400H,SP=100H,運(yùn)行一段

時(shí)間后,堆棧中壓入了一些數(shù)據(jù),SP=80Ho堆棧位置如下

圖所示。

CS

24000H

DS

SS

ES24080H(棧頂)

SP

24100H(棧底)

堆棧的棧底由初始SP值決定,它等于堆棧段中最大數(shù)據(jù)單元處

的地址加1(棧底不存數(shù)據(jù))。

堆棧的棧頂也由SP值決定,隨著不斷的壓棧操作,SP的值會(huì)減

小,棧頂也就相應(yīng)地變化。如果未壓入內(nèi)容,或壓入了內(nèi)容

后,又全部彈出,則棧頂與棧底相同。

無(wú)論是壓入還是彈出,都是以字為單位進(jìn)行(不能進(jìn)行字節(jié)或

雙字操作)。

例:設(shè)SS=2000H,SP=100H,試分析如下一小段程序中PUSH

語(yǔ)句的執(zhí)行過(guò)程。

MOVAX,1234H;將1234H送入AX

PUSHAX;將AX中的內(nèi)容壓入堆棧

執(zhí)行PUSHAX指令的過(guò)程:

(1)SP-SP-2;將堆棧指針減2

(2)(SP)—AX;將AX中的一個(gè)字送入堆棧段內(nèi)由SP指向的

偏移地址處

內(nèi)存

段寄存器

cs堆棧段2000H:0000H

DS

SS

ES

SP

2000H:0100H

段寄存器內(nèi)存

cs

DS堆棧段2000H:0000H

ss

ES

SPOOFEH34H2000H:00FEH

12H2000H:00FFH

2000H:0100H

AX1234H

??????

出棧指令為:POPAX,工作過(guò)程和入棧操作相反(略)。

第三章尋址方式與指令系統(tǒng)

3.1指令格式

指令結(jié)構(gòu):

操作碼操作數(shù)地址

操作碼:指明計(jì)算機(jī)所要執(zhí)行的操作。

操作數(shù)地址:指出指令在執(zhí)行過(guò)程中要處理的數(shù)據(jù)地址。

3.2尋址方式

尋址方式:是指指令中尋找操作數(shù)的方式。

1.立即尋址(用于寄存器賦值)

例:MOVAX,2056H內(nèi)存

AX

AHAL

/MOV30000H

56H30001H

20H30002H

2.寄存器尋址

寄存器尋址:指令中所需的操作數(shù)在CPU的某個(gè)寄存器中。存

取這類操作數(shù)完全在CPU內(nèi)部進(jìn)行,不需要?jiǎng)佑每偩€訪問(wèn)內(nèi)

存,所以執(zhí)行速度比較快。

例:

MOVAX,BX;源和目的操作數(shù)都是寄存器尋址方式

MOVAX,1234H

ADDBX,AX

PUSHDS;源操作數(shù)是寄存器尋址方式

3.直接尋址

直接尋址:操作數(shù)的偏移地址(有效地址)直接在指令中指出。

例:

為有效地處

MOVAX,[1000H];1000H一內(nèi)存

(設(shè):DS=2000H)

……

OP代碼段

00

10

AX

AHAL?…

A20000H數(shù)據(jù)段

A?…

21000H40

30

4.寄存器間接尋址

操作數(shù)的有效地址EA不是位于指令中,而是位于基址寄存器

BX、BP或變址寄存器SI、DI中。地址是通過(guò)一個(gè)寄存器

來(lái)指明,因而稱為寄存器間接尋址。

例:MOVAX,[DI]

設(shè)DS=3000H,DI=2000H

物理地址:30000H+2000H=32000H

內(nèi)存

AX

AHAL....

個(gè)30000H數(shù)據(jù)段

A

32000HBO

40

段跨越前綴舉例:

MOVCX,ES:[BX]

MOVBX,ES:[2000H]

;鍵入字符串并顯示

datasegment

stringdb30,0,30dup(?)

;最大串長(zhǎng),實(shí)際串長(zhǎng),串

strldb13J0J$'

dataends

*

codesegment

assumecs:code,ds:data

keyinprocfar

begin:movax9data

movds,ax

movdx,offsetstring;指定數(shù)據(jù)緩沖區(qū)首地址

movah,Oah;21h號(hào)中斷的Oah號(hào)功能

int21h;接收從鍵盤鍵入的數(shù)據(jù)到緩沖區(qū)

movcl,string+l;取實(shí)際串長(zhǎng)度

xorch,ch;cx中是實(shí)際串長(zhǎng)度

adddx,cx;dx指向(串尾部一2)的內(nèi)存單元

adddx,2;dx指向串尾部

movbx,dx;必須使用bx間接尋址

movbyteptr[bx]/$5

leadx,strl

movah,9;21h號(hào)中斷的09h號(hào)功能

int21h;顯示回車換行

leadx,string+2;鍵入串的起始地址

movah,9

int21h;顯示鍵入的串

movah,4ch;21h號(hào)中斷的4ch號(hào)功能

int21h;返回DOS操作系統(tǒng)

keyinendp;過(guò)程結(jié)束

codeends;代碼段結(jié)束

endbegin;指出可執(zhí)行的第一行代碼地址

;鍵盤鍵入的小寫字符按大寫顯示

datasegment

stringdb2,0,2dup(?)

dataends

codesegment

assumecs:code,ds:data

keyinprocfar

begin:movax,data

movds,ax

loopl:movdx,offsetstring

movah90ah

intllh

moval,string+2

cmpalj!'

jzdone

cmpal961h

jbloopl

cmpal,7ah

jaloopl

subal920h

movstring+2,al

movstring+3/$!

leadx,string+2

movah,9

int21h

jmploopl

done:movah,4ch

int21h

keyinendp

codeends

endbegin

5.寄存器相對(duì)尋址

寄存器相對(duì)尋址(變址尋址):操作數(shù)的有效地址EA是一

個(gè)基址寄存器或變址寄存器的內(nèi)容和指令中指定的8位

和16位位移量之和:

EA=[BX]+8位或16位位移量

[BP]+8位或16位位移量

[SI]+8位或16位位移量

[DI]+8位或16位位移量

例:

MOVAX,[2040H+BP]

若:SS=5000HBP=3000H

則:EA=3000H+2040H=5040H

物理地址=50000H+5040H=55040H

5000H

ss■內(nèi)y存

BP3000H

OP代碼段

OP

40H

20H

IIX

AHAL

50000H

AA??????堆棧段

55040H48

55

6.基址加變址尋址

特點(diǎn):有兩個(gè)寄存器出現(xiàn)在指令中。其中基址寄存器為

BX或BP,變址寄存器為SI或DL

例:

MOVAX,[BX][SI]

MOVAX.[BX+SI];等同上一條指令

設(shè):DS=3200H,BX=0456H,SI=1094H

則:EA=0456H+1094H=14EAH

物理地址=32000H+14EAH=334EAH

7.相對(duì)的基址加變址尋址:

例:

MOVAL,[BX+DI+12]

設(shè):DS=8000H,BX=0100H,DI=0010H

則物理地址=80000H+0100H+0010H+12(或者是OCH)

=80UCH

3.1.2小節(jié)(補(bǔ)充)

8086/8088的機(jī)器語(yǔ)言格式(1—7個(gè)字節(jié)構(gòu)成指令)

機(jī)器指令的第一字節(jié):76543210

操作碼DW

D指出下一字節(jié)REG段是源還是目的。

1一目的操作數(shù)是在寄存器,否則,源操作數(shù)在寄存器。

(雙操作數(shù)指令中,至少有一個(gè)操作數(shù)在寄存器,源為立即數(shù)除

外。)

W字操作位,1——字操作,否則是字節(jié)操作。

機(jī)器指令的第二字節(jié):76543210

MOD=11

MODREGR/M

表示寄存器尋址

R/M表示寄存器

MOD=其它

表示存儲(chǔ)器尋址,R/M表示內(nèi)存地址

MOD=H時(shí):

若W=0則:R/M000001010011100101110111

表示ALCLDLBLAHCHDHBH

若W=1則:R/M000001010011100101110111

表示AXCXDXBXSPBPSIDI

例:ADDCL,BH

MOD=00時(shí),存儲(chǔ)器尋址,不帶位移量。

由R/M段指出內(nèi)存地址。

000001010011100101110111

[BX+SI][BX+DI][BP+SI][BP+DI][SI][DI]直接尋址[BX]

其中直接尋址方式:下兩個(gè)字節(jié)(第3—4字節(jié))是16位直接地址。

MOD=01時(shí),存儲(chǔ)器尋址,帶一個(gè)位移量字節(jié)(8位位移量)。

由R/M段指出內(nèi)存地址。

MOD=10時(shí),存儲(chǔ)器尋址,帶2個(gè)位移量字節(jié)(16位位移量)。

由R/M段指出內(nèi)存地址。

例:ADD例45H[BX][DI],DX

機(jī)器語(yǔ)言指令:01914521H

00000001100100010100010100100001

00000001100100010100010100100001

立即尋址的機(jī)器指令第一字節(jié):

76543210

操作碼SW

S符號(hào)擴(kuò)展,8位補(bǔ)碼擴(kuò)至16位。

SW=008位操作數(shù)

SW=0116位操作數(shù)

SW=118位操作數(shù)擴(kuò)展至16位

(SW=10無(wú)效)

例:ADD2345H[BX][DI],-105

機(jī)器語(yǔ)言:8381452397H

1000001110000001010001010010001110010111

10000011100000010100010100100011

設(shè):指令執(zhí)行前:

BX=0892HDI=59A3H

DS=2000H(2857AH)=0029H

目的操作數(shù)地址:

20000H+2345H+0892H+59A3H=2857AH

指令執(zhí)行后:

(2857AH)=0029H+0FF97H=OFFCOH

OFF97H是97H的帶符號(hào)擴(kuò)展:

1111111110010111

注意事項(xiàng):

使用BP的間接尋址:SS為默認(rèn)段寄存器。

其它:DS為默認(rèn)段寄存器。

有段跨越前綴時(shí),在指令前加一個(gè)字節(jié):

76543210

001SEG110

SEG:00ES01CS10SS11DS

三種情況不允許段跨越:

程序:必為CS堆棧:必為SS串操作的目的串:必為ES

3.3指令系統(tǒng)

Inlel8086/8088的指令系統(tǒng)可分成以下六組:

數(shù)據(jù)傳送指令。

算術(shù)指令。

邏輯指令。

串處理指令。

控制轉(zhuǎn)移指令。

處理機(jī)控制指令。

3.3.1數(shù)據(jù)傳送指令

數(shù)據(jù)傳送指令負(fù)責(zé)把運(yùn)算過(guò)程中所需的數(shù)據(jù)、地址或立

即數(shù)傳送到寄存器或存儲(chǔ)單元中。

1.數(shù)據(jù)通路與類型匹配

數(shù)據(jù)傳送指令的作用,就是在內(nèi)存、通用寄存器、段寄存器、立

即數(shù)之間“傳來(lái)傳去”。在傳送指令的源操作數(shù)和目的操作

數(shù)之間,傳什么,如何傳,既要根據(jù)程序的需要來(lái)設(shè)置,還

要根據(jù)語(yǔ)法規(guī)則及數(shù)據(jù)通路來(lái)決定。

2.MOV和XCHG指令

MOV指令的語(yǔ)法為:

MOVDST,SRC

根據(jù)數(shù)據(jù)通路圖可知如下指令是合法的(其中ac為立即數(shù),

reg為通用寄存器,segreg為段寄存器,mem為內(nèi)存):

MOVreg,acMOVmem,ac

MOVreg,regMOVmem,reg

MOVreg,segregMOVmem,segreg

MOVreg,memMOVsegreg,reg

MOVsegreg,mem

當(dāng)使用段寄存器作目的操作數(shù)時(shí),不允許使用CS作目的

操作數(shù)。

MOV或其他大多數(shù)指令必須遵守以下規(guī)則:

1)源和目的必須類型匹配(8位對(duì)8位,16位對(duì)16位)。

2)目的操作數(shù)不能為立即數(shù)。

3)源和目的操作數(shù)不能同時(shí)為內(nèi)存操作數(shù)(串指令除外)。

4)源和目的操作數(shù)不能同時(shí)為段寄存器。

下面的指令不正確:

(1)MOVAX,BL

(2)MOVES,DS

(3)MOV[DI],[SI]

可以將它們改為:

(1)MOVAL,BL

MOVAH,0

(2)MOVAX,DS

MOVES,AX

(3)MOVAL,[SI]MOV[DI],AL

例:

MOVDL,CL

MOVAX,BX

MOVAX,[2010H]

MOVCL,[BX+5]

MOV[SI],CX

MOVAL,32H

MOVCX,2801H

MOVDS,AX

MOVSS,DX

XCHGOPRI,OPR2;將兩個(gè)操作數(shù)的內(nèi)容互換(不允許任何一個(gè)

操作數(shù)是立即數(shù))

例:XCHGBX,[BP+SI];將BX中的內(nèi)容與堆棧段內(nèi)容互換

XCHG及MOV指令執(zhí)行后都不影響標(biāo)志寄存器。

例:將有效地址為1000H開始的內(nèi)存中100個(gè)連續(xù)存儲(chǔ)單

元清零。

MOVDI,1000H

MOVCX,64H;64H=100

MOVAL,0

BBB:MOV[DI],AL

INCDI

DECCX

JNZBBB

其中,BBB為符號(hào)地址

3.PUSH,POP,PUSHF,POPF指令

PUSH,POP入棧出棧指令

PUSHF,POPF標(biāo)志寄存器入棧出棧指令

例:

在程序中的某一部分里要臨時(shí)借用一下某個(gè)寄存器,但借用

前的內(nèi)容以后還有用,就可以先用PUSH指令將其保存起來(lái),

然后在必要時(shí)再用POP指令恢復(fù)成原來(lái)的內(nèi)容。

PUSHCX

PUSHAX

..;其間的程序要借用CX,AX

POPAX;恢復(fù)AX內(nèi)容

POPCX;恢復(fù)ex內(nèi)容

利用堆棧還可以傳遞內(nèi)容。例:

PUSHDS

POPES;ES的內(nèi)容二DS的內(nèi)容

4.地址傳送指令LEA,LDS,LES

LEAreg,src;將源操作數(shù)src的偏移地址送入reg

例:LEABX,[BX+0400H]

執(zhí)行前:BX=2000H

執(zhí)行后:BX=2000H+0400H=2400H

LDSreg,src;將合。中的雙字內(nèi)容依次送入reg及DS

例:LDSSI,[2030H]

執(zhí)行前:DS=5000H(52030H)=0240H

(52032H)=3000H

執(zhí)行后:SI=0240H

DS=3000H

LESreg,src;將src中的雙字內(nèi)容依次送入reg及ES

3.3.2算術(shù)運(yùn)算指令

1.加法和減法指令

主要的六條加法和減法指令如下:

ADDdst,src

ADCdst,src;src+dst+CF,帶進(jìn)位加

INCopr;操作數(shù)自加1

SUBdst,src

SBBdst,src;帶借位減

DECopr

其中,dst,src及opr既可以是字節(jié)操作數(shù),也可以是字操

作數(shù),但類型必須匹配。

除了INC及DEC指令不影響CF(進(jìn)位標(biāo)志)外,所有指令都會(huì)

影響標(biāo)志寄存器,其中最重要的是CF,ZF,SF,OF,分

別表示進(jìn)位、結(jié)果為零、符號(hào)和溢出。

例:ADDAL,70H

ADDBX,3000H

ADDSI,CX

ADDDX,[BX+DI]

ADD[BX+SI],AX

例:32位加法運(yùn)算:

設(shè):DX=0007HAX=A379H0007A379H

BX=0005HCX=7E4FH00057E4FH

指令為:

ADDAX,CX

ADCDX,BX

A379

+7E4F

121C8

0007

0005

+1

000D結(jié)果:DX=000DHAX=21C8H

例:

INCBL

INCCX

INCBYTEPTR[BX]

下面的指令有錯(cuò)誤:

(1)ADD[SI],13H

(2)SUBAX,BL

指令應(yīng)改為:

(1)ADDWORDPTR[SI],13H

(2)MOVBH,0

SUBAX,BX

例:求2=乂一Y。X,Y,Z都是一個(gè)32位數(shù)。

XDD?;在數(shù)據(jù)段中定義一個(gè)雙字

YDD?

ZDD?

MOVDX,WORDPTRX+2;用DX:AX作為被減數(shù).

;雙字的高位字在后,地址加

2

;雙字中的字,必須用PTR運(yùn)算

MOVAX,WORDPTRX;雙字的低位字在前

SUBAX,WORDPTRY;先進(jìn)行低16位減法

SBBDX,WORDPTRY+2;高16位減法用SBB,考慮借

MOVWORDPTRZ,AX;差的低16位

+口

2、比較指令(兩數(shù)相減,僅影響標(biāo)志位):

例:

CMPAL,64H

CMPBX,21F0H

CMPCL,DH

CMPAX,[BX+SI+04]

相等時(shí),ZF=1(否則為0)

例:找出100個(gè)無(wú)符號(hào)8位數(shù)的最大值(有效地址3000H開

始的100個(gè)無(wú)符號(hào)數(shù))。

MOVBX,3000H;起始地址

MOVCX,63H;99次比較

MOVAL,[BX]

LP1:INCBX

CMPAL,[BX]

JNCLP2;無(wú)借位轉(zhuǎn)移,大于等于轉(zhuǎn)移

MOVAL,[BX]

LP2:DECCX

JNZLP1

MOVMAX,AL;最大值送MAX單元

例:找出50個(gè)有符號(hào)16位數(shù)的最小值(有效地址3000H開

始的50個(gè)有符號(hào)數(shù))。

MOVBX,3000H;起始地址

MOVCX,31H;49次比較

MOVAX,[BX]

BBB:INCBX

INCBX

CMPAX,[BX]

JNGCCC;有符號(hào)數(shù)小于等于轉(zhuǎn)移

MOVAX,[BX]

CCC:DECCX

JNZBBB

MOVMIN,AX;最小值送MIN單元

3、乘法指令

8位乘法,積在AX中。

16位乘法,積在DX(高),AX(低)中。

1、無(wú)符號(hào)數(shù)乘法

MULCL;AL乘CL送AX

MULBX

MULBYTEPTR[SI];8位乘

MULWORDPTR[DI];16位乘

2、有符號(hào)數(shù)乘法

IMULBL

IMULCX

究竟是使用MUL還是IMUL取決于你怎樣看待操作數(shù)(包括

乘數(shù)和被乘數(shù))。

例:設(shè)AL=11111111B,BL=llllllllBo

如果使用MULBL指令,則nnnnBxnniniB=

255DX255D=65205Do

如果使用IMULBL指令,則是(-1)X(-1)=1。

乘法指令會(huì)影響標(biāo)志位。但除了CF和OF以外的標(biāo)志

位無(wú)定義。

注意:乘數(shù)不能為立即數(shù)。

X(字節(jié))乘以10的指令如下:

MOVAL,10

MULX;結(jié)果在AX中

絕不能寫成以下形式:

MOVAL,X

MUL10

注意,不能以16位操作數(shù)乘8位操作數(shù),必須將8位操作數(shù)擴(kuò)展

成16位操作數(shù)。對(duì)無(wú)符號(hào)8位操作數(shù),擴(kuò)展成16位時(shí),只需

將高8位清零。對(duì)有符號(hào)的8位操作數(shù),擴(kuò)展成16位時(shí),要使

用CBW指令o

CBW指令無(wú)參數(shù),它的作用是將AL的符號(hào)擴(kuò)展至AH。如果

AL的最高位為0,貝ijAH=00;如果AL的最高位為1,貝”AH=

OFFHo

3.3.3邏輯指令

邏輯指令包括邏輯運(yùn)算指令及移位指令兩大類。

1.邏輯運(yùn)算指令(指令都是按位進(jìn)行邏輯運(yùn)算的。)

ANDdst,src;邏輯“與“

ORdst,src;邏輯“或"

XORdst,src;邏輯“異或”

NOTdst;邏輯“非”

例:

ANDAL,OFH將高4位清零

AL=1O1OO1O1——>AL=00000101=05H

ANDAL,OFOH將低4位清零;

AL=10100101——>AL=10100000二OAOH

ANDAL,OFEH將最低位清零

ORAL,80H將最高位置1

XORAL,ALAL清零,比M0VAL,0效率高

ORAL,30HOR之前AL=O?9,則將AL中的值變ASCH碼

AL=00000101——>AL=00110101=35H

ANDAL,OFHAND之前AL=30H?39H,則將AL中的值變

為0?9

AL=00U0101——>AL=00000101=05H

2.測(cè)試指令TEST

完成操作類似于AND,但它不將運(yùn)算結(jié)果送目的操作數(shù),只是

影響標(biāo)志位。

例:統(tǒng)計(jì)負(fù)數(shù)的個(gè)數(shù)(有效地址4000H開始的20H個(gè)有符號(hào)數(shù))。

XORDI,DI

MOVBX,4000H

MOVCX,20H

AGAIN:MOVAL,[BX]

INCBX

TESTAL,80H;若AL最高位為1(負(fù)數(shù))時(shí),ZF=O

JZ,GOON;正數(shù)時(shí)跳轉(zhuǎn)

INCDI

GOON:DECCX

JNZAGAIN

MOVMINUS,DI……

3.移位指令

移位指令共有八條,它們的指令格式分別是:

邏輯左移SHLdst,count

算術(shù)左移SALdst,count

邏輯右移SHRdst,count

算術(shù)右移SARdst,count

循環(huán)左移ROLdst,count

循環(huán)右移RORdst,count

帶進(jìn)位循環(huán)左移RCLdst,count

帶進(jìn)位循環(huán)右移RCRdst,count

dst是除立即數(shù)之外的任何尋址方式。字或字節(jié)都可以。

SHR移位方法:

例:SALAH,1

MOVCL,2

SHLSI,CL;位移數(shù)多于1時(shí),必須用CL

ROL

ROR

RCLCFw

RCR斗CF—

例:

x=x*10,使用移位及加法來(lái)實(shí)現(xiàn)(速度快):

SHLBX,1;X*2

MOVAX,BX;保存X*2

SHLBX,1

SHLBX,1;X*8

ADDBX,AX;X=X*8+X*2

需11個(gè)時(shí)鐘周期。

使用乘法指令,則需要70個(gè)時(shí)鐘周期。

例:32位數(shù)乘士。用左移2位完成乘4。用兩個(gè)寄存器

DX及AX來(lái)表示32位數(shù)。

XDD?;X為一個(gè)32位數(shù)

MOVAX,WORDPTRX;取低16位

MOVDX,WORDPTRX+2;取高16位

SHLAX,1;低16位左移1位.

;移出的位在CF中

RCLDX,1:高16位帶進(jìn)位循環(huán)左移,

;低16位的進(jìn)位位移入高16位的最低位

SHLAX,1

RCLDX,1

P60頁(yè)第2題答案:

1)MOV[CX],AL

不能用CX間接尋址。

2)MOVBH,320

出o

3)MOVDS.2000H

沒(méi)有數(shù)據(jù)通路。

4)ADDSI.FDDH

補(bǔ)0為OFDDHo

5)SHLAX,2

移位數(shù)大于1時(shí)用CL寄存器。

6)CMPBYTEPTR[SI],X

不能都是內(nèi)存單元。

7)LEABXJSI]

正確。

8)LDSBXJDX]

不能用DX間接尋址。

9)JMPBYTEPTRAX

PTR不能在寄存器前。

10)JMPAX

正確。

11)JMP[AX]

不能用AX間接尋址。

12)RET5

RET后必須是偶數(shù)。

13)MOV[BX+SI+1OJ4OO

必須指明字或字節(jié)。

14)DIVAL

AX為被除數(shù),AL為除數(shù),

當(dāng)(AH)>(AL)時(shí),結(jié)果可能溢出。

P60頁(yè)第3題答案:

1)5634H

2)7856H

3)78H

4)7856H

;P60頁(yè)5(1)求Z=X+Y。X,Z是32位數(shù),Y是8位數(shù)。

datasegment

XDD1111FFFFH

YDB2

ZDD?

dataends

*

codesegment

assumecs:code,ds:data

XYAddprocfar

begin:movax9data

movds,ax

MOVDX.WORDPTRX+2

;用DX:AX作為被加數(shù).

;雙字的高位字在后,地址加2

MOVAX,WORDPTRX;雙字的低位字在前

MOVBL,Y;字的低8位

XORBH.BH;BX中為16位數(shù),等于Y

ADDAX.BX;先進(jìn)行低16位加法

ADCDX,0;高16位加法,考慮進(jìn)位

MOVWORDPTRZ,AX;和的低16位

MOVWORDPTRZ+2.DX;和的高16位

movah,4ch

int21h

XYAddendp

codeends

endbegin

ASC碼內(nèi)存

例:將BCD碼轉(zhuǎn)換為ASCII碼。

MOVSI,1OOOH3000H31H

MOVDI,3000H32H

MOVCX,000433H

34H

GGG:MOVAL,[SI]

35H

MOVBL,AL36H

ANDAL,OFHBCD碼內(nèi)存37H

ORAL,3OH……138H

MOV[DI],AL1000H21H

43H

INCDI

65H

87H

ASC碼

MOVAL,BL內(nèi)存

PUSHCX

3000H31H

MOVCL,432H

SHRAL,CL;邏輯右移33H

;前面補(bǔ)034H

35H

ORAL,3OH

36H

MOV[DI],ALBCD碼內(nèi)存37H

INCDI……138H

INCSI1000H21H

POPCX43H

65H

DECCX87H

JNZGGG

編寫完整程序的提不:

datasegment

BCD1DB21H,43H,65H,87H

ASCIDB8dup(?)

dataends

LEASI.BCD1

LEADI,ASCI

補(bǔ)充內(nèi)容:

3.2.2與轉(zhuǎn)移地址有關(guān)的尋址方式

1.段內(nèi)轉(zhuǎn)移、段間轉(zhuǎn)移

段內(nèi)轉(zhuǎn)移:

■移到同一個(gè)代碼段內(nèi)的某個(gè)偏移地址處

段間轉(zhuǎn)移:

■移到另一個(gè)代碼段中的某個(gè)偏移地址處

2.段內(nèi)直接尋址

段內(nèi)直接尋址:指令的有效地址是當(dāng)前IP寄存器的內(nèi)容

和指令中指定的8位或16位位移量之和。指令的機(jī)器

碼中帶有相對(duì)于當(dāng)前IP的位移量,是相對(duì)尋址。

8位位移量:加SHORT操作符(叫做:短跳轉(zhuǎn))

16位位移量:加NEARPTR操作符(可以省略)。

例:

JMPSHORTLI;L1與當(dāng)前IP的位移量是一個(gè)8位值

JMPL1(或者JMPNEARPTRLI)

;L1與當(dāng)前IP的位移量是一個(gè)16位值

條件轉(zhuǎn)移指令只能是8位位移量,省略了SHORT操作符。

3.段內(nèi)間接尋址

有效地址是一個(gè)通用寄存器或數(shù)據(jù)段中一個(gè)存儲(chǔ)

單元的內(nèi)容(尋址內(nèi)存可使用任何一種尋址方

式)。

例:

MOVAX,OFFSETpl

;獲取pl過(guò)程在代碼段內(nèi)的偏移值

CALLAX

例:

MOVAX,[BX];數(shù)據(jù)段中,寄存器間接尋址

JMPBX;代碼段中,段內(nèi)間接尋址

MOVAX,OFFSETpl;獲取過(guò)程pl的偏移地址送入AX

MOVADD1,AX;將AX內(nèi)容送入數(shù)據(jù)段內(nèi)的ADD1處

CALLADD1;轉(zhuǎn)移至ADD1中存放的偏移地址處

MOVBX,OFFSETADD1;獲取ADD1的偏移地址送入BX

CALL[BX];轉(zhuǎn)移地址的偏移地址位于數(shù)據(jù)段中,

;要通過(guò)BX間接尋址獲取

4.段間直接尋址

段間直接尋址在指令中給出了要轉(zhuǎn)移的地址的

代碼段和段內(nèi)偏移量。

例:

CALLFARPTRp2

要轉(zhuǎn)移至的標(biāo)號(hào)或過(guò)程名必須具備FAR屬性。

5.段間間接尋址

轉(zhuǎn)移地址必須放入內(nèi)存單元中,且是一個(gè)雙字。

例:JMPDWORDPTR[BX+INTERS]

間接的偏移量

內(nèi)存單元中的轉(zhuǎn)移地址是一個(gè)雙字,高位字在

后,低位字在前。轉(zhuǎn)移后,低位字變成了IP,

高位字變成了CS。

3.3.4控制轉(zhuǎn)移指令

控制轉(zhuǎn)移指令用來(lái)改變程序的執(zhí)行順序,

共有如下幾類:

?無(wú)條件轉(zhuǎn)移指令(JMP);

?條件轉(zhuǎn)移指令

?循環(huán)指令

?子程序調(diào)用與返回指令。

?中斷與中斷返回指令。

1、無(wú)條件轉(zhuǎn)移指令

例:

JMPSHORTPTRL1;轉(zhuǎn)移至段內(nèi)L1標(biāo)號(hào)處,

溫馨提示

  • 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)論