微機原理與系統設計筆記1 | 緒論與數製表示

来源:https://www.cnblogs.com/Roboduster/archive/2023/01/20/17062593.html
-Advertisement-
Play Games

打算整理彙編語言與介面微機這方面的學習記錄。 參考資料 西電《微機原理與系統設計》周佳社 西交《微機原理與介面技術》 課本《彙編語言與介面技術》王讓定 小甲魚《彙編語言》 1. 介紹 2022年春學習了MIPS視角下的電腦體繫結構與組成原理,同年夏自學了操作系統(科普級別的瞭解),彙編語言是學習操 ...



  • 打算整理彙編語言與介面微機這方面的學習記錄。
  • 參考資料
    • 西電《微機原理與系統設計》周佳社
    • 西交《微機原理與介面技術》
    • 課本《彙編語言與介面技術》王讓定
    • 小甲魚《彙編語言》

1. 介紹

2022年春學習了MIPS視角下的電腦體繫結構與組成原理,同年夏自學了操作系統(科普級別的瞭解),彙編語言是學習操作系統的時候,基於學過的計組強行吃下來的,並沒有單獨學過。

秋天學學校的OS(比較深入),同時我也報了彙編語言與介面技術這門選修課。在這門選修課上我感覺彙編相關內容還是十分豐富的,並且在系統、底層、安全這些方面用處很多。

這個系列是對這方面知識的整理。打算在這個系列的最後進行課程內容的複習。

2. 概覽

課程10章,前四章為彙編語言,後6章為微機硬體介面電路。

2.1 電子信息系統

  • 有了CPU的電子信息系統功能更為豐富。

  • 電子信息系統的輸入是物理量

  • 物理量轉化為電量:感測器

    轉化後的電量為 mv 級

  • 電量放大並濾波:前端調理電路

    模電課程(本人不學),到伏特級,留調試點。

  • 模擬信號到數字信號:A/D轉化

    可以根據需求選擇A/D晶元轉化的精度和速度。

  • 數字信號提交給CPU處理:CPU型號也是根據需求選擇。

  • CPU應當可以向A/D轉化器件和前段調理電路發送控制信號,控制一些處理速度。CPU處理後的數字信號應有存儲器存儲。

  • 需要輸出的數字結果:D/A轉化

  • 前端調理對稱地,需要後端調理電路,其輸出量來控制外部器件/設備

    實驗時這裡後端調理結束後通過測試點引出到示波器了。

  • 另一些應用場合,輸出要顯示(電視機)、列印(印表機)。

我們需要給CPU編程式(彙編語言),來決定整個系統怎麼工作,這就是前4章的主要內容。不同的I/O設備的類型也有差異,設備接受信息的格式不同(如串列並行、模擬量數字量),所以CPU和設備之間要設計一段介面電路,這是後半部分硬體部分的內容(時序、存儲器、I/O設備介面)。

2.2 微型電腦系統組成

A. 軟體子系統

不是本課程的講解內容。也可以簡單再分為系統軟體和應用軟體。

分為

B. 硬體子系統

早期電腦硬體組成

1

  • 控制器控制ALU運算:ALU運算的數據在控制器控制下送往存儲器;

  • 存儲器中的數據被控制器控制器送到ALU;

  • 輸入設備(IO)控制器控制輸入設備輸入數據到存儲器或ALU。

  • 隨著集成電路發展,將ALU和控制器集成在一起,成為中央處理器CPU(也稱微處理器)。

  • 上述部件之間傳遞信息:

    • 數據信息、控制信息、地址信息

      (這點很好理解)

    • 對應的傳送信息的線/通道:數據匯流排、控制匯流排、地址匯流排。

現代微型電腦硬體組成

  • 以微處理器/CPU為核心來組成。CPU通過引腳來跟外部存儲器、I/O實現地址、數據、控制信息交互。而8位CPU8個引腳,16位CPU16個引腳,是無法同時滿足三條匯流排分開接入的。

    8086CPU有16根數據匯流排,20條地址匯流排和16條控制匯流排。

  • 因此實現了一種分時復用技術,部分引腳分時復用。

    因此需要設計一個電路(系統匯流排形成電路),鑒別復用的部分引腳此時到底輸出/入的是什麼信息,並輸出輸入。

    要想設計這個電路需要瞭解CPU引腳的時序(第五章)。

    引腳也稱微處理器級匯流排

    轉化後形成的三匯流排稱為系統匯流排。外設就掛接在系統匯流排上。

  • CPU具體如何與外設交互:

    • CPU要給存儲器寫數據,需要通過CPU的寫控制引腳發送寫控制命令,同時發送地址信息,寫入對應地址,控制匯流排還要接收外設的狀態信息。
  • 硬體子系統中的存儲子系統,由ROM和RAM組成。對於內部不含存儲電路的CPU電子系統而言,必須用這兩樣ROM和RAM,在三匯流排上擴展設計存儲器。

    計組實驗匯流排信息這裡講挺清楚的,彙編與介面這課詳細講了怎麼設計存儲器。

    ROM又稱程式存儲器,用專用設備寫入,接入系統電路時是只讀的。
    2

2.3 彙編簡介

指令的概念

  • 指令是一組二進位代碼。用於明確指示上述系統中CPU的工作。彙編語言是二進位代碼的符號化描述。

2.4 介面簡介

前面提到了,I/O設備不會直接接到CPU上,要通過一段介面電路來完成標準化並與CPU連接。

介面電路也就是常說的介面。

3

I/O介面是連接CPU和I/O設備的控制電路。比如顯示器與CPU之間通訊有顯卡電路,音響與CPU之間有音效卡。

當然,CPU要想向I/O設備讀寫數據,需要地址來引導。這就提出了I/O介面地址。這是為I/O設備對應的I/O介面電路分配的地址,這就完成了從介面電路進行讀寫操作到從介面地址進行讀寫操作的轉化。

這一點跟存儲器的轉化是相通的。

這裡有一個問題,如何對I/O介面編址?

  • 8086系統中,是通過地址線來統一編址。即既編址存儲器地址,也編址I/O介面。這時讀寫存儲器和I/O的指令相同。

    當然,對於存儲器地址空間和I/O地址空間,也有很多微處理器採用兩個獨立地址空間。這時存儲單元地址和I/O埠的地址值可能相同,所以需要採用存儲器讀寫信號和I/O讀寫信號來區分。這樣CPU讀寫存儲器和I/O的指令是不同的。

  • 對於一個I/O介面來說,地址碼通常只有一個,這裡需要設計一個電路來完成從16根地址線(16位二進位)+控制線上的有效位 到一個控制命令(高低電平0/1)的轉化。

    其實也就是一個I/O地址解碼器。這是數電/數字邏輯課的內容。

    存儲器相應也有類似的結構。

4

5

這部分課程後續會再詳細介紹。

2.5 有關微機系統

上述硬體結構還不能工作,只是一個微型電腦,而不是微型電腦系統。需要配上I/O設備、電源、軟體等,才能正常工作。

2.6 存儲器簡介

前面已經提到過很多次存儲器,這裡再簡單整理下。

存儲器有幾個要素,地址單元大小,地址號碼。一個地址單元內是一個位元組8bit=1byte。而地址號則決定地址單元的邏輯位置,地址線編碼了地址號,CPU通過地址線定址存儲器。所以大空間的存儲器也要求著地址線條數要多。

地址線和數據線寬度的區別:

  • 數據線的寬度決定一次傳送的數據規模。

  • 8086CPU數據線16位,所以一次可以取兩個位元組的內容。

    因此,兩個相鄰的地址單元(位元組),可以組成一個字單元(也就是16位)。字分為高八位和第八位。

  • 大端位元組序和小端位元組序。而8086系統是高位元組存放在高地址空間,低位元組存放在低地址空間。

  • 讀/寫一個字時,讀/寫的地址是低位元組的地址號。

設計存儲器時我們需要對晶元進行相關組織而達到相關存儲要求。

3. 數制碼制快速複習

這部分各個課(C、數字邏輯、計組)都講,實在重覆。

3.1 數制

  • 程式設計中的二進位->十進位的一種方法:

    • 除十取餘法

      二進位除十的二進位,然後餘數變成十進位,這樣就是十以內的轉化

    • 比較法

    後面彙編部分會實現這裡的簡單轉換演算法

  • 程式設計中的十進位->二進位:

    比如要從鍵盤輸入95,CPU中9*10得到的結果就是二進位,再加5,得到的就是二進位95.

    這個想法根本原因是:CPU只認識二進位。

    mov AL, 96

    add AL, 89

    中的96、89就是二進位的形式被CPU識別的。

3.2 二進位算術運算

首先要搞清楚運算的對象是8位二進位(位元組)還是16位二進位(字)。

  • 在現在大多數情況的彙編語言中數字是十六進位的, 如果最開頭的一位是A~F, 仍然要求在前面加零.

  • 處理器狀態字寄存器/標誌寄存器:

6

只有運算才能影響標誌寄存器。包括下麵的邏輯運算。

補充:

  • PF是奇偶校驗,只看低八位,如果1個數為偶數則為1,奇數為0.可以用於數據串列通信過程中的奇偶校驗的硬體實現。
  • AF是輔助進位,管理四位間的進位借位,有進位為1。

3.3 二進位邏輯運算

  • 邏輯與 AND:
    • 可以用於清零某些位,更寬泛說可以規範化數據(如操作系統中查頁表時的操作)
  • 邏輯或 OR:
    • 同上,規範化數據,將某些位置為1而其他位不變,置1的位為1即可。
  • 異或 XOR:
    • 這裡我經常記錯,兩運算對象對應位不同則為1,相同為0.
    • 可以用於某些位取反而其他位不變,取反的位置為1即可。

3.4 表示範圍和溢出問題

  • 無符號數表示範圍:
    • 8位:00H~FFH
    • 16位:0000H~FFFFH
  • 有符號數表示範圍:
    • 機器數表示法:0--正,1--負數
  • 有符號數原碼:
    • 符號位+正常二進位表示
    • 缺點,+0和-0的機器數表示並不同,這在電腦中是矛盾的
    • 表示範圍:
      • 8位:+127+0,-0-127
      • 16位:+32767+0,-0-32767
  • 有符號數反碼:
    • 正數就是原碼
    • 負數:符號數+原碼其餘位取反
  • 有符號數補碼:
    • 正數就是原碼
    • 負數:反碼+1==符號位不變,原碼按位取反+1
    • 表示範圍:
      • 8位,+127~-128
      • 16位:+32767~-32768
    • 電腦中用的就是補碼

最近遇到了一個C程式上的問題,從埠中拿出的狀態碼是char類型的,但是用char接收會溢出,所以向上適用int類型就會正常。

3.5 補碼的運算

公式1:[X+Y]補 = [X]補+ [Y]補

公式2:[X-Y]補 = [X]補- [Y]補

公式3:[X-Y]補 = [X]補+ [-Y]補

  • 看結果時不看最高位溢出的(第九位),只看八位
  • 公式三由公式2發展而來,思路更簡單,並且節省了硬體電路。

由補碼的運算結果(補碼)求原碼:對補碼求補碼(符號位不變,取反+1)。所以有公式4.

公式4:[X]=[X補]補

在上面公式3的情境中,需要實現一個操作:已知[Y]補,求[-Y]補。這時需要包括符號位在內全部取反,再加1。

3.6 BCD碼

用四位二進位描述0~9十個十進位數

  • 對應關係

    • 0000---0
    • 0001---1
    • ..........
    • 1001---9
  • 也稱8421碼

  • 更複雜的表示

    • 組合BCD數,兩個BCD碼放在存儲器的一個位元組中。
    • 分離BCD數,兩個BCD碼分別放在兩個位元組的低四位,高四位為0.
    • 加減法有以上兩種表示,而乘除只有分離BCD數。
  • BCD碼的運算:主要是換算進位問題。

    如下圖,53+28的運算中需要判斷是否超過9,如果超過9而未達16,需要+6強制轉化。

    這時就用到了AF。

7

程式實現中

mov AL,53
add AL,28
DAA;如果設計BCD計算,+6調整
;如果是分離BCD,需要AAA指令

3.7 字元表示 ASCII碼

  • '0''9':30H39H

  • 字元到數字轉化:-30H

  • 'A''F':41H46H

    • 字元到數字轉化:-37H
  • 'a''f':61H66H

    • 大小寫轉化:

      ;假設將AL中轉換為大寫
      ;大寫和小寫僅在第五位有區別
      ;;大寫:0100_xxxx
      ;;小寫:0110_xxxx
      AND AL,0DFH
      ;;由於第七位必然為0
      AND AL,5FH
      
      
      ;AL中轉換為小寫
      OR AL,20H
      

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Loj鏈接:接竹竿 $ {\scr \color {SkyBlue}{\text{Solution}}} $ 題目大意: 給定一個數組,每次加入一種顏色的數,可以取走與它顏色相同的兩個數之間的所有數,問最後取走的所有數中最大和是多少 分析: 第一眼看到的是二分答案,但不知道二分的check()函數怎 ...
  • 2023-01-19 Spring聲明式事務管理屬性 一、隔離級別 1、概念:一個事務與其他事務之間的隔離等級(1,2,4,8)。 2、隔離級別: (1)讀未提交(1):READ UNCOMMTTED 存在問題:臟讀(讀取到了未提交數據) (2)讀已提交(2):READ COMMTTED 存在問題: ...
  • 概述 web管理系統中可以對業務數據執行新增和刪除,現在需要當業務數據發生新增或刪除操作後,儘可能實時的反應到WPF客戶端上面。 web管理系統用VUE編寫,後端服務為SpringBoot,WPF客戶端基於.Netframework4.8編寫。 整體架構 sequenceDiagram title: ...
  • 在工作中,為了防止文件被隨意複製和傳播,通常我們會選擇在文檔中添加水印來對文件進行有效保護。文字水印是比較常見的一種保護手段,它可以有效防止文件被任意複製和隨意列印傳播。不過,Excel預設並沒有水印功能。此時,我們可以把插入的藝術字作為水印,將水印和工作表融合在一起,以防止文檔被覆制傳播。那麼如何 ...
  • 如何實現在react現有項目中嵌入Blazor? 目前官方只提供了angular和react倆種示例所以本教程只將react教程 思路講解: 首先在現有react項目中我們可能某些組件是在Blazor中完成,但是我們沒辦法找到怎麼在react中輕量級使用blazor組件,可能會有人會使用iframe ...
  • 字元格式設置是指用戶對字元的屏幕顯示和列印輸出形式的設定。Word文檔中的字元格式有:字體、字型大小、字體顏色、高亮顏色、邊框、下劃線、斜體、陰影字、著重號等等。帶格式的文本可以突出內容重點,引起讀者註意。應用字元格式可以使簡單的文檔變得比只使用純文本更具吸引力。本文將為您介紹一種高效便捷的方法,通過編 ...
  • 這周收到兩片基於LGT8F328P LQFP32的Arduino Mini EVB, 機器上沒有 Arduino 環境需要新安裝, 正好感受一下新出的 Arduino IDE 2.x, 記錄一下 Ubuntu 20.04/22.04 下安裝 Arduino IDE 2.x 的過程. ...
  • 最近幾天用Python寫了個介面後臺服務,把它部在了伺服器的300埠上。之後,我又要把一個二級功能變數名稱解析到該伺服器的300埠上,此時就要用到NGINX了。因為之前對NGINX的使用並不熟悉,特此記錄下來,方便回顧。用了該方法,就能為伺服器上的多個不同介面服務綁定不同的功能變數名稱了,這也就是把多個功能變數名稱解析 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...