1.1 匯編語(yǔ)言基本結(jié)構(gòu)模板
匯編語(yǔ)言的基本框架由這四部分組成,如果某個(gè)段沒(méi)有代碼,可以將與該段有關(guān)的代碼刪除。
1.2 8086 CPU簡(jiǎn)介
Intel8086是一個(gè)由Intel于1978年所設(shè)計(jì)的16位微處理器芯片,是x86架構(gòu)的鼻祖。不久之后,Intel 就推出了 Intel 8088 (一個(gè)擁有8根外部數(shù)據(jù)總線的微處理器)。它是以8080和8085的設(shè)計(jì)為基礎(chǔ),擁有類(lèi)似的寄存器組,但是數(shù)據(jù)總線擴(kuò)充為16位??偩€界面單元透過(guò)6字節(jié)預(yù)存的隊(duì)列位指令給執(zhí)行單元,所以取指令和執(zhí)行是同步的,8086 CPU有20條地址線,可直接尋址1MB的存儲(chǔ)空間,每一個(gè)存儲(chǔ)單元可以存放一個(gè)字節(jié)的二進(jìn)制信息。
1.2.1 8086引腳詳解
(1) 地址/數(shù)據(jù)復(fù)用AD0~AD15 :雙向三態(tài)門(mén)結(jié)構(gòu),采用分時(shí)的方法傳送地址或數(shù)據(jù)的復(fù)用引腳。根據(jù)不同時(shí)鐘周期的要求,決定當(dāng)前是傳送要訪問(wèn)的存儲(chǔ)單元或I/O端口的低16位地址,還是傳送16位數(shù)據(jù),或是處于高阻狀態(tài);
(2) 地址狀態(tài)S3~S6 :地址/狀態(tài)信號(hào),三態(tài)門(mén),采用分時(shí)的方法傳送地址或狀態(tài)的復(fù)用引腳。其中A19~A16為20位地址總線的高4位地址,S6~S3是狀態(tài)信號(hào)。S6表示CPU與總線連接的情況,S5指示當(dāng)前中斷允許標(biāo)志IF的狀態(tài)。S4,S3的代碼組合用來(lái)指明當(dāng)前正在使用的段寄存器。S4與S3的代碼組合及對(duì)應(yīng)段寄存器的情況;
(3) 允許總線高8位數(shù)據(jù)傳送/狀態(tài)信號(hào)BHE/S7 :輸出三態(tài),為總線高8位數(shù)據(jù)允許信號(hào),當(dāng)?shù)碗娖接行r(shí),表明在高8位數(shù)據(jù)總線D15 ~D8上傳送1個(gè)字節(jié)的數(shù)據(jù)。S7為設(shè)備的狀態(tài)信號(hào);
(4) 時(shí)鐘脈沖輸入端口CLK :用于輸入工作脈沖,8086的脈沖為5MHz的方波信號(hào);
(5) 準(zhǔn)備就緒信號(hào)READY :高電平有效;
(6) 最大最小工作模式選擇端MN/MX :高電平為最小工作模式,低電平為最大工作模式;
(7) 讀信號(hào)RD :低電平有效;
(8) 等待測(cè)試控制信號(hào)TEST :輸入,低電平有效。信號(hào)用來(lái)支持構(gòu)成多處理器系統(tǒng),實(shí)現(xiàn)8086 CPU與協(xié)處理器之間同步協(xié)調(diào)的功能,只有當(dāng)CPU執(zhí)行WAIT指令時(shí)才使用;
(9) 可屏蔽中斷請(qǐng)求信號(hào)INTR :高電平有效,8086 CPU在每條指令執(zhí)行到最后一個(gè)時(shí)鐘周期時(shí),都要檢測(cè)INTR引腳信號(hào)。INTR為高電平時(shí),表明有I/O設(shè)備向CPU申請(qǐng)中斷,若IF=1,CPU則會(huì)響應(yīng)中斷,停止當(dāng)前的操作,為申請(qǐng)中斷的I/O設(shè)備服務(wù);
(10) 非屏蔽中斷請(qǐng)求信號(hào)NMI :高電平有效,當(dāng)NMI引腳上有一個(gè)上升沿有效的觸發(fā)信號(hào)時(shí),表明CPU內(nèi)部或I/O設(shè)備提出了非屏蔽的中斷請(qǐng)求,CPU會(huì)在結(jié)束當(dāng)前所執(zhí)行的指令后,立即響應(yīng)中斷請(qǐng)求;
(11) 復(fù)位信號(hào)RESET :高電平有效。RESET信號(hào)有效時(shí),CPU立即結(jié)束現(xiàn)行操作,處于復(fù)位狀態(tài),初始化所有的內(nèi)部寄存器。復(fù)位后各內(nèi)部寄存器的狀態(tài),當(dāng)RESET信號(hào)由高電平變?yōu)榈碗娖綍r(shí),CPU從FFFF0H地址開(kāi)始重新啟動(dòng)執(zhí)行程序
最小工作模式下使用的引腳
(1) 存儲(chǔ)器和I/O端口選擇控制信號(hào)M/IO :信號(hào)指明當(dāng)前CPU是選擇訪問(wèn)存儲(chǔ)器還是訪問(wèn)I/O端口。為高電平時(shí),訪問(wèn)存儲(chǔ)器,表示當(dāng)前要進(jìn)行CPU與存儲(chǔ)器之間的數(shù)據(jù)傳送。為低電平時(shí),訪問(wèn)I/O端口,表示當(dāng)前要進(jìn)行CPU與I/O端口之間的數(shù)據(jù)傳送;
(2) 寫(xiě)信號(hào)WR :低電平有效。信號(hào)有效時(shí),表明CPU正在執(zhí)行寫(xiě)總線周期,同時(shí)由信號(hào)決定是對(duì)存儲(chǔ)器還是對(duì)I/O端口執(zhí)行寫(xiě)操作;
(3) 可屏蔽中斷響應(yīng)信號(hào)INTA :低電平有效;
(4) 地址鎖存允許信號(hào)ALE :高電平有效。CPU利用ALE信號(hào)可以把AD15~AD0地址/數(shù)據(jù)、A19/S6~A16/S3地址/狀態(tài)線上的地址信息鎖存在地址鎖存器中;
(5) 數(shù)據(jù)發(fā)送接收信號(hào)DT/R :三態(tài)門(mén)結(jié)構(gòu),用來(lái)控制數(shù)據(jù)傳送的方向。高電平時(shí),CPU發(fā)送數(shù)據(jù)到存儲(chǔ)器或I/O端口;低電平時(shí),CPU接收來(lái)自存儲(chǔ)器或I/O端口的數(shù)據(jù);
(6) 數(shù)據(jù)允許控制信號(hào)DEN :三態(tài),低電平有效信號(hào),用作總線收發(fā)器的選通控制信號(hào)。當(dāng)為低電平時(shí),表明CPU進(jìn)行數(shù)據(jù)的讀/寫(xiě)操作;
(7) 總線保持請(qǐng)求信號(hào)HOLD :高電平有效。在DMA數(shù)據(jù)傳送方式中,由總線控制器8237A發(fā)出一個(gè)高電平有效的總線請(qǐng)求信號(hào),通過(guò)HOLD引腳輸入到CPU,請(qǐng)求CPU讓出總線控制權(quán)。
(8) 總線保持響應(yīng)信號(hào)HLDA :高電平有效。HLDA是與HOLD配合使用的聯(lián)絡(luò)信號(hào)。在HLDA有效期間,HLDA引腳輸出一個(gè)高電平有效的響應(yīng)信號(hào),同時(shí)總線將處于浮空狀態(tài),CPU讓出對(duì)總線的控制權(quán),將其交付給申請(qǐng)使用總線的8237A控制器使用,總線使用完后,會(huì)使HOLD信號(hào)變?yōu)榈碗娖剑珻PU又重新獲得對(duì)總線的控制權(quán)。
最大工作模式下使用的引腳
(1) 總線周期狀態(tài)信號(hào)S2,S1,S0 :低電平有效。它們表明當(dāng)前總線周期所進(jìn)行的操作類(lèi)型,代碼組合及其對(duì)應(yīng)操作見(jiàn)下表
S2 | S1 | S0 | 執(zhí)行的操作 |
---|---|---|---|
0 | 0 | 0 | 中斷響應(yīng) |
0 | 0 | 1 | 讀IO端口 |
0 | 1 | 0 | 寫(xiě)IO端口 |
0 | 1 | 1 | 暫停 |
1 | 0 | 0 | 取指 |
1 | 0 | 1 | 讀存儲(chǔ)器 |
1 | 1 | 0 | 寫(xiě)存儲(chǔ)器 |
1 | 1 | 1 | 無(wú)效 |
(2) 總線請(qǐng)求允許信號(hào)輸入/總線請(qǐng)求允許輸出信號(hào)RQ和GT :低電平有效。該信號(hào)用以取代最小模式時(shí)的HOLD/HLDA兩個(gè)信號(hào)的功能,是特意為多處理器系統(tǒng)而設(shè)計(jì)的。當(dāng)系統(tǒng)中某一部件要求獲得總線控制權(quán)時(shí),就通過(guò)此信號(hào)線向8086 CPU發(fā)出總線請(qǐng)求信號(hào),若CPU響應(yīng)總線請(qǐng)求,就通過(guò)同一引腳發(fā)回響應(yīng)信號(hào),允許總線請(qǐng)求,表明8086 CPU已放棄對(duì)總線的控制權(quán),將總線控制權(quán)交給提出總線請(qǐng)求的部件使用。RQ/GT0優(yōu)先級(jí)高于RQ/GT1;
(3) 總線封鎖信號(hào)LOCK :低電平有效。信號(hào)有效時(shí),表示此時(shí)8086 CPU不允許其他總線部件占用總線;
(4) 指令隊(duì)列狀態(tài)信號(hào)QS1和QS0 :QS1和QS0信號(hào)的組合可以指示總線接口部件BIU中指令隊(duì)列的狀態(tài),以便其他處理器監(jiān)視、跟蹤指令隊(duì)列的狀態(tài)。
1.2.2 8086內(nèi)部結(jié)構(gòu)框圖
總線接口單元BIU構(gòu)成
(1) 地址加法器 :用于形成20位的物理地址,將段寄存器提供的段基址左移4位,再加上16位的偏移地址生成,送往外部總線,用于尋址內(nèi)存單元,其工作原理如圖所示。
(2) 4個(gè)16位的代碼段寄存器 ,分別為代碼段寄存器CS,數(shù)據(jù)段寄存器DS,堆棧段寄存器SS,擴(kuò)展段寄存器ES,其中:
代碼段寄存器CS:用于存放當(dāng)前程序所在段—代碼段的首地址;
數(shù)據(jù)段寄存器DS:用于存放當(dāng)前程序所用數(shù)據(jù)段的段首地址;
堆棧段寄存器SS:用于存放當(dāng)前程序所用堆棧段的段首地址;
擴(kuò)展段寄存器ES:用于存放輔助數(shù)據(jù)(字符串操作的目的區(qū)地址)所在段的段首地址。
(3) 指令指針寄存器IP :用于存放下一條指令的偏移地址;
(4) 一個(gè)6字節(jié)的指令隊(duì)列緩沖器 :當(dāng)執(zhí)行單元EU正在執(zhí)行指令且不需要占用總線時(shí),BIU會(huì)主動(dòng)的執(zhí)行預(yù)取指令操作,將所取的指令按先后次序存入指令隊(duì)列緩沖器中,隊(duì)列遵循“先入先出”原則,并按順序取到EU中執(zhí)行;
(5) 總線控制部件 :用于產(chǎn)生并發(fā)出控制信號(hào)。
執(zhí)行單元EU組成
(1) 算術(shù)邏輯單元ALU :用于進(jìn)行算術(shù)運(yùn)算與邏輯運(yùn)算;
(2) 4個(gè)16位通用寄存器AX,BX,CX,DX :用于保存操作數(shù)或者運(yùn)算結(jié)果;
(3) 4個(gè)16位專(zhuān)用寄存器 :只能以字的形式操作,常用于段內(nèi)尋址時(shí)提供偏移地址,分別為:堆棧指針寄存器SP,基址指針寄存器BP,源變址寄存器SI和目的變址寄存器DI;
(4) 一個(gè)16位的標(biāo)志寄存器FR :又稱(chēng)為程序狀態(tài)寄存器PSW,用于存放控制標(biāo)志和反應(yīng)CPU運(yùn)行的狀態(tài)特征,標(biāo)志寄存器內(nèi)容如下圖所示:
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OF | DF | IF | TF | SF | ZF | AF | PF | CF |
OF:溢出標(biāo)志位
0:沒(méi)有溢出
1:數(shù)據(jù)溢出
DF:方向標(biāo)志位
0:向前
1:向后
IF:中斷標(biāo)志位
0:禁止中斷
1:允許中斷
TF:陷阱標(biāo)志位
SF:符號(hào)標(biāo)志位
0:正數(shù)
1:負(fù)數(shù)
ZF:零標(biāo)志位
0:不是0
1:全0
AF:輔助進(jìn)位標(biāo)志位
0:關(guān)閉輔助
1:開(kāi)啟輔助
PF:奇偶標(biāo)志位
0:偶數(shù)
1:奇數(shù)
CF:進(jìn)位標(biāo)志位
1.2.3 8086的工作時(shí)序圖
在8086CPU中,一個(gè)最基本的總線周期由4個(gè)時(shí)鐘周期組成,即T1,T2,T3,T4一共4個(gè)狀態(tài),當(dāng)CPU需要等待時(shí),可以插入1個(gè)或多個(gè)等待狀態(tài)Tw。
最小工作模式下的讀時(shí)序
最小工作模式下的寫(xiě)時(shí)序
總線寫(xiě)操作時(shí)序與讀操作時(shí)序基本相似,但是存在幾個(gè)不同點(diǎn):
(1)CPU不是輸出RD信號(hào),而是輸出WR信號(hào);
(2)DT/R整個(gè)總線周期都是高電平,表示總線周期為寫(xiě)周期,在接有數(shù)據(jù)總線收發(fā)器的系統(tǒng)中,用來(lái)控制數(shù)據(jù)傳輸方向;
(3)AD15~AD0在T2到T4狀態(tài)輸出數(shù)據(jù),輸出地址與輸出數(shù)據(jù)為同一方向,無(wú)需像讀周期那樣要高阻態(tài)做緩沖,所以T2狀態(tài)無(wú)高阻態(tài)。
最大工作模式下的讀時(shí)序
最大工作模式下的寫(xiě)時(shí)序
最大工作模式與最小工作模式時(shí)序的區(qū)別:
(1) 控制信號(hào)ALE、DEN和DT/R :最大模式中,ALE、DEN和DT/R由總線控制器8288發(fā)出,DEN高電平有效,最小模式中,ALE、DEN和DT/R由8086 CPU直接發(fā)出,DEN是低電平有效;
(2) 命令信號(hào)MRDC、MWTC、AMWC、IORC、IOWC和狀態(tài)信號(hào)S2,S1,S0 :由于在最大方式下必須使用總線控制器8288,因此在其時(shí)序圖中必然出現(xiàn)訪問(wèn)存儲(chǔ)器和IO接口的命令信號(hào)。
復(fù)位時(shí)序
條件:檢測(cè)到RESET引腳為上升沿。
復(fù)位邏輯電路:用CLK來(lái)與外部RESET同步,內(nèi)部RESET信號(hào)要在時(shí)鐘的上升沿到來(lái)時(shí)才有效
1.5 8086最小系統(tǒng)搭建
圖中的8086 CPU只需要注意以下幾個(gè)事情即可:
(1)8086是高電平復(fù)位,所以正常運(yùn)行時(shí)需要將21腳接低電平,圖中的復(fù)位電路當(dāng)按鍵沒(méi)有按下的時(shí)候,用一個(gè)10K的下拉電阻將該引腳強(qiáng)制拉低,當(dāng)按鍵按下的時(shí)候,21腳會(huì)變?yōu)楦唠娖剑藭r(shí)8086進(jìn)入復(fù)位模式,抬起按鍵后,8086停止復(fù)位,進(jìn)入工作模式;
(2)33腳是最大最小工作模式選擇引腳,當(dāng)該引腳接VCC時(shí),8086工作在最小工作模式,當(dāng)該引腳接GND時(shí),8086則工作在最大工作模式,一般默認(rèn)其工作在最小工作模式;
(3)圖中利用74HC373作為地址鎖存,由于8086 CPU首先發(fā)送地址信息,然后發(fā)送數(shù)據(jù),所以,當(dāng)8086在T1和T2時(shí)刻發(fā)送地址時(shí),利用ALE的下降沿脈沖鎖存地址,確保其余的器件能夠檢測(cè)到地址信息。(注:由于8086具有20根地址線,最大尋址空間為1M,在仿真圖中只是用了其中的低16位);
(4)將8086的RD,WR,ALE和M/IO端口引出作為控制線;
(5)由于8086在仿真中已經(jīng)設(shè)計(jì)了一個(gè)5MHz的時(shí)鐘源,所以不需要繪制時(shí)鐘信號(hào)輸入,在實(shí)際設(shè)計(jì)中,需要外接5MHz的時(shí)鐘源。
(6)INTA是8086的一個(gè)外部中斷引腳,可以單獨(dú)使用,或者配合中斷芯片來(lái)擴(kuò)展中斷的個(gè)數(shù),最大可支持256個(gè)中斷。
1.6 Protuse 8.6環(huán)境搭建
1.6.1 仿真8086 CPU配置
(1)放置8086 CPU,74HC373等需要的器件,然后連接對(duì)應(yīng)的引腳;
(2)設(shè)置8086CPU的參數(shù),雙擊8086會(huì)彈出參數(shù)對(duì)話框,此時(shí)需要設(shè)置三個(gè)參數(shù):Internal Memory Size為1000H,Program Loading Segment為200H,Stop On Int3為Yes,如下圖所示:
1.6.2 程序編寫(xiě)配置
(1)點(diǎn)擊如圖所示的按鈕創(chuàng)建一個(gè)源文件SourceCode;
(2)點(diǎn)擊菜單欄中Project->CreateProject,然后在彈出對(duì)話框進(jìn)行設(shè)置:
① Family中選擇8086
② Compiler中選擇MASM32(如果顯示MASM32未安裝,直接點(diǎn)擊DownLoad下載安裝即可)。
③ 然后點(diǎn)擊確定,即可創(chuàng)建一個(gè)8086的工程,輸入如下圖所示的代碼后點(diǎn)擊運(yùn)行即可編譯成功并運(yùn)行程序。
注:匯編的源文件后綴是.asm格式
-
框架
+關(guān)注
關(guān)注
0文章
398瀏覽量
17404 -
匯編語(yǔ)言
+關(guān)注
關(guān)注
14文章
409瀏覽量
35693 -
代碼
+關(guān)注
關(guān)注
30文章
4722瀏覽量
68231
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論