用彙編的思想理解C C

2021-07-27 18:08:01 字數 1495 閱讀 7443

最近面試找工作, 遇到乙個美團乙個很好的面試官。 雖然面試結果可能不盡如意, 但是面試官給出的意見確非常中肯。 所以覺得有必要重新學習一下基礎。 就從作業系統開始學起。剛好之前從git上發現有人共享了一本30天自製作業系統。 書的標題雖然有點誇張, 但是覺得還是覺得跟著一步一步寫,效果會比單純的看長篇大論的理論要好。 也放出github的位址, 有興趣的也可以下下來看看。

cpu本質上所有的運算無非是通過與非門對0和1進行一系列的運算。cpu通過匯流排(位址匯流排:負責對記憶體進行定址 ;控制匯流排: 對外設裝置的控制(包括:鍵盤,滑鼠等);資料匯流排:將資料傳送到記憶體;)將外部的0 1訊號載入到cpu內部的暫存器中, cpu直接對暫存器中的01進行操作, 然後將運算後的資料或是傳給外設; 或是返回記憶體的某個位址; 或是將資料寫入到記憶體中。

說了半天等於沒說,不管學軟體還是硬體的人都知道的道理。沒錯,大道理都會懂,但是具體到語言級別, 是怎麼轉化為01的這些可能就要深入分析了; 從彙編的角度理解還是比較不錯的方向。

printf("hello, world!");
翻譯成彙編,大致的結構可能是這樣:

; 彙編中用分號表示注釋

; 當c語言執行到printf函式時, 大概對應的彙編會有:

; int ***

; jmp printf

printf: ; printf這裡可以理解為乙個標籤,其實也是乙個位址,cpu執行這個函式,就是跳到乙個位址

mov ax, "hello, world" ; 這條語句這種寫法不對,明白大概意思就行了, 意思大概就是將hello, world的二進位制賦值給cpu的暫存器

mov [bx], ax ; [bx]對應的可能是螢幕的位址, 這裡的大概意思是說把ax(hello, world)輸出到螢幕

char

a[3];

對應的彙編:

a:

db 0x00, 0x00, 0x00 ;當然c語言

char a[3] =;
mov [ax], 0x01

; [ax] 表示位址對應的記憶體, 就是把 0x01 放入指標a指向的記憶體

add ax, 1

; 對指標加1

mov [ax], 2

add ax, 1

mov [ax], 3

; 每一步的賦值mov都會額外占用一些空間

static

char a[3] = ;

翻譯成彙編:

a:

db 0x01

0x02, 0x03 ; 相比普通的賦值,占用的記憶體要少, 而且每次能保持變數內容的持久。

–未完,待續–

以上只是自己個人粗淺的理解, 很多方面可能有誤,歡迎大神指出。

用彙編的眼光看C (之嵌入彙編)

嵌入式彙編是對純彙編檔案的一種有益補充。通常會有下面幾種情況使用到彙編 1 提高 的工作效率 使用到cpu的一些特殊指令,比如說mmx指令 2 對硬體進行某種特殊的操作,比如說關中斷等,這在核心級的 中是比較常見的。但是我們講究嵌入式彙編的一些基本點和大家一起討論一下,建議大家和我一起做實驗,用事實...

用彙編的眼光看C (之嵌入彙編)

嵌入式彙編是對純彙編檔案的一種有益補充。通常會有下面幾種情況使用到彙編 1 提高 的工作效率 使用到cpu的一些特殊指令,比如說mmx指令 2 對硬體進行某種特殊的操作,比如說關中斷等,這在核心級的 中是比較常見的。但是我們講究嵌入式彙編的一些基本點和大家一起討論一下,建議大家和我一起做實驗,用事實...

用彙編的眼光看C (之嵌入彙編)

嵌入式彙編是對純彙編檔案的一種有益補充。通常會有下面幾種情況使用到彙編 1 提高 的工作效率 使用到cpu的一些特殊指令,比如說mmx指令 2 對硬體進行某種特殊的操作,比如說關中斷等,這在核心級的 中是比較常見的。但是我們講究嵌入式彙編的一些基本點和大家一起討論一下,建議大家和我一起做實驗,用事實...