第4天 C語言與畫面顯示的練習

1、利用匯編來理解指針

mov [0x7cff],12
我們知道,上面這條語句是無法通過編譯的,因爲在指定內存時,不知道到底是BYTE、WORD、還是DWORD,所以我們要將其改成

mov byte [0x7cff],12
我們是這樣來定義指針的:

int *p;
p = 0xa0000;
*p = 12;
int是4字節,那麼p = 0xa0000就相當於mov eax,0xa0000,而*p = 12就相當於mov dword [eax],12。這樣子,我們就可以用指針來操縱內存了,而不需要上一節的write_mem8函數了。我們再來看指針的強制轉換:

char *p;
int i = 100;
p = (char *)i;
p[3] = 3;
通過g++編譯器編譯生成的.s彙編文件我們可以看到,p = (char *)i其實就相當於mov eax,byte [i]。而如果用p = i是無法通過編譯的,爲什麼?因爲在彙編下mov eax,[i]沒有指定操作字節類型,也是編譯不通過的~~那麼p[3]又是什麼呢?其實p[3] = *(p + 3),所以數組,指針其實在彙編中都是一個概念,只是說法不同而已。而且,需要注意的是,指針在加的時候,其實是包含着乘法運算的,即在內存中的反應是p + sizeof(char)

2、EFLAGS寄存器

EFLAGS寄存器是由FLAGS的16位寄存器擴展而來的32位寄存器。FLAGS是存儲進位標誌和中斷標誌等標誌的寄存器。進位標誌(第0位)可以通過JC或JNC等中轉指令來簡單地判斷到底是0還是1.但對於中斷標誌(第9位),沒有類似的命令,所以只能讀入EFLAGS,再檢查第9位是還是1。在彙編中,無法用mov指令來操作EFLAGS,只有pushfd和popfd兩個指令可以來操作它。

3、有返回值的C函數

我們從上一節知道,C語言可以調用匯編函數,但如果有返回值怎麼辦?根據C語言規約,執行ret語句時,eax中的值就被看作函數的返回值。

4、CLI和STI指令

CLI是將中斷標誌置爲0的指令,STI是要將這個中斷標誌置爲1的指令。當CPU遇到中斷請求時,是立即處理中斷請求(1)還是忽略中斷請求(0)就由這個中斷標誌位來設定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章