微機(jī)原理-第三章-11_第1頁(yè)
微機(jī)原理-第三章-11_第2頁(yè)
微機(jī)原理-第三章-11_第3頁(yè)
微機(jī)原理-第三章-11_第4頁(yè)
微機(jī)原理-第三章-11_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

調(diào)用指令CALL①段內(nèi)直接調(diào)用

格式

CALL符號(hào)地址;NEAR屬性

執(zhí)行

(SP)←(SP)-2

(SS:SP)←(下一條語(yǔ)句的IP)(IP)←符號(hào)地址的偏址

;轉(zhuǎn)至符號(hào)地址處取指令入棧保存返回地址偏值②段間直接調(diào)用格式

CALL符號(hào)地址;FAR屬性執(zhí)行

(SP)←(SP)-2(SS:SP)←(CS)

(SP)←(SP)-2(SS:SP)←(IP)(IP)←符號(hào)地址的偏址(CS)←符號(hào)地址的段址入棧保存返回地址段值入棧保存返回地址偏值轉(zhuǎn)至符號(hào)地址返回指令RET

②段間返回格式

RET或RETF

執(zhí)行

(IP)←(SS:SP)(SP)←(SP)+2

(CS)←(SS:SP)(SP)←(SP)+2從堆棧取返回地址偏值從堆棧取返回地址偏值從堆棧取返回地址段值①段內(nèi)返回格式

RET

執(zhí)行(IP)←(SS:SP)(SP)←(SP)+2段內(nèi)和段間返回指令的匯編語(yǔ)言格式均可用RET,但機(jī)器碼不同,段內(nèi)為C3H,段間為CBH,

匯編程序據(jù)過(guò)程類(lèi)型確定返回類(lèi)型。例1displayPROCNEAR

、、、、C3H

、、

RET;NEAR屬性的過(guò)程對(duì)應(yīng)段內(nèi)返回

displayENDP例2displayPROCFAR

、、、、CBH

、、

RET;FAR屬性的過(guò)程對(duì)應(yīng)段間返回

displayENDP例段內(nèi)直接調(diào)用

codeSEGMENT

、、、、、、

CALLsub2000:200H→

、、、、、、、、、、、、

subPROCNEAR2000:300H→

、、、、、、、、、

RETsubENDP

codeENDS0002A4501000:1004SS:SP

調(diào)用后(IP)=300H1000:1006SS:SP

返回后(IP)=200H0002A4501000:1006SS:SP

1000:1004SS:SP

堆棧的變化例段間直接調(diào)用

code1SEGMENT

、、、、、、

CALLsub2000:100H→

、、、、、、

code1ENDS

code2SEGMENT

、、、

subPROCFAR3000:200H→

、、、、、、、、、

RETsubENDP

code2ENDS

1000:1002SS:SP

調(diào)用后(IP)=200H(CS)=3000H1000:1006SS:SP

00010020A450

返回后(IP)=100H,(CS)=2000H1000:1002SS:SP

1000:1006SS:SP

00010020A450注意:在調(diào)用、返回指令中,利用堆棧保存、恢復(fù)返回地址。對(duì)堆棧的操作應(yīng)有目的性,不亂用堆棧操作,不隨意修改堆棧內(nèi)容,否則易造成死機(jī)。中斷:CPU暫?,F(xiàn)行程序,轉(zhuǎn)而處理隨機(jī)到來(lái)的事件,待處理完后再回到被暫停的程序繼續(xù)執(zhí)行,這個(gè)過(guò)程就是中斷。中斷概念中斷產(chǎn)生的情況下CPU運(yùn)行程序的流程中斷源

能夠引發(fā)中斷的事件被稱(chēng)為中斷源。

外部中斷源:由外部設(shè)備產(chǎn)生的中斷,如輸入/輸出請(qǐng)求、定時(shí)時(shí)鐘、掉電、設(shè)備故障等。內(nèi)部中斷源:由CPU內(nèi)部執(zhí)行指令過(guò)程中產(chǎn)生的中斷,如溢出、單步運(yùn)行、斷點(diǎn)、中斷指令I(lǐng)NTN等。

4)中斷調(diào)用、中斷返回指令指令:INTN/IRET

共有256個(gè)類(lèi)型號(hào)(0~FFH,即0~255)如:類(lèi)型號(hào)0

處理除0錯(cuò)誤的中斷子程類(lèi)型號(hào)9H

處理鍵盤(pán)操作的中斷子程類(lèi)型號(hào)21H

與DOS系統(tǒng)功能相關(guān)的中斷子程中斷向量表:存放256個(gè)中斷向量的內(nèi)存區(qū)域

4×256=1024=1K

中斷向量表地址為0:0~0:03FFH

即0段前1K個(gè)內(nèi)存單元,低端1K內(nèi)存。類(lèi)型號(hào)為N的中斷向量存放在4個(gè)內(nèi)存單元中

(0:N×4~0:N×4+3)

其中:(0:N×4~0:N×4+1)存放偏移地址

(0:N×4+2~0:N×4+3)存放段地址中斷向量:中斷子程序的入口地址,包括段地址、偏移地址類(lèi)型FF中斷向量類(lèi)型0中斷向量

、、段值類(lèi)型0向量的偏值類(lèi)型1向量的偏值

、、段值1020H3040H類(lèi)型FF向量的偏值

、、段值類(lèi)型1中斷向量類(lèi)型N中斷向量0:00000:00040:N×40:03fc中斷向量表0:0~3FF類(lèi)型N的中斷子程序從3040:1020H開(kāi)始▲有的中斷子程序在軟、硬件條件滿(mǎn)足時(shí),CPU會(huì)自動(dòng)去執(zhí)行

例如:①除0時(shí),CPU自動(dòng)執(zhí)行類(lèi)型0的中斷子程②按下某鍵,CPU自動(dòng)執(zhí)行類(lèi)型9的中斷子程

中斷調(diào)用指令I(lǐng)NT保存現(xiàn)場(chǎng)取中斷子程入口地址入棧保存IP入棧保存CS入棧保存PSW清IF標(biāo)志清TF標(biāo)志格式

INTN;其中N=0~FFH即0~255

執(zhí)行

(SP)←(SP)-2

(SS:SP)←(PSW)

IF←0TF←0

(SP)←(SP)-2

(SS:SP)←(CS)(SP)←(SP)-2

(SS:SP)←(IP)(IP)←(0:N×4)(CS)←(0:N×4+2)中斷返回指令I(lǐng)RET

格式

IRET

執(zhí)行

(IP)←(SS:SP)(SP)←(SP)+2

(CS)←(SS:SP)(SP)←(SP)+2

(PSW)←(SS:SP)(SP)←(SP)+2從堆棧取返回地址,并恢復(fù)現(xiàn)場(chǎng)

CS:IP轉(zhuǎn)至主程被中斷處取指令執(zhí)行IRET后SS:SP(PSW)(CS)(IP)執(zhí)行IRET前SS:SP

、、、、、、、、、、、、、、、、、、、、、內(nèi)存

0000:0000→、、、、0:1C×4=70h→FF53H

中斷向量表0:1C×4+2=72h→F000H(1K字節(jié))

、、

0:03FFH→、、、、、、

INT1CH

中斷調(diào)用

1271:0102H→、、、、、、、、、、

F000:FF53H→、、、、中斷子程、、

IRET

中斷返回

、、、、

F000:FFFFH→、、(PSW)=0300HIF=1,TF=12000:0106SS:SP

INT1C執(zhí)行前

IF=1,TF=1

(PSW)=0300H

(CS))=1271H

2000:0100SS:SP

127100

03

0102INT1C執(zhí)行后

(IP)=0102H

(PSW)=0000HIF=0,TF=0IRET執(zhí)行后

2000:0106SS:SP

(CS)=F000,(IP)=FF53、、、、了解INT指令調(diào)用中斷子程序

IRET指令中斷返回過(guò)程

D:\TEACH\DEBUG-A;匯編一條中斷指令

2F68:0100INT1C2F68:0102

-R;查看執(zhí)行指令前各寄存器內(nèi)容

AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=0F68ES=0F68SS=0F68CS=2F68IP=2100NVUPEIPLNZNAPONC0F68:0100CD1CINT1C-T;T單步執(zhí)行INT

1CAX=0000BX=0000CX=0000DX=0000

SP=FFE8BP=0000SI=0000DI=0000DS=0F68ES=0F68SS=0F68CS=F000IP=FF53NVUPDIPLNZNAPONCF000:FF53CFIRET-DSS:FFE8L08;查看執(zhí)行完后堆棧內(nèi)容

0F68:FFE00201682F

02F20000..h.....-D0:70L10;查看中斷向量表0:70–0:730000:007053FF

00F0A4F000F0-22050000355800C0........"...5X..-UF000:FF53;查看1C類(lèi)型的中斷子程

F000:FF53CFIRET

...利用DEBUG學(xué)習(xí)INT指令:▲清IF目的:進(jìn)入中斷子程序后,禁止可屏蔽中斷清TF目的:進(jìn)入中斷子程序后不單步執(zhí)行中斷子程▲不隨意修改中斷向量表的內(nèi)容,否則易造成死機(jī)▲不隨意修改堆棧內(nèi)容

6.處理機(jī)控制指令1)標(biāo)志處理指令

CLC,STC,CMC,CLD,STD,CLI,STI2)處理機(jī)控制指令HLT,NOP,WAIT,ESC,LOCK1)標(biāo)志處理指令▲設(shè)置和清除標(biāo)志的指令,只影響指令指定的標(biāo)志2)處理機(jī)控制指令②空操作指令NOP

格式

NOP

指令不執(zhí)行任何操作7、輸入輸出指令1.輸入指令I(lǐng)NINAL,n ;n是端口地址,n<0FFH

INAX,nINAL,DX;n>0FFHINAX,DX2.輸出指令OUTOUTn,AL/AX;

OUTDX,AL/AX;說(shuō)明:1、可傳送一個(gè)字節(jié)或字

2、只能通過(guò)AL或者AX傳送直接的輸入輸出指令指令中直接給出端口地址(地址<0FFH):INAL,50H ;將50H端口的字節(jié)讀入ALINAX,70H ;分別將70H、71H端口的內(nèi)容讀入 ;AL、AHOUT44H,AL ;將AL中的內(nèi)容輸出到44H端口OUT80H,AX ;將AL、AH中的內(nèi)容分別輸出到 ;80H、81H兩端口

INAL,DX ;從DX所指的端口中讀取

INAX,DX ;從DX和DX+1所指出的兩個(gè)端口;中讀取

OUTDX,AL ;將AL中的字節(jié)輸出到DX所指的;端口中

OUTDX,AX ;將AL中的字節(jié)輸出到DX所指的;端口中,同時(shí)將AH中的字節(jié)輸;出到DX+1所指的端口中間接的輸入輸出指令(>0FFH):注意:①只能用累加器AX作為執(zhí)行輸入輸出的機(jī)構(gòu),間接輸出指令的端口只能用DX②尋址范圍: 直接輸入輸出指令為0~255

間接輸入輸出指令為0~65535作業(yè)1.普通移位指令和循環(huán)移位指令(帶CF的和不帶CF的兩類(lèi))在執(zhí)行操作時(shí),有什么差別?在編制乘除法程序時(shí),為什么常用移位指令來(lái)代替乘除法指令?試編寫(xiě)一個(gè)程序段,實(shí)現(xiàn)將BX中的數(shù)除以10,結(jié)果仍放在BX中。2.找出下列指令中所有對(duì)的指令,寫(xiě)出題號(hào),錯(cuò)誤的請(qǐng)說(shuō)明原因。

(1)SHR

AX,3 (2)

AND

0FH,AL

(3)SAL

[BX],CX (4)

CBW

BH

(5)

LEA

BX,1000H

(6)DIV

0010H

(7)

MOV

AX,

[BX+BP]

(8)CMP

[BX],[SI]

(9)JMP

FAR[BX十SI]

3.用循環(huán)控制指令設(shè)計(jì)程序段,從60H個(gè)元素中尋找一個(gè)最大值,結(jié)果放在AL中。4.比較AX,BX,CX中有符號(hào)數(shù)的大小,將最大的數(shù)放在AX中,請(qǐng)編程。第三章Intel處理器指令系統(tǒng)和匯編語(yǔ)言§3.116位處理器指令系統(tǒng)§3.232位處理器指令系統(tǒng)§3.3匯編語(yǔ)言與匯編程序§3.4匯編語(yǔ)言與高級(jí)語(yǔ)言的接口3.3.1匯編語(yǔ)言的語(yǔ)句格式

dataSEGMENT;數(shù)據(jù)段varDB?dataENDScodeSEGMENT;代碼段

ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDS

ENDstart[標(biāo)號(hào)]

[:

]

助記符

[操作數(shù),]

[;注釋]名稱(chēng)

助記符項(xiàng)

操作數(shù)項(xiàng)

注釋項(xiàng)1.標(biāo)號(hào)

段名、變量名、標(biāo)號(hào)、過(guò)程名等。dataSEGMENT;數(shù)據(jù)段varDB?dataENDScodeSEGMENT;代碼段

ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AXMOVvar,CLMOVAH,4CHINT21H;返回DOScodeENDS

ENDstart[標(biāo)號(hào)]

[:

]

助記符

[操作數(shù),]

[;注釋]名稱(chēng)

助記符項(xiàng)

操作數(shù)項(xiàng)

注釋項(xiàng)標(biāo)號(hào)的命名規(guī)定:①

由字符A~Z,a~z,0~9及符號(hào)@、$、下劃線(xiàn)_等組成,最長(zhǎng)31個(gè)字符,超出部分忽略。②

不能用數(shù)字打頭,以免與十六進(jìn)制數(shù)相混。③

盡量不使用匯編程序中的保留字。(如指令的助記符等)④

對(duì)定義的符號(hào)不區(qū)分大小寫(xiě)。匯編語(yǔ)言中的保留字保留字(ReservedWord)是匯編程序已經(jīng)利用的標(biāo)識(shí)符(也稱(chēng)為關(guān)鍵字),主要有:指令助記符——例如:MOV、ADD偽指令助記符——例如:DB、DW操作符——例如:OFFSET、PTR寄存器名——例如:AX、CS預(yù)定義符號(hào)——例如:@data

匯編語(yǔ)言大小寫(xiě)不敏感2.助記符項(xiàng)指令、偽指令對(duì)于指令,匯編程序?qū)⑵浞g成機(jī)器語(yǔ)言指令。

MOVAX,100→B80001對(duì)于偽指令,匯編程序據(jù)其要求的功能進(jìn)行處理。

dataSEGMENT

→data與一段值對(duì)應(yīng)

stringDB‘Tsinghua’→string與一內(nèi)存地址對(duì)應(yīng)[標(biāo)號(hào)]

[:

]

助記符

[操作數(shù),]

[;注釋]名稱(chēng)

助記符項(xiàng)

操作數(shù)項(xiàng)

注釋項(xiàng)3.操作數(shù)項(xiàng)操作數(shù)多于一個(gè)時(shí),用逗號(hào)分開(kāi)。操作數(shù)可以是常數(shù)、寄存器、存儲(chǔ)器操作數(shù)、標(biāo)號(hào)名、過(guò)程名或表達(dá)式等。[標(biāo)號(hào)]

[:

]

助記符

[操作數(shù),]

[;注釋]名稱(chēng)

助記符項(xiàng)

操作數(shù)項(xiàng)

注釋項(xiàng)常數(shù)給出具體的數(shù)據(jù),可以是數(shù)字常量或字符常量。◢◢

數(shù)字默認(rèn)十進(jìn)制,也可加D表示十進(jìn)制數(shù)。如

1234D,1234◢

數(shù)字后加B表示二進(jìn)制數(shù)。如

1010B◢

數(shù)字后加H表示十六進(jìn)制數(shù)。如1234H◢

字符常量,用單引號(hào)表示。如‘1234’

匯編時(shí),用字符對(duì)應(yīng)的ASCII表示。如

31H,32H,33H,34H例

data1DB12,34,56;十進(jìn)制

data2DB12H,34H,56H;十六進(jìn)制

MOVAL,‘G’;字符

stringDB‘1234’;字符串

A、B、C、D、E、F開(kāi)頭的十六進(jìn)制數(shù)前面加0,與H結(jié)尾的標(biāo)識(shí)符區(qū)別。如寄存器名AH、BH、CH、

DH

變量名abcdH

等例

movAL,0AH

movAL,AH

movBX,0abcdH4.注釋項(xiàng)用分號(hào)間隔,用來(lái)說(shuō)明語(yǔ)句或程序的功能。匯編程序?qū)Ψ痔?hào)后的內(nèi)容不做處理。作用:①注釋程序,增強(qiáng)程序可讀性。

②可放在語(yǔ)句最前,暫時(shí)注釋某語(yǔ)句,調(diào)試程序用例

、、、

;MOVAH,2;顯示提示信息

;MOVDL,’A’

;INT21H

、、、[標(biāo)號(hào)]

[:

]

助記符

[操作數(shù),]

[;注釋]名稱(chēng)

助記符項(xiàng)

操作數(shù)項(xiàng)

注釋項(xiàng)指示性語(yǔ)句與指令性語(yǔ)句:指令性語(yǔ)句是用指令系統(tǒng)中的指令構(gòu)成的語(yǔ)句。

MOVAX,BX指示性語(yǔ)句是指示匯編程序進(jìn)行匯編的操作。

MOVAX,4+8中的+codeSEGMENT中的SEGMENTMOVBX,OFFSETstring中的OFFSET3.3.3偽指令

指示性語(yǔ)句與指令性語(yǔ)句指令(Instruction)——使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處理的指令偽指令(Directive)——不產(chǎn)生CPU動(dòng)作、在程序執(zhí)行前由匯編程序處理的說(shuō)明性指令

偽指令與具體的處理器類(lèi)型無(wú)關(guān),但與匯編程序有關(guān)。不同版本的匯編程序支持不同的偽指令指示性語(yǔ)句與指令性語(yǔ)句區(qū)別一個(gè)程序經(jīng)匯編,連接和裝入內(nèi)存后,在執(zhí)行程序之前:

◢指示性語(yǔ)句的功能已經(jīng)完成,故又稱(chēng)偽操作。

◢而指令性語(yǔ)句的功能尚未完成,需控制CPU去執(zhí)行,才能完成。aa

SEGMENT;數(shù)據(jù)段1

str1DB'Hello!’aa

ENDSbbSEGMENT;數(shù)據(jù)段2

str2DB6dup(?)bbENDSccSEGMENT;代碼段

ASSUMECS:ccASSUMEDS:aa,ES:bbstart:CLDMOVAX,aa

MOVDS,AXLEASI,str1MOVAX,bb

MOVES,AXLEADI,str2MOVCX,6REPMOVSBMOVAH,4CHINT21HccENDSENDstart

D:\masm>DEBUGhello2.exe-U:查看代碼段12A0:0000FCCLD12A0:0001B89E12MOVAX,129E12A0:00048ED8MOVDS,AX12A0:00068D360000LEASI,[0000]12A0:000AB89F12MOVAX,129F12A0:000D8EC0MOVES,AX12A0:000F8D3E0000LEADI,[0000]12A0:0013B90600MOVCX,000612A0:0016F3REPZ12A0:0017A4MOVSB12A0:0018B44CMOVAH,4C12A0:001ACD21INT21、、、-D129E:0L10;查看數(shù)據(jù)段1的內(nèi)容129E:000048656C6C6F210000-0000000000000000Hello!..........-D129F:0L10;查看數(shù)據(jù)段2的內(nèi)容129F:00000000000000000000-0000000000000000................-數(shù)據(jù)傳送源程序hello2.asm程序經(jīng)匯編、連接后,裝入內(nèi)存的情況如下:1.定義數(shù)據(jù)偽指令DB/DW/DD

變量名類(lèi)型助記符操作數(shù)[,操作數(shù),...]

用來(lái)定義程序中所用的內(nèi)存操作數(shù)。其中變量名指示內(nèi)存操

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論