在x86彙編中使用C語言的全域性變數

2021-08-09 15:08:27 字數 998 閱讀 8125

在閱讀于淵《乙個作業系統的實現》時,遇到如下乙個問題:

在**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...