




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
微機原理與接口技術
講課教師:王愛學
本課程研究的內容
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力維保合同協議書
- 中國飛機級膠合板行業市場前景預測及投資價值評估分析報告
- 設計合同補充協議書范本
- 拆房合同安全協議書模板
- 外墻施工合同協議書圖片
- 裝飾裝修工程方案大綱
- DIY蛋糕店商業計劃書-20250205-220220
- 2025年中國環氧粘合劑項目創業計劃書
- 汽車租賃經營專題方案
- 籃球隊合同協議書
- 2025年北京海淀初三二模語文試題及答案
- 2025年保定市中考二模歷史試題及答案
- 泰國餐飲勞務合同協議書
- 化工設計知到智慧樹章節測試課后答案2024年秋浙江大學
- 鋼結構吊裝施工方案-
- 銀發【2007】246號
- 【機械畢業設計全套含CAD圖論文】麥田免耕施肥播種機設計
- (完整word版)后進生轉化檔案
- 工信部聯通【2010】99號鐵路共建共享文件
- (中建一局)建筑裝飾裝修專項施工方案
- 日文履歷書(wordテンプレート)
評論
0/150
提交評論