1. 程式人生 > >初學彙編 - 第一、二章總結

初學彙編 - 第一、二章總結

ORIGINAL POST

https://sst.st/p/560


 

此文總結第一、二、三單元所學。

因為前幾節課沒有去上,所以第一單元我可能不能非常正確地去總結,儘量按著老師的課件來看下去。

summary

Chap. I BASIS

第一章都是計算機基礎,或者可以說計算機組成原理的超級簡略版?

機器語言

silly binaries

計算機可以直接識別、執行。不是給人寫的東西。

不同種類的計算機其機器語言是不相通的,按某種計算機的機器指令編制的程式不能在另一種計算機上執行。

組合語言

silly string replacer

主體是彙編指令,使用助記符便於人記憶和使用。

機械語言是機械指令的集合,組合語言是機械指令符號化。

每一種特定的組合語言和其特定的機器語言指令集是一一對應的。(通用性還是較低)

計算機系統

有時間還是看看計算機組成原理吧。

儲存器 儲存單元

-

匯流排

還是叫成bus 直觀。

如果說主機板是一座城市,那麼匯流排就像是城市裡的公共汽車(bus),能按照固定行車路線,傳輸來回不停運作的位元。這些線路在同一時間內都僅能負責傳輸一個位元。因此,必須同時採用多條線路才能傳送更多資料,而匯流排可同時傳輸的資料數就稱為寬度,以位元為單位,匯流排寬度愈大,傳輸效能就愈佳。

PC上一般有五種匯流排*

  1. 資料匯流排:在CPU與RAM之間來回傳送需要處理或是需要儲存的資料。
  2. 地址匯流排:用來指定在RAM(Random Access Memory)之中儲存的資料的地址。
  3. 控制匯流排:將微處理器控制單元(Control Unit)的訊號,傳送到周邊裝置,一般常見的為USB Bus和1394 Bus。
  4. 擴充套件匯流排:可連線擴充套件槽和計算機。
  5. 區域性匯流排:取代更高速資料傳輸的擴充套件匯流排。

* Wikipedia 上說匯流排有五種,課本上只有前三種。

記憶體地址空間

虛擬地址空間?

現代的記憶體管理單元是以頁的方式,分割虛擬地址空間的。通過匯流排,CPU將各類儲存器當做一個邏輯儲存器對待。

感覺類似於把各個儲存器mount 到地址空間上,使其擁有一個唯一的地址(路徑)。

Chap. II REGISTER

summery

暫存器

快 少 在CPU裡

字長 位寬

字長:CPU在單位時間內能一次處理的二進位制位數,反映出CPU內部運算處理的速度。

位寬:CPU通過外部資料匯流排與記憶體之間一次能夠傳送的資料位。

大概就是高速公路收費站高速公路車道數的關係吧。

main registers

Four of them, AX, BX, CX, DX, can also be accessed as twice as many 8-bit registers.

4個:ax, bx, cx, dx

亦可使用ah, al 訪問通用暫存器的高位和低位。

感覺main registers 翻譯成通用暫存器怪怪的。

cs & ip

課本的編排是真的亂七八糟。

為什麼第二章PPT第12頁上說8086CPU的位寬是16位?

8086 資料匯流排16位, 地址匯流排 20位。

There are also three 16-bit segment registers (see figure) that allow the 8086 CPU to access one megabyte of memory in an unusual way. Rather than concatenating the segment register with the address register, as in most processors whose address space exceeds their register size, the 8086 shifts the 16-bit segment only four bits left before adding it to the 16-bit offset (16×segment + offset), therefore producing a 20-bit external (or effective or physical) address from the 32-bit segment:offset pair. As a result, each external address can be referred to by 212 = 4096 different segment:offset pairs.

也就是用

segment * 0x10  + offset = address

來實現IMB的定址。

 

同時修改 cs ip

jmp segment:offset
jmp segment:offset
jmp segment:offset

只修改 ip

jmp register
jmp register
jmp register

不能用 mov ip, ax ,重要的事情說三遍

debug

常用指令

沒啥好說的,有問題就敲?

  • Register
    檢視暫存器
  • Dump
    檢視記憶體
  • Enter
    修改記憶體
  • Unassemble
    反彙編
  • Trace
    單步執行
  • Assemble
    編寫彙編

etc

真的還是挺不錯的一個結局方法。

 

在我學習彙編之前,就已經瞭解到了一個不錯的C/C++反彙編工具 —— Godbolt 。喜歡的可以試一試。

 

references

  1. https://en.wikipedia.org/wiki/Intel_8086
  2. http://www.cnblogs.com/zyx20171346065/p/9696999.html
  3. https://zh.wikipedia.org/wiki/%E6%80%BB%E7%BA%BF
  4. https://en.wikipedia.org/wiki/Memory_address
  5. https://www.youtube.com/watch?v=yoLMOsxXgFw
  6. https://en.wikipedia.org/wiki/Word_(computer_architecture)