在閱讀于淵《乙個作業系統的實現》時,遇到如下乙個問題:
在**chapter6/r/kernel/kernel.asm中,有這樣一段彙編**:
357 restart:
358 mov esp, [p_proc_ready]
359 lldt [esp + p_ldt_sel]
360 lea eax, [esp + p_stacktop]
361 mov dword [tss + tss3_s_sp0], eax
362 restart_reenter:
363 dec dword [k_reenter]
364 pop gs
365 pop fs
366 pop es
367 pop ds
368 popad
369 add esp, 4
370 iretd
第358行的**一開始讓我疑惑,因為這句話的目的是賦值給esp乙個位址值,
p_proc_ready是乙個結構體指標,照理說是不應該加方括號的,因為方括號表示p_proc_ready這個位址值所指向的記憶體單元的內容。
p_proc_ready是這樣定義的:
extern process* p_proc_ready;
process是struct型別的乙個結構體。
後來想明白了,p_proc_ready在c語言和x86彙編中代表著不同的含義,在c中它代表乙個指向結構體的指標,而在彙編中,它代表的是一段連續記憶體空間的別名,就像357行的restart。事實上,c中所有的變數名在彙編看來都是標籤,都是一段連續記憶體空間的別名。
這樣358行就好理解了,p_proc_ready這個位址標籤所指向的內容就是我們需要的指標值。
在下面這篇部落格中,介紹了相反的應用,在c中使用彙編定義的全域性變數,結果是彙編中的位址標籤在c中被解釋成了變數名,和我們上面所說的同乙個意思。
c語言中通過全域性變數引用組合語言中的全域性標籤
x86彙編中巨集的使用
定義格式 巨集指令名 macro 形式引數 形式引數 巨集體 endm 注意事項 先定義後使用 macro與endm成對使用 使用舉例 write string macro a lea dx,a mov ah,9 int21h endmrclf db 0dh,0ah,write string rcl...
C語言在x86上使用堆疊的方式
堆疊區是同一片空間,但堆向上生長,棧向下生長,中間是空閒區域。esp棧指標暫存器,其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀 當前正在使用的棧幀 的棧頂 邏輯上是棧頂,但物理上是最低的位置。在該堆疊保留區域中該位置以下的所有內容都是空閒的。將值壓入堆疊需要減少棧指標,然後將值寫入棧指標指...
組合語言 基於X86 學習筆記
1.機器語言 machine language 是一種數字語言,專門設計成唄計算機處理器 cpu 理解。所有x86處理器都理解的共同機器語言。2.組合語言 assembly language 包含助記符書寫的語言。3.組合語言與機器語言是一一對應 one to one 的關係。4.彙編器 assem...