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