內(nèi)含內(nèi)容如有錯漏或未解釋清楚之處請私信博主進(jìn)行討論,討論后予以更新
需要word和源碼文件交流也請私信博主
摘要
1 前言
2 實(shí)驗(yàn)原理
2.1 數(shù)據(jù)格式
2.2 指令格式
2.3 數(shù)據(jù)通路框圖
3 總體****設(shè)計
3.1 微指令流程圖
3.2 指令系統(tǒng)
3.3 線路連接圖
4 詳細(xì)設(shè)****計
4.1 冒泡排序
4.2 原碼一位乘
4.3 堆棧
5 實(shí)驗(yàn)結(jié)果
5.1 冒泡排序
5.2 原碼一位乘
5.3堆棧
6 參考文獻(xiàn)
摘要
本次課程設(shè)計首先對復(fù)雜模型機(jī)進(jìn)行研究,了解復(fù)雜模型機(jī)的工作原理,然后實(shí)現(xiàn)實(shí)驗(yàn)箱中硬件接線,并用測試樣例測試連線是否正確。測試通過后,對復(fù)雜模型機(jī)指令系統(tǒng)進(jìn)行運(yùn)用和改寫,通過編寫匯編語言代碼和微程序指令,實(shí)現(xiàn)了冒泡排序、四位原碼一位乘和棧這三個功能。
關(guān)鍵字:復(fù)雜模型機(jī) 冒泡排序 原碼一位乘 棧
1 前言
《計算機(jī)組成原理》是高等學(xué)校計算機(jī)專業(yè)的一門核心課程,通過對復(fù)雜模型機(jī)的學(xué)習(xí), 可以 使學(xué)生理解單處理機(jī)系統(tǒng)的組成結(jié)構(gòu),以及各功能部件的組成和工作原理, 幫助學(xué)生建立計算機(jī)的整機(jī)概念。
模型機(jī)必須能提供不同復(fù)雜程度的數(shù)據(jù)通路和運(yùn)算功能,必須能實(shí)現(xiàn)不同復(fù)雜程度的指令系統(tǒng)。 復(fù)雜模型機(jī)首先要實(shí)現(xiàn)一個簡單的CPU,并且在此 CPU 的基礎(chǔ)上,繼續(xù)構(gòu)建一個復(fù)雜的模型計算機(jī)。 CPU 由運(yùn)算器(ALU)、微程序控制器(MC)、通用寄存器(R0), 指令寄存器(IR)、程序計 數(shù)器(PC)和地址寄存器(AR)組成,如圖 3.1 所示。這個 CPU 在寫入相應(yīng)的微指令后, 就具備了 執(zhí)行機(jī)器指令的功能,但是機(jī)器指令一般存放在主存當(dāng)中,CPU 必須和主存掛接后,才有實(shí)際的意 義, 所以還需要在該 CPU 的基礎(chǔ)上增加一個主存和基本的輸入輸出部件,以構(gòu)成一個復(fù)雜的模型計算機(jī)。
模型機(jī)設(shè)計三大類指令共十五條,其中包括運(yùn)算類指令、控制轉(zhuǎn)移類指令, 數(shù)據(jù)傳送類指令。 運(yùn)算類指令包含三種運(yùn)算,算術(shù)運(yùn)算、邏輯運(yùn)算和移位運(yùn)算,設(shè)計有 6 條運(yùn)算類指令,分別為:ADD、 AND 、INC 、SUB 、OR、RR,所有運(yùn)算類指令都為單字節(jié),尋址方式采用寄存器直接尋址。控制轉(zhuǎn) 移類指令有三條 HLT 、JMP 、BZC,用以控制程序的分支和轉(zhuǎn)移,其中 HLT 為單字節(jié)指令,JMP 和 BZC 為雙字節(jié)指令。數(shù)據(jù)傳送類指令有 IN 、OUT、MOV、LDI、LAD 、STA 共 6 條,用以完成寄存 器和寄存器、寄存器和 I/O、寄存器和存儲器之間的數(shù)據(jù)交換, 除 MOV 指令為單字節(jié)指令外,其余 均為雙字節(jié)指令。
在本次復(fù)雜模型機(jī)實(shí)驗(yàn)中,我們通過硬件接線、程序運(yùn)行和冒泡排序、補(bǔ)碼一位乘法和堆棧功能代碼的編寫,深入了解了計算機(jī)系統(tǒng)各模塊的工作原理及相互間的聯(lián)系,熟悉計算機(jī)內(nèi)部的數(shù)據(jù)流向,清晰建立計算機(jī)整機(jī)概念。
2 實(shí)驗(yàn)原理
2.1 數(shù)據(jù)格式
模型機(jī)規(guī)定采用定點(diǎn)補(bǔ)碼表示法表示數(shù)據(jù),字長為8位, 8 位全用來表示數(shù)據(jù)(最高位不表示符號) ,數(shù)值表示范圍是: 0≤X≤28-1。
寄存器為8位,數(shù)據(jù)字段長度FFH。
2.2 指令格式
所有單字節(jié)指令(ADD、AND、INC、SUB、OR、RR、HLT和MOV)格式如下:
表 2.2.1 單字節(jié)指令
7654 | 32 | 10 |
---|---|---|
OP-CODE | RS | RD |
其中, OP-CODE 為操作碼,RS 為源寄存器, RD 為目的寄存器, 并規(guī)定:
表 2.2.2 RS,RD
RS 或 RD | 選定的寄存器 |
---|---|
00 | R0 |
01 | R1 |
10 | R2 |
11 | R3 |
IN 和 OUT 的指令格式為:
表 2.2.3 IN,OUT
7654 | 32 | 10(1) | 7—0(2) |
---|---|---|---|
OP-CODE | RS | RD | P |
其中括號中的1表示指令的第一字節(jié),2表示指令的第二字節(jié),OP-CODE為操作碼,RS為源寄存器,RD為目的寄存器,P為I/O端口號,占用一個字節(jié).用的是地址總線的高兩位進(jìn)行譯碼,I/O地址空間被分為四個區(qū),如表2.3.2 所示:
表 2.2.4 I/O 地址空間分配
A7 A6 | 選定 | 地址空間 |
---|---|---|
00 | IOY0 | 00-3F |
01 | IOY1 | 40-7F |
10 | IOY2 | 80-BF |
11 | IOY3 | C0-FF |
系統(tǒng)設(shè)計五種數(shù)據(jù)尋址方式,即立即、直接、間接、變址和相對尋址,LDI 指令為立即尋址, LAD 、STA 、JMP 和 BZC 指令均具備直接、間接、變址和相對尋址能力。LDI 的指令格式如下, 第一字節(jié)同前一樣,第二字節(jié)為立即數(shù)。
表 2.2.5 尋址
7654(1) | 32(1) | 10(1) | 7—0(2) |
---|---|---|---|
OP-CODE | RS | RD | data |
LAD 、STA 、JMP 和 BZC 指令格式如下。
表 2.2.6 指令格式
7654(1) | 32(1) | 10(1) | 7—0(2) |
---|---|---|---|
OP-CODE | M | RD | D |
其中 M 為尋址模式, 具體見表 2.2.7,以 R2 做為變址寄存器 RI。
表 2.2.7 尋址方式
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-2XnziDOY-1679752238166)(file:///C:\Users\cfreeze\AppData\Local\Temp\ksohtml18156\wps3.jpg)]
2.3 數(shù)據(jù)通路框圖
本模型機(jī)的數(shù)據(jù)通路框圖如圖 2.4.1 所示。
圖 2.3.1 數(shù)據(jù)通路框圖
3 總體設(shè)計
3.1 微指令流程圖
本模型機(jī)共有15條基本指令,表3.1.1列出了各條指令的格式、匯編符號、指令功能。
表3.1.1 基本指令說明
依據(jù)功能需要,我們把復(fù)雜模型機(jī)中的指令進(jìn)行了一定的更改,把地址為 3B 的保留指令設(shè)計為 DEC 指令,并把地址為 15 的微指令更改為自減一指令
3.2 指令系統(tǒng)
經(jīng)過更改后的微指令二進(jìn)制代碼表如表 3.2.1 所示。
表 3.2.1 二進(jìn)制代碼表
地址 | 十六進(jìn)制表示 | 高五位 | S3-S0 | A 字段 | B 字段 | C 字段 | UA5-UA0 | |
---|---|---|---|---|---|---|---|---|
00 | 00 00 01 | 00000 | 0000 | 000 | 000 | 000 | 000001 | |
01 | 00 6D 43 | 00000 | 0000 | 110 | 110 | 101 | 000011 | |
03 | 10 70 70 | 00010 | 0000 | 111 | 000 | 001 | 110000 | |
04 | 00 24 05 | 00000 | 0000 | 010 | 010 | 000 | 000101 | |
05 | 04 B2 01 | 00000 | 1001 | 011 | 001 | 000 | 000001 | |
06 | 00 24 07 | 00000 | 0000 | 010 | 010 | 000 | 000111 | |
07 | 01 32 01 | 00000 | 0010 | 011 | 001 | 000 | 000001 | |
08 | 10 60 09 | 00010 | 0000 | 110 | 000 | 000 | 001001 | |
09 | 18 30 01 | 00011 | 0000 | 011 | 000 | 000 | 000001 | |
0A | 10 60 10 | 00010 | 0000 | 110 | 000 | 000 | 010000 | |
0B | 00 00 01 | 00000 | 0000 | 000 | 000 | 000 | 000001 | |
0C | 10 30 01 | 00010 | 0000 | 011 | 000 | 000 | 000001 | |
0D | 20 06 01 | 00100 | 0000 | 000 | 011 | 000 | 000001 | |
0E | 00 53 41 | 00000 | 0000 | 101 | 001 | 101 | 000001 | |
0F | 00 00 CB | 00000 | 0000 | 000 | 000 | 011 | 001011 | |
10 | 28 04 01 | 00101 | 0000 | 000 | 010 | 000 | 000001 | |
11 | 10 30 01 | 00010 | 0000 | 011 | 000 | 000 | 000001 | |
12 | 06 B2 01 | 00000 | 1101 | 011 | 001 | 000 | 000001 | |
13 | 00 24 14 | 00000 | 0000 | 010 | 010 | 000 | 010100 | |
14 | 05 B2 01 | 00000 | 1011 | 011 | 001 | 000 | 000001 | |
15 | 06 32 01 | 00000 | 1100 | 011 | 001 | 000 | 000001 | |
16 | 01 B2 01 | 00000 | 0011 | 011 | 001 | 000 | 000001 | |
17 | 00 24 18 | 00000 | 0000 | 010 | 010 | 000 | 011000 | |
18 | 02 B2 01 | 00000 | 0101 | 011 | 001 | 000 | 000001 | |
1B | 00 53 41 | 00000 | 0000 | 101 | 001 | 101 | 000001 | |
1C | 10 10 1D | 00010 | 0000 | 001 | 000 | 000 | 011101 | |
1D | 10 60 8C | 00010 | 0000 | 110 | 000 | 010 | 001100 | |
1E | 10 60 1F | 00010 | 0000 | 110 | 000 | 000 | 011111 | |
1F | 10 10 20 | 00010 | 0000 | 001 | 000 | 000 | 100000 | |
20 | 10 60 8C | 00010 | 0000 | 110 | 000 | 010 | 001100 | |
28 | 10 10 29 | 00010 | 0000 | 001 | 000 | 000 | 101001 | |
29 | 00 28 2A | 00000 | 0000 | 010 | 100 | 000 | 101010 | |
2A | 04 E2 2B | 00000 | 1001 | 110 | 001 | 000 | 101011 | |
2B | 04 92 8C | 00000 | 1001 | 001 | 001 | 010 | 001100 | |
2C | 10 10 2D | 00010 | 0000 | 001 | 000 | 000 | 101101 | |
2D | 00 2C 2E | 00000 | 0000 | 010 | 110 | 000 | 101110 | |
2E | 04 E2 2F | 00000 | 1001 | 110 | 001 | 000 | 101111 | |
2F | 04 92 8C | 00000 | 1001 | 001 | 001 | 010 | 001100 | |
30 | 00 16 04 | 00000 | 0000 | 001 | 011 | 000 | 000100 | |
31 | 00 16 06 | 00000 | 0000 | 001 | 011 | 000 | 000110 | |
32 | 00 6D 48 | 00000 | 0000 | 110 | 110 | 101 | 001000 | |
33 | 00 6D 4A | 00000 | 0000 | 110 | 110 | 101 | 001010 | |
34 | 00 34 01 | 00000 | 0000 | 011 | 010 | 000 | 000001 | |
35 | 00 00 35 | 00000 | 0000 | 000 | 000 | 000 | 110101 | |
36 | 00 6D 51 | 00000 | 0000 | 110 | 110 | 101 | 010001 | |
37 | 00 16 12 | 00000 | 0000 | 001 | 011 | 000 | 010010 | |
38 | 00 16 13 | 00000 | 0000 | 001 | 011 | 000 | 010011 | |
39 | 00 16 15 | 00000 | 0000 | 001 | 011 | 000 | 010101 | |
3A | 00 16 17 | 00000 | 0000 | 001 | 011 | 000 | 010111 | |
3B | 00 16 15 | 00000 | 0000 | 001 | 011 | 000 | 010101 | |
3C | 00 6D 5C | 00000 | 0000 | 110 | 110 | 101 | 011100 | |
3D | 00 6D 5E | 00000 | 0000 | 110 | 110 | 101 | 011110 | |
3E | 00 6D 68 | 00000 | 0000 | 110 | 110 | 101 | 101000 | |
3F | 00 6D 6C | 00000 | 0000 | 110 | 110 | 101 | 101100 |
3.3 線路連接圖
實(shí)驗(yàn)線路圖如圖3.2.1 所示,實(shí)驗(yàn)開始前需仔細(xì)檢查接線后打開實(shí)驗(yàn)箱電源。
圖3.3.1 線路連接圖
4 詳細(xì)設(shè)計
4.1 冒泡排序
4.1.1 冒泡排序流程圖
圖4.1.1 冒泡排序流程圖
*4.1.2 設(shè)計原理*
冒泡排序(Bubble Sort)是排序算法里面比較簡單的一個排序。它重復(fù)地走訪要排序的數(shù)列,一次比較兩個數(shù)據(jù)元素,如果順序不對則進(jìn)行交換,并一直重復(fù)這樣的走訪操作,直到?jīng)]有要交換的數(shù)據(jù)元素為止
*4.1.3 總體思路*
先輸入待排序的數(shù)量至 R0,接著保存長度到 F1H 中,從 F1H 處取出數(shù)據(jù)送到 R2, 此步作為輸入循環(huán)控制。
輸入待排序數(shù)至 R0,采用變址尋址方式保存數(shù)據(jù), 其中 E0 為基地址,寄存器R2自減,若R2不等于0,則重新進(jìn)入輸入循環(huán)控制中; 若R2等于0,則跳到外循環(huán)控制中。
將R3中的數(shù)據(jù)送到R2中,R2作為內(nèi)循環(huán)控制。接著通過變址尋址方式取值送到R1中, 作為當(dāng)前比較數(shù),之后把最大值送入到 F2 中,保存最大數(shù)。
比較 R0 與 R1 中的數(shù)據(jù),若R1大于R0,則保存較大值位置,并取出較小值送到 R0,把較小值 R0 存到原來較大值的位置,再將R2自減;否則 直接進(jìn)入 R2 自減步驟。判斷 R2 是否為 0,若是,R3 自減,否則進(jìn)入內(nèi)循環(huán)控制。接著判斷 R3 是否 為 0,若是則輸出結(jié)果, 否則進(jìn)入內(nèi)循環(huán)控制。
*4.1.4 源程序代碼*
$P 00 21 ;IN R1,00H
$P 01 00 ;
$P 02 71 ;INC R1
$P 03 D1 ;STA R1,60H
$P 04 60 ;
$P 05 60 ;LDI R0,01H
$P 06 01
;LOOP:
$P 07 C1 ;LAD R1,60H
$P 08 60 ;
$P 09 81 ;SUB R1,R0
$P 0A F0 ;BZC HALT///OUT
$P 0B 26
$P 0C D1 ;STA R1,60H
$P 0D 60 ;
$P 0E 81 ;SUB R1,R0
$P 0F D1 ;STA R1,5FH
$P 10 5F
$P 11 62 ;LDI R2,61H
$P 12 61
;LOOP2:
$P 13 C8 ;LAD R0,[RI],00H
$P 14 00
$P 15 72 ;INC R2
$P 16 C9 ;LAD R1,[RI],00H
$P 17 00 ;
$P 18 84 ;SUB R0,R1
$P 19 F0 ;BZC EX
$P 1A 37 ;
;RET:
$P 1B 60 ;LDI R0,01H
$P 1C 01
$P 1D C3 ;LAD R3,5FH
$P 1E 5F ;
$P 1F 83 ;SUB R3,R0
$P 20 D3 ;STA R3,5FH
$P 21 5F ;
$P 22 F0 ;BZC LOOP
$P 23 07
$P 24 E0 ;JMP LOOP2
$P 25 13
$P 26 62;LDI R2,60HLOOP///OUT
$P 27 60
$P 28 60;LDI R0,03
$P 29 03
$P 2A 72;INC R2
$P 2B C9;LAD R1
$P 2C 00
$P 2D 34;OUT
$P 2E 40
$P 2F 61;DEC R0,LDIR1 01 SUB
$P 30 01
$P 31 84
$P 32 F0;BZC HALT
$P 33 36
$P 34 E0;JMP LOOP
$P 35 2A
$P 36 50 ;HALT
;EX:
$P 37 E0 ;JMP 29
$P 38 39 ;
$P 39 CB ;LAD R3,[RI],00H
$P 3A 00
$P 3B 60 ;LDI R0,01H
$P 3C 01
$P 3D 82 ;SUB R2,R0
$P 3E C8 ;LAD R0,[RI],00H
$P 3F 00
$P 40 72 ;INC R2
$P 41 D8 ;STA R0,[RI],00H
$P 42 00
$P 43 60 ;LDI R0,01H
$P 44 01
$P 45 82 ;SUB R2,R0
$P 46 D9 ;STA R1,[RI],00H
$P 47 00 ;
$P 48 72 ;INC R2
$P 49 E0 ;JMP RET
$P 4A 1B
;存放數(shù)字
$P 61 01
$P 62 03
$P 63 02
$P 64 04
$P 65 05
$P 66 06
$P 67 06
$P 68 08
$P 69 09
$P 6A 0A
$P 6B 0B
$P 6C 0C
$P 6D 0D
$P 6E 0E
$P 6F 0F
$P 70 10
$P 71 11
$P 72 12
$P 73 12
$P 74 14
4.2 原碼一位乘
4.2.1設(shè)計原理
。
4.2.2總體思路
在定點(diǎn)補(bǔ)碼一位乘的過程中,給各個寄存器和存儲單元賦初值,再通過乘數(shù)放乘積的低八位,存儲單元和寄存器r0放乘數(shù)的高八位,每次先判斷乘數(shù)最低位是否為0,為1則進(jìn)行部分積加被乘數(shù),同時保留溢出,保留部分積最低位,將乘數(shù)最低位置零,再加上部分積的最低位并進(jìn)行一次右環(huán)移),再將部分積最低位置零再右環(huán)移,并加回溢出值,判斷結(jié)束,運(yùn)算結(jié)束輸出結(jié)果,否則返回再循環(huán)。
4.2.3流程圖
定點(diǎn)原碼一位乘的總體流程如圖所示:
圖4.2.3 補(bǔ)碼一位乘流程圖
4.2.4 源程序代碼
$P 00 20 ;IN R0, 00H
$P 01 00 ;
$P 02 21 ;IN R1, 00H ;讀取輸入的值分別存儲到R0和R1里
$P 03 00 ;
$P 04 62 ;LDI R2,F0H
$P 05 F0
$P 06 63 ;LDI R3,0FH
$P 07 0F
$P 08 18 ;AND R0,R2 ;X
$P 09 1D ;AND R1,R3 ;Y
$P 0A 62 ;LDI R2, 00H ;計數(shù)
$P 0B 00 ;
$P 0C 63 ;LDI R3, 00H ;部分積
$P 0D 00 ;
$P 0E D0 ;STA 00, F0H, R0 ;存儲X的數(shù)據(jù)到f0單元
$P 0F F0 ;
$P 10 60 ;LDI R0, 00H ;初始化進(jìn)位標(biāo)志位為0
$P 11 00 ;
$P 12 D0 ;STA 00H, F4H, R0 ;存儲進(jìn)位標(biāo)志
$P 13 F4 ;
$P 14 72 ;INC R2
$P 15 60 ;LDI R0,05H ;循環(huán)次數(shù):5-1=4
$P 16 05 ;
$P 17 88 ;SUB R0, R2 ;比較循環(huán)次數(shù)
$P 18 F0 ;BZC Output ;zf=0 end
$P 19 49 ;
$P 1A 60 ;LDI R0,01H
$P 1B 01
$P 1C 14 ;AND R0,R1; 取最后一位的值
$P 1D F0 ;BZC Preser0 ;最后一位為0跳轉(zhuǎn)
$P 1E 21
$P 1F E0 ;JMP Preser1 ;為1跳另一個
$P 20 31
$P 21 60 ;LDI R0,01H;
$P 22 01
$P 23 D2 ;STA 00H, F1H, R2 ;存儲計數(shù)值
$P 24 F1
$P 25 A1 ;RR R1,R0
$P 26 A3 ;RR R3,R0 ;部分積和Y右移一位
$P 27 4C;MOV R0,R3
$P 28 62;LDI R2,08H
$P 29 08
$P 2A 18;AND R0,R2
$P 2B 01;ADD R1,R0 ;;;右一后將乘數(shù)第一位補(bǔ)充上
$P 2C 62 ;LDI R2, 80
$P 2D 80
$P 2E 1E ;AND R2,R3
$P 2F E0;JMP A0;;
$P 30 5C
$P 31 C0 ;LAD 00, F0H, R0 ;取出X
$P 32 F0
$P 33 03 ;ADD R3,R0 ;加一個X
$P 34 F0 ;BZC C0 相加有進(jìn)位,
$P 35 55 ;
$P 36 D2 ;STA 00H, F1H, R2 ;存儲計數(shù)值
$P 37 F1
$P 38 62 ;LDI R2, 80H
$P 39 80
$P 3A 60 ;LDI R0,01H
$P 3B 01
$P 3C A1 ;RR R1,R
$P 3D A3 ;RR R3,R0
$P 3E 4C;MOV R0,R3
$P 3F 62; LDI R2,08H
$P 40 08
$P 41 18;AND R0,R2
$P 42 01;ADD R1,R0
$P 43 E0;JMP A0
$P 44 5C
$P 45 C2 ;LAD 00H, F1H, R2
$P 46 F1
$P 47 E0 ;JMP Right
$P 48 14
$P 49 60 ;LDI R0,0FH
$P 4A 0F
$P 4B 62 ;LDI R2,F0H
$P 4C F0
$P 4D 1B ;AND R3,R2
$P 4E 11 ;AND R1,R0
$P 4F 07 ;ADD R3,R1
$P 50 3C ;OUT 40H, R3
$P 51 40;
$P 52 D3 ;STA 00H, F2H, R3
$P 53 F2
$P 54 50 ;HALT
$P 55 60 ;LDI R0 01H
$P 56 01 ;
$P 57 D0 ;STA 00H, F4H, R0 ;存儲進(jìn)位標(biāo)志
$P 58 F4
$P 59 80 ;SUB R0,R0 ;清空進(jìn)位標(biāo)志位
$P 5A E0 ;JMP C1 ;相加有進(jìn)位返回此處
$P 5B 36
$P 5C C0 ;LAD 00H, F4H, R0 ;取出進(jìn)位標(biāo)志位
$P 5D F4 ;
$P 5E 62 ;LDI R2,01H
$P 5F 01 ;
$P 60 82 ;SUB R2,R0
$P 61 F0 ;BZC A2 ;進(jìn)位為1
$P 62 68 ;
$P 63 62 ;LDI R2, 7FH
$P 64 7F ;
$P 65 1B ;AND R3,R2 ;讓部分積最高位置0
$P 66 E0 ;JMP A1 ;;部分積最高位為0
$P 67 45 ;
;A2:
$P 68 62 ;LDI R2, 80H
$P 69 80 ;
$P 6A 9B ;OR R3, R2 ;部分積最高位置1
$P 6B 60 ;LDI R0, 00H ;重置標(biāo)志位為0
$P 6C 00 ;
$P 6D D0 ;STA 00H, F4H, R0
$P 6E F4 ;
$P 6F E0 ;JMP A1
$P 70 45 ;
4.3 堆棧
4.3.1 設(shè)計原理
棧(stack)又稱堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱進(jìn)棧、入?;蛘呤菈簵?,它是把新元素放到棧頂元素的上面,使之稱為新的棧頂元素;從一個棧刪除一個元素又稱出棧或者是退棧,它是把棧頂元素刪除掉,使其相鄰的元素稱為新的棧頂元素。當(dāng)棧中沒有任何元素時稱為空棧。
4.3.2 棧約束
圖4.3.2.1 棧初始化
圖4.3.2.2 入棧
圖4.3.2.3 出棧
圖4.3.2.4 上溢說明
4.3.3 堆棧流程圖
圖4.2.3 堆棧流程圖
4.3.4 源程序代碼
START: | 初始化棧棧底棧容量初始化棧內(nèi)數(shù)據(jù) |
---|---|
IN R0,00H | 把00H端口的數(shù)據(jù)放入R0(輸入操作數(shù)) |
LDI R1,01H | 裝入比較值 |
SUB R1,R0 | 相減 |
BZC P1LDI R1,02H | 裝入比較值 |
SUB R1,R0 | 相減 |
BZC P2LDI R1,04H | 裝入比較值 |
SUB R1,R0 | 相減 |
BZC P3LDI R1,08H | 裝入比較值 |
SUB R1,R0 | 相減 |
BZC P4LDI R1,10H | 裝入比較值 |
SUB R1,R0 | 相減 |
BZC P5 | |
P1: | 入棧功能 |
IN R0,00 | 輸入入棧元素 |
LDI R2,61HLAD R1,[RI],00HINC R1STA 61H,R1 | 棧內(nèi)數(shù)據(jù)個數(shù)++R1 |
LDI R2,62HLAD R3,[RI],00HINC R3SUB R3,R1BZC WARN | 判上溢 容量 R3 |
LDI R2,63HLAD R1,[RI],00H ;r1存棧頂?shù)刂稭OV R2,R1STA R0,[RI],00H | 存數(shù) |
LDI R1,01HSUB R2,R1STA 63H,R2 | 棧頂指針減一 |
JMP START | 跳轉(zhuǎn)到開始 |
P2: | 出棧 |
LDI R2,60HLAD R1,[RI],00HSUB R0,R1BZC WARN | 判下溢,提示 |
LDI R2,63HLAD R0,[RI],00HINC R0STA 63H,R0 | 棧頂指針加一 |
LDI R2,61HLAD R0,[RI],00HLDI R1,01HSUB R2,R1STA 61H,R2 | 棧內(nèi)數(shù)據(jù)數(shù)-1 |
JMP START | 跳轉(zhuǎn)到開始 |
P3: | 展示元素//需要判斷是否是從指針加1開始的 |
LOOP: | |
LAD R0,63H | 取地址 |
LAD R1,R0 | 取地址內(nèi)的數(shù) |
OUT 40H,R1 | 顯示數(shù)據(jù) |
INC R0 | 指針++ |
LAD R2,60HINC R2SUB R0,R2BZC START;等于0就跳會選項(xiàng)JMP LOOP;未顯示完返回顯示 | 判斷指針是否等于棧底地址+1(下溢不顯示) |
P4: | 展示元素個數(shù) |
LAD R0,61HOUT 40H,R0 | 顯示數(shù)據(jù) |
JMP START | |
p5: | 清空棧 |
LDI R2,60HLAD R0,[RI],00HLDI R2,63HSTA R0,[RI],00H | 把棧底地址R0寫入棧頂?shù)刂?3H |
WARN: | |
LDI R0,FFH | |
OUT 40H,R0 | |
JMP START |
4.3.5 微程序代碼
$P0020
$P0100
$P0261
$P0301
$P0484
$P05F0
$P0621
$P0720
$P0800
$P0961
$P0A02
$P0B84
$P0CF0
$P0D46
$P0E20
$P0F00
$P1061
$P1104
$P1284
$P13F0
$P145F
$P1520
$P1600
$P1761
$P1808
$P1984
$P1AF0
$P1B72
$P1C20
$P1D00
$P1E61
$P1F10
$P2064
$P21F0
$P227A
$P2120
$P2200
$P2362
$P2491
$P25C9
$P2600
$P2771
$P2862
$P2992
$P2ACB
$P2B00
$P2C73
$P2D87
$P2EF0
$P2F84
$P30D1
$P3191
$P3262
$P3393
$P34C9
$P3500
$P3646
$P37D8
$P3800
$P3961
$P3A01
$P3B86
$P3CD2
$P3D93
$P3E62
$P3FFF
$P40C9
$P4100
$P4234
$P4340
$P44E0
$P4500
$P4662
$P4790
$P48C9
$P4900
$P4A84
$P4BF0
$P4C84
$P4D62
$P4E93
$P4FC8
$P5000
$P5170
$P52D0
$P5393
$P5462
$P5591
$P56C8
$P5700
$P5861
$P5901
$P5A86
$P5BD2
$P5C91
$P5DE0
$P5E00
$P5F62
$P6093
$P61C8
$P6200
$P6362
$P6490
$P65C9
$P6600
$P6784
$P68F0
$P6900
$P6A70
$P6B42
$P6CC9
$P6D00
$P6E34
$P6F40
$P70E0
$P715F
$P7262
$P7391
$P74C9
$P7500
$P7634
$P7740
$P78E0
$P7900
$P7A62
$P7B90
$P7CC8
$P7D00
$P7E62
$P7F93
$P80D8
$P8100
$P8300
$P8460
$P8500
$P86D0
$P8791
$P82E0
$P8300
$P8461
$P85FF
$P8634
$P8740
$P88E0
$P8900
$P8A50
$P90FF
$P9100
$P9202
$P93FF
5 實(shí)驗(yàn)結(jié)果
5.1 冒泡排序
依次輸入1,3,2三個數(shù),經(jīng)排序,數(shù)碼管應(yīng)依次顯示結(jié)果01,02,03,實(shí)驗(yàn)結(jié)果符合預(yù)期,如圖5.1.1、5.1.2、5.1.3所示。
圖5.1.1 冒泡排序?qū)嶒?yàn)結(jié)果1
圖5.1.2 冒泡排序?qū)嶒?yàn)結(jié)果2
圖5.1.3 冒泡排序?qū)嶒?yàn)結(jié)果3
5.2 原碼一位乘
低四位輸入0010(十進(jìn)制為2),高四位輸入0100(十進(jìn)制為4),高四位和低四位相乘,輸出結(jié)果應(yīng)為十進(jìn)制的08,實(shí)驗(yàn)結(jié)果符合預(yù)期,如圖5.2所示。
圖5.2 原碼一位乘實(shí)驗(yàn)結(jié)果
5.3堆棧
輸入0000 0001,實(shí)現(xiàn)入棧功能,將01壓入棧,數(shù)碼管應(yīng)顯示01,實(shí)驗(yàn)結(jié)果符合預(yù)期,如圖5.3.1所示
圖5.3.1 入棧實(shí)驗(yàn)結(jié)果
繼續(xù)入棧,設(shè)置棧內(nèi)容量為2,因此將兩個01壓入棧,會發(fā)生溢出,數(shù)碼管應(yīng)顯示FF,實(shí)驗(yàn)結(jié)果符合預(yù)期,如圖5.3.2所示
圖5.3.2 溢出實(shí)驗(yàn)結(jié)果
輸入0000 0010,實(shí)現(xiàn)元素出棧功能。
輸入0000 0100,實(shí)現(xiàn)顯示棧內(nèi)元素功能,之前壓入棧的數(shù)據(jù)為01,因此顯示01,運(yùn)行結(jié)果如圖5.3.3所示
圖5.3.3 顯示棧內(nèi)元素實(shí)驗(yàn)結(jié)果
輸入0000 1000,實(shí)現(xiàn)顯示棧內(nèi)元素個數(shù)功能,之前將兩個01壓入棧,因此數(shù)碼管應(yīng)顯示02,運(yùn)行結(jié)果符合預(yù)期,如圖5.3.4所示。
圖5.3.4 顯示棧內(nèi)元素個數(shù)實(shí)驗(yàn)結(jié)果
輸入0001 0000,實(shí)現(xiàn)清空棧內(nèi)元素功能,此時,棧內(nèi)元素清空,數(shù)碼管應(yīng)顯示00,實(shí)驗(yàn)結(jié)果符合預(yù)期,如圖5.3.5所示
圖5.3.5 清空棧實(shí)驗(yàn)結(jié)果
此時,棧內(nèi)無元素,在此顯示棧內(nèi)元素,數(shù)碼管應(yīng)顯示00,實(shí)驗(yàn)結(jié)果符合預(yù)期,如圖5.3.6所示。文章來源:http://www.zghlxwxcb.cn/news/detail-774935.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-774935.html
到了這里,關(guān)于用唐都實(shí)驗(yàn)箱通過微指令實(shí)現(xiàn)冒泡排序,原碼一位乘和棧的相關(guān)操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!