微機原理與接口技術教學課件_第1頁
微機原理與接口技術教學課件_第2頁
微機原理與接口技術教學課件_第3頁
微機原理與接口技術教學課件_第4頁
微機原理與接口技術教學課件_第5頁
已閱讀5頁,還剩117頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

微機原理與接口技術

講課教師:王愛學

本課程研究的內容

1、計算機硬件:構成計算機的各種元件、器件和設備實物。

2、計算機軟件:為應用計算機所編制的程序。

微機原理課程與其它課程的關系:

數字邏輯一一計算機原理一一計算機匯編語言一一微機原理

——計算機網絡

一一單片機原理

本學期所學課程實際上包括了匯編語言部分。

匯編語言:是與計算機硬件密切相關的程序設計語言,其基本

語句對應硬件的一個基本命令。

課程要求

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

末考試,期末考試成績計為0分。

2、無故不上理論課累計3次以上(包括3次)的同學

不許參加期末考試,期末考試成績計為0分。

3、無故不上實驗課累計3次以上(包括3次)的同學

不許參加期末考試,期末考試成績計為0分。

參考書

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

2、沈美明、溫冬嬋:匯編語言程序設計(清華大學出版社)

3、熊桂喜:IBM—PC匯編語言程序設計(科學出版社)

4、周明德:微型計算機原理及應用(清華大學出版社)

第一章基礎知識

1.1二進制數、十進制數及十六進制數(及其轉換)(略)

1.2二進制數與十六進制數的運算

1.2.1算術運算(略)

1.2.2邏輯運算

例:

X=OOFFH=OOOO00001111HUB

Y=5555H=0101010101010101B

按位“與”運算

000000001111HUB

A0101010101010101B

0000000001010101B

按位“或”運算

oooooooomiHUB

V0101010101010101B

0101010111111U1B

按位“異或”運算

0000000011111111B

十0101010101010101B

0101010110101010B

1.3ASCII碼和BCD碼(略)

1.4數值與編碼的轉換

把ASCII碼和BCD等轉換成對應的數值。

例:

2的ASCII碼為32H,轉換成數值為:00000010(計

算機中)

在程序中,使用一定的算法進行轉換。

第二章IBM-PC計算機組織

2.1IBM-PC微型計算機的基本結構

計算機由三大部分組成:

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

存儲器。

輸入/輸出設備。

各組成部分的功能:

運算器:負責執行所有的算術和邏輯運算。

控制器:負責指令執行時的控制工作(把指令逐條從

存儲器中取出,經譯碼分析后發出取操作數、執行、

存儲運算結果等控制指令)。

存儲器(內存):是計算機的記憶部件,它通過總線與

CPU相連。用來存放程序執行時所需的指令和數據。

I/O設備:軟盤驅動器、硬盤、顯示器、鍵盤、打印

機等設備。

總線:包括數據線、地址線、控制線。

圖2.1PC機的一般結構

IBM-PC系列機CPU型號:

Intel8086/8088

8088是一個準16位的微處理器,即它的內部結構是16

位的,而外部的數據總線是8位的,因而它在一個

總線周期內只能訪問一個8位字節而不是一個16位

的字。

8086的內部結構和外部總線都是16位的,工作性能比

8088好。

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

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

目前,CPU主頻在2GHz左右是常見的計算機配置。

2.2IBM-PC上的軟件與匯編語言

軟件可分為兩大類:系統軟件和應用軟件。

2.2.1系統軟件和應用軟件

系統軟件:由PC機的生產廠家及其配套設備的供應商

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

時為產生、準備和執行用戶程序所必需的。(典型

的系統軟件:操作系統)

應用軟件:用戶自己和一些生產商為某種應用而編寫

的專門軟件。

2.2.2高級語言、匯編語言、機器語言

機器指令是由二進制代碼組成的,直接以指令來編程的

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

匯編語言:用符號以一定的簡單語法來表示機器指令,

其語句與機器語言一一對應。

高級涪言:以人們易于理解的語句和構造來編程的語言

稱為高級涪言,如C,BASIC,PASCALFORTRAN,C+

+等。

高級溶言一一用編譯程序編譯一一機器語言

匯編語言源程序一一用匯編器匯編一一機器語言

高級語言易學易用,基本符合數學語言和自然語言的習

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

為什么要學習匯編語言?

1、通過匯編語言去理解計算機運行軟件的過程。(匯

編語言與機器指令基本上是一一對應的)

2、某些底層系統軟件必須用匯編涪言來編寫,例如主

板上的BIOS及一些設備的驅動程序。這是由于要直接

與下層硬件打交道,高級語言很難勝任。

3、匯編語言程序的執行效率高,運行代碼占用內存少。

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

使用匯編語言。

例:Windows環境下的寫屏軟件,圖形、圖像處理中的

壓縮還原過程。

2.2.3匯編語言的開發環境(略)

(以后在上機實驗前進行詳細的學習。)

2.3Intel8086/8088CPU的寄存器結構

8086CPU:16位CPU,時鐘頻率:5MHz——10MHz

數據線:16根,可處理8位或16位數據

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

8088CPU:16位CPU,時鐘頻率:5MHz——10MHz

內部數據線:16根,可處理8位或16位數據

外部數據線:8根,可處理8位數據

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

2.3.1通用寄存器

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

分兩組,數據寄存器(前4個:AX,BX,

CX,DX)用作存放數據。BHBX

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

于存放指針。

1.數據寄存器DHDX

AX,BX,CX,DX可分別拆分成2個8位寄

存器。SP

AX:累加器(accumulator),在算術運

算時,用AX來存放操作數和運算結果。BP

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

存儲器地址時使用。SI

CX:計數寄存器(count),循環、串

操作時用于計數。DI

AX

BX

CX

DX

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

存器,它表示的是當前要執行的指令在代碼段中的偏移地址。

程序員不能直接訪問IP,只有轉移指令、子程序調用及返回

指令、中斷調用及返回指令才能修改IP(有時還會修改CS)。

2.3.4標志寄存器

OFDFIFTFSFZFAFPFCF

標志寄存器:用于表示程序運行時(數據處理時)的狀態。

各標志位的作用:

進位標志CF(carryflag):有進位或借位時為1;

奇偶標志PF(parityflag):結果低8位“1〃的個數為偶數時

為1。

輔助進位標志AF(auxiliarycarryflag):進行算術運算時,

如果低4位產生了進位時為1。此標志用于十進制運算時的

調整。

零標志ZF(zeroflag):運算結果為0時為1。

符號標志SF(signflag):等于運算結果的最高位(符號位)。

以下幾個標志可暫不講述。

跟蹤標志TF(trapflag),當TF=1時,在執行完一條指

令后就會產生單步中斷,然后由單步中斷處理程序把

TF置為0。TF標志用于調試。

中斷標志IF(interruptflag),當IF=1時,允許響應可

屏蔽中斷,否則關閉中斷。

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

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

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

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

加2(字指令)。

2.4PC機的內存組織

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

2.4.1內存地址與字節、字的存放

8位二進數:一個字節(byte)。

位7654321cl

111111111111

內存單元的基本單位為字節,每個內存單元都分配了一個唯一的

地址。

地址范圍:00000000000000000000B——

mimimimiHUB

十六進制數表示:00000H—FFFFFH

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

字的地址是第1個字節的地址。

在內存中,低字節在前,高字節在后。

地址存儲單元(字節)

00000H_________0

00001H

FFFFFH1MB

例:

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

AHAL

12H34H

例:

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

AHAL

12H34H

例:例:

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

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

地址地址

1FFFFH1FFFFH

20000H20000H

例:將雙字12345678H(32位二進制)存入內存單元

1FFFFH處。

地址內容

……1

1FFFFH78H

20000H56H

20001H34H

20002H-12H1

2.4.2內存地址的分段

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

為了表示某個地址,需要20位。

機器字長為16位,它能表示的最大內存空間為216=64KBo

Intel8086/8088采用分段訪問內存的辦法,使得16位寄存器

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

位190

物理地址

位150

段地址0000

位150

段內地址

2.4.3物理地址和邏輯地址

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

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

用段地址和偏移地址來表示內存單元地址的形式稱為邏

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

例:物理地址00000H:

0000H:0000H

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

物理地址。

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

例:設邏輯地址為1234H:5678H,則物理地址為:

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

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

多個結果。

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

1000H:79B8H

1001H:79A8H

1234H:5678H

179BH:0008H

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

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

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

2.4.4實際內存分配方法

例:假定一個程序的代碼段大小為

4096D,數據段大小為8180D,堆棧段

大小為252D。

按節方式上舍入為4096D,8192D,256D,內存

即1000H,2000H,lOOHo

設給此程序分配的內存區從21000H開始21000H

(節邊界對齊),這三個段在內存中的代碼段

位置為:21FFFH

22000H

段寄存器

數據段

CS2100H23FFFH

DS2200H24000H

SS2400H堆棧段

ES240FFH

內存起始地址21000H,起始段地址為2100H。

代碼段、數據段、堆棧段大小依次為:

1000H,2000H,lOOHo

SS=DS+200H=2400Ho

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

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

2.5堆棧

堆棧(stack):是內存中的一塊特定區域,用于暫時緩存數據。

2.5.1堆棧在哪里

堆棧由軟件設置,是在內存中劃出一塊區域作為堆棧。堆棧的

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

存取在棧頂進行。

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

例:

設開始時(棧底)位置為:SS=2400H,SP=100H,運行一段

時間后,堆棧中壓入了一些數據,SP=80Ho堆棧位置如下

圖所示。

CS

24000H

DS

SS

ES24080H(棧頂)

SP

24100H(棧底)

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

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

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

小,棧頂也就相應地變化。如果未壓入內容,或壓入了內容

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

無論是壓入還是彈出,都是以字為單位進行(不能進行字節或

雙字操作)。

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

語句的執行過程。

MOVAX,1234H;將1234H送入AX

PUSHAX;將AX中的內容壓入堆棧

執行PUSHAX指令的過程:

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

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

偏移地址處

內存

段寄存器

cs堆棧段2000H:0000H

DS

SS

ES

SP

2000H:0100H

段寄存器內存

cs

DS堆棧段2000H:0000H

ss

ES

SPOOFEH34H2000H:00FEH

12H2000H:00FFH

2000H:0100H

AX1234H

??????

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

第三章尋址方式與指令系統

3.1指令格式

指令結構:

操作碼操作數地址

操作碼:指明計算機所要執行的操作。

操作數地址:指出指令在執行過程中要處理的數據地址。

3.2尋址方式

尋址方式:是指指令中尋找操作數的方式。

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

例:MOVAX,2056H內存

AX

AHAL

/MOV30000H

56H30001H

20H30002H

2.寄存器尋址

寄存器尋址:指令中所需的操作數在CPU的某個寄存器中。存

取這類操作數完全在CPU內部進行,不需要動用總線訪問內

存,所以執行速度比較快。

例:

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

MOVAX,1234H

ADDBX,AX

PUSHDS;源操作數是寄存器尋址方式

3.直接尋址

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

例:

為有效地處

MOVAX,[1000H];1000H一內存

(設:DS=2000H)

……

OP代碼段

00

10

AX

AHAL?…

A20000H數據段

A?…

21000H40

30

4.寄存器間接尋址

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

BX、BP或變址寄存器SI、DI中。地址是通過一個寄存器

來指明,因而稱為寄存器間接尋址。

例:MOVAX,[DI]

設DS=3000H,DI=2000H

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

內存

AX

AHAL....

個30000H數據段

A

32000HBO

40

段跨越前綴舉例:

MOVCX,ES:[BX]

MOVBX,ES:[2000H]

;鍵入字符串并顯示

datasegment

stringdb30,0,30dup(?)

;最大串長,實際串長,串

strldb13J0J$'

dataends

*

codesegment

assumecs:code,ds:data

keyinprocfar

begin:movax9data

movds,ax

movdx,offsetstring;指定數據緩沖區首地址

movah,Oah;21h號中斷的Oah號功能

int21h;接收從鍵盤鍵入的數據到緩沖區

movcl,string+l;取實際串長度

xorch,ch;cx中是實際串長度

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

adddx,2;dx指向串尾部

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

movbyteptr[bx]/$5

leadx,strl

movah,9;21h號中斷的09h號功能

int21h;顯示回車換行

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

movah,9

int21h;顯示鍵入的串

movah,4ch;21h號中斷的4ch號功能

int21h;返回DOS操作系統

keyinendp;過程結束

codeends;代碼段結束

endbegin;指出可執行的第一行代碼地址

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

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.寄存器相對尋址

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

個基址寄存器或變址寄存器的內容和指令中指定的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■內y存

BP3000H

OP代碼段

OP

40H

20H

IIX

AHAL

50000H

AA??????堆棧段

55040H48

55

6.基址加變址尋址

特點:有兩個寄存器出現在指令中。其中基址寄存器為

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

例:

MOVAX,[BX][SI]

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

設:DS=3200H,BX=0456H,SI=1094H

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

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

7.相對的基址加變址尋址:

例:

MOVAL,[BX+DI+12]

設:DS=8000H,BX=0100H,DI=0010H

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

=80UCH

3.1.2小節(補充)

8086/8088的機器語言格式(1—7個字節構成指令)

機器指令的第一字節:76543210

操作碼DW

D指出下一字節REG段是源還是目的。

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

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

外。)

W字操作位,1——字操作,否則是字節操作。

機器指令的第二字節:76543210

MOD=11

MODREGR/M

表示寄存器尋址

R/M表示寄存器

MOD=其它

表示存儲器尋址,R/M表示內存地址

MOD=H時:

若W=0則:R/M000001010011100101110111

表示ALCLDLBLAHCHDHBH

若W=1則:R/M000001010011100101110111

表示AXCXDXBXSPBPSIDI

例:ADDCL,BH

MOD=00時,存儲器尋址,不帶位移量。

由R/M段指出內存地址。

000001010011100101110111

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

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

MOD=01時,存儲器尋址,帶一個位移量字節(8位位移量)。

由R/M段指出內存地址。

MOD=10時,存儲器尋址,帶2個位移量字節(16位位移量)。

由R/M段指出內存地址。

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

機器語言指令:01914521H

00000001100100010100010100100001

00000001100100010100010100100001

立即尋址的機器指令第一字節:

76543210

操作碼SW

S符號擴展,8位補碼擴至16位。

SW=008位操作數

SW=0116位操作數

SW=118位操作數擴展至16位

(SW=10無效)

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

機器語言:8381452397H

1000001110000001010001010010001110010111

10000011100000010100010100100011

設:指令執行前:

BX=0892HDI=59A3H

DS=2000H(2857AH)=0029H

目的操作數地址:

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

指令執行后:

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

OFF97H是97H的帶符號擴展:

1111111110010111

注意事項:

使用BP的間接尋址:SS為默認段寄存器。

其它:DS為默認段寄存器。

有段跨越前綴時,在指令前加一個字節:

76543210

001SEG110

SEG:00ES01CS10SS11DS

三種情況不允許段跨越:

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

3.3指令系統

Inlel8086/8088的指令系統可分成以下六組:

數據傳送指令。

算術指令。

邏輯指令。

串處理指令。

控制轉移指令。

處理機控制指令。

3.3.1數據傳送指令

數據傳送指令負責把運算過程中所需的數據、地址或立

即數傳送到寄存器或存儲單元中。

1.數據通路與類型匹配

數據傳送指令的作用,就是在內存、通用寄存器、段寄存器、立

即數之間“傳來傳去”。在傳送指令的源操作數和目的操作

數之間,傳什么,如何傳,既要根據程序的需要來設置,還

要根據語法規則及數據通路來決定。

2.MOV和XCHG指令

MOV指令的語法為:

MOVDST,SRC

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

reg為通用寄存器,segreg為段寄存器,mem為內存):

MOVreg,acMOVmem,ac

MOVreg,regMOVmem,reg

MOVreg,segregMOVmem,segreg

MOVreg,memMOVsegreg,reg

MOVsegreg,mem

當使用段寄存器作目的操作數時,不允許使用CS作目的

操作數。

MOV或其他大多數指令必須遵守以下規則:

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

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

3)源和目的操作數不能同時為內存操作數(串指令除外)。

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

下面的指令不正確:

(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;將兩個操作數的內容互換(不允許任何一個

操作數是立即數)

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

XCHG及MOV指令執行后都不影響標志寄存器。

例:將有效地址為1000H開始的內存中100個連續存儲單

元清零。

MOVDI,1000H

MOVCX,64H;64H=100

MOVAL,0

BBB:MOV[DI],AL

INCDI

DECCX

JNZBBB

其中,BBB為符號地址

3.PUSH,POP,PUSHF,POPF指令

PUSH,POP入棧出棧指令

PUSHF,POPF標志寄存器入棧出棧指令

例:

在程序中的某一部分里要臨時借用一下某個寄存器,但借用

前的內容以后還有用,就可以先用PUSH指令將其保存起來,

然后在必要時再用POP指令恢復成原來的內容。

PUSHCX

PUSHAX

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

POPAX;恢復AX內容

POPCX;恢復ex內容

利用堆棧還可以傳遞內容。例:

PUSHDS

POPES;ES的內容二DS的內容

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

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

例:LEABX,[BX+0400H]

執行前:BX=2000H

執行后:BX=2000H+0400H=2400H

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

例:LDSSI,[2030H]

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

(52032H)=3000H

執行后:SI=0240H

DS=3000H

LESreg,src;將src中的雙字內容依次送入reg及ES

3.3.2算術運算指令

1.加法和減法指令

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

ADDdst,src

ADCdst,src;src+dst+CF,帶進位加

INCopr;操作數自加1

SUBdst,src

SBBdst,src;帶借位減

DECopr

其中,dst,src及opr既可以是字節操作數,也可以是字操

作數,但類型必須匹配。

除了INC及DEC指令不影響CF(進位標志)外,所有指令都會

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

別表示進位、結果為零、符號和溢出。

例:ADDAL,70H

ADDBX,3000H

ADDSI,CX

ADDDX,[BX+DI]

ADD[BX+SI],AX

例:32位加法運算:

設:DX=0007HAX=A379H0007A379H

BX=0005HCX=7E4FH00057E4FH

指令為:

ADDAX,CX

ADCDX,BX

A379

+7E4F

121C8

0007

0005

+1

000D結果:DX=000DHAX=21C8H

例:

INCBL

INCCX

INCBYTEPTR[BX]

下面的指令有錯誤:

(1)ADD[SI],13H

(2)SUBAX,BL

指令應改為:

(1)ADDWORDPTR[SI],13H

(2)MOVBH,0

SUBAX,BX

例:求2=乂一Y。X,Y,Z都是一個32位數。

XDD?;在數據段中定義一個雙字

YDD?

ZDD?

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

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

2

;雙字中的字,必須用PTR運算

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

SUBAX,WORDPTRY;先進行低16位減法

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

MOVWORDPTRZ,AX;差的低16位

+口

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

例:

CMPAL,64H

CMPBX,21F0H

CMPCL,DH

CMPAX,[BX+SI+04]

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

例:找出100個無符號8位數的最大值(有效地址3000H開

始的100個無符號數)。

MOVBX,3000H;起始地址

MOVCX,63H;99次比較

MOVAL,[BX]

LP1:INCBX

CMPAL,[BX]

JNCLP2;無借位轉移,大于等于轉移

MOVAL,[BX]

LP2:DECCX

JNZLP1

MOVMAX,AL;最大值送MAX單元

例:找出50個有符號16位數的最小值(有效地址3000H開

始的50個有符號數)。

MOVBX,3000H;起始地址

MOVCX,31H;49次比較

MOVAX,[BX]

BBB:INCBX

INCBX

CMPAX,[BX]

JNGCCC;有符號數小于等于轉移

MOVAX,[BX]

CCC:DECCX

JNZBBB

MOVMIN,AX;最小值送MIN單元

3、乘法指令

8位乘法,積在AX中。

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

1、無符號數乘法

MULCL;AL乘CL送AX

MULBX

MULBYTEPTR[SI];8位乘

MULWORDPTR[DI];16位乘

2、有符號數乘法

IMULBL

IMULCX

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

乘數和被乘數)。

例:設AL=11111111B,BL=llllllllBo

如果使用MULBL指令,則nnnnBxnniniB=

255DX255D=65205Do

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

乘法指令會影響標志位。但除了CF和OF以外的標志

位無定義。

注意:乘數不能為立即數。

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

MOVAL,10

MULX;結果在AX中

絕不能寫成以下形式:

MOVAL,X

MUL10

注意,不能以16位操作數乘8位操作數,必須將8位操作數擴展

成16位操作數。對無符號8位操作數,擴展成16位時,只需

將高8位清零。對有符號的8位操作數,擴展成16位時,要使

用CBW指令o

CBW指令無參數,它的作用是將AL的符號擴展至AH。如果

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

OFFHo

3.3.3邏輯指令

邏輯指令包括邏輯運算指令及移位指令兩大類。

1.邏輯運算指令(指令都是按位進行邏輯運算的。)

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.測試指令TEST

完成操作類似于AND,但它不將運算結果送目的操作數,只是

影響標志位。

例:統計負數的個數(有效地址4000H開始的20H個有符號數)。

XORDI,DI

MOVBX,4000H

MOVCX,20H

AGAIN:MOVAL,[BX]

INCBX

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

JZ,GOON;正數時跳轉

INCDI

GOON:DECCX

JNZAGAIN

MOVMINUS,DI……

3.移位指令

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

邏輯左移SHLdst,count

算術左移SALdst,count

邏輯右移SHRdst,count

算術右移SARdst,count

循環左移ROLdst,count

循環右移RORdst,count

帶進位循環左移RCLdst,count

帶進位循環右移RCRdst,count

dst是除立即數之外的任何尋址方式。字或字節都可以。

SHR移位方法:

例:SALAH,1

MOVCL,2

SHLSI,CL;位移數多于1時,必須用CL

ROL

ROR

RCLCFw

RCR斗CF—

例:

x=x*10,使用移位及加法來實現(速度快):

SHLBX,1;X*2

MOVAX,BX;保存X*2

SHLBX,1

SHLBX,1;X*8

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

需11個時鐘周期。

使用乘法指令,則需要70個時鐘周期。

例:32位數乘士。用左移2位完成乘4。用兩個寄存器

DX及AX來表示32位數。

XDD?;X為一個32位數

MOVAX,WORDPTRX;取低16位

MOVDX,WORDPTRX+2;取高16位

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

;移出的位在CF中

RCLDX,1:高16位帶進位循環左移,

;低16位的進位位移入高16位的最低位

SHLAX,1

RCLDX,1

P60頁第2題答案:

1)MOV[CX],AL

不能用CX間接尋址。

2)MOVBH,320

出o

3)MOVDS.2000H

沒有數據通路。

4)ADDSI.FDDH

補0為OFDDHo

5)SHLAX,2

移位數大于1時用CL寄存器。

6)CMPBYTEPTR[SI],X

不能都是內存單元。

7)LEABXJSI]

正確。

8)LDSBXJDX]

不能用DX間接尋址。

9)JMPBYTEPTRAX

PTR不能在寄存器前。

10)JMPAX

正確。

11)JMP[AX]

不能用AX間接尋址。

12)RET5

RET后必須是偶數。

13)MOV[BX+SI+1OJ4OO

必須指明字或字節。

14)DIVAL

AX為被除數,AL為除數,

當(AH)>(AL)時,結果可能溢出。

P60頁第3題答案:

1)5634H

2)7856H

3)78H

4)7856H

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

datasegment

XDD1111FFFFH

YDB2

ZDD?

dataends

*

codesegment

assumecs:code,ds:data

XYAddprocfar

begin:movax9data

movds,ax

MOVDX.WORDPTRX+2

;用DX:AX作為被加數.

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

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

MOVBL,Y;字的低8位

XORBH.BH;BX中為16位數,等于Y

ADDAX.BX;先進行低16位加法

ADCDX,0;高16位加法,考慮進位

MOVWORDPTRZ,AX;和的低16位

MOVWORDPTRZ+2.DX;和的高16位

movah,4ch

int21h

XYAddendp

codeends

endbegin

ASC碼內存

例:將BCD碼轉換為ASCII碼。

MOVSI,1OOOH3000H31H

MOVDI,3000H32H

MOVCX,000433H

34H

GGG:MOVAL,[SI]

35H

MOVBL,AL36H

ANDAL,OFHBCD碼內存37H

ORAL,3OH……138H

MOV[DI],AL1000H21H

43H

INCDI

65H

87H

ASC碼

MOVAL,BL內存

PUSHCX

3000H31H

MOVCL,432H

SHRAL,CL;邏輯右移33H

;前面補034H

35H

ORAL,3OH

36H

MOV[DI],ALBCD碼內存37H

INCDI……138H

INCSI1000H21H

POPCX43H

65H

DECCX87H

JNZGGG

編寫完整程序的提不:

datasegment

BCD1DB21H,43H,65H,87H

ASCIDB8dup(?)

dataends

LEASI.BCD1

LEADI,ASCI

補充內容:

3.2.2與轉移地址有關的尋址方式

1.段內轉移、段間轉移

段內轉移:

■移到同一個代碼段內的某個偏移地址處

段間轉移:

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

2.段內直接尋址

段內直接尋址:指令的有效地址是當前IP寄存器的內容

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

碼中帶有相對于當前IP的位移量,是相對尋址。

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

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

例:

JMPSHORTLI;L1與當前IP的位移量是一個8位值

JMPL1(或者JMPNEARPTRLI)

;L1與當前IP的位移量是一個16位值

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

3.段內間接尋址

有效地址是一個通用寄存器或數據段中一個存儲

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

式)。

例:

MOVAX,OFFSETpl

;獲取pl過程在代碼段內的偏移值

CALLAX

例:

MOVAX,[BX];數據段中,寄存器間接尋址

JMPBX;代碼段中,段內間接尋址

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

MOVADD1,AX;將AX內容送入數據段內的ADD1處

CALLADD1;轉移至ADD1中存放的偏移地址處

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

CALL[BX];轉移地址的偏移地址位于數據段中,

;要通過BX間接尋址獲取

4.段間直接尋址

段間直接尋址在指令中給出了要轉移的地址的

代碼段和段內偏移量。

例:

CALLFARPTRp2

要轉移至的標號或過程名必須具備FAR屬性。

5.段間間接尋址

轉移地址必須放入內存單元中,且是一個雙字。

例:JMPDWORDPTR[BX+INTERS]

間接的偏移量

內存單元中的轉移地址是一個雙字,高位字在

后,低位字在前。轉移后,低位字變成了IP,

高位字變成了CS。

3.3.4控制轉移指令

控制轉移指令用來改變程序的執行順序,

共有如下幾類:

?無條件轉移指令(JMP);

?條件轉移指令

?循環指令

?子程序調用與返回指令。

?中斷與中斷返回指令。

1、無條件轉移指令

例:

JMPSHORTPTRL1;轉移至段內L1標號處,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論