小華的部落格: 2010/2/28 - 2010/3/7

搜尋此網誌

網頁

星期三, 3月 03, 2010

有趣的Code-BootOption 的建立

今天在看BootOption建立的code時發現他會去跳掉同時有SimpleFileSystem&BlkIo protocol的Handle,只留下Hanlde 上面有SimpleFileSystem的!

雖然很搞不清楚他為什麼要這樣做,但是一般情況下不可能只有SimpleFileSystem存在!
所以應該是要防呆吧! 怕哪一天真的有Hanlde上面只掛SimpleFileSystem而沒有BlkIo.

這種Hanlde他還是會幫他建立出一個BootOption!


gBS->LocateHandleBuffer (
...
&gEfiSimpleFileSystemProtocolGuid,
...
);
for (Index = 0; Index < NumberFileSystemHandles; Index++) {
Status = gBS->HandleProtocol (
...
&gEfiBlockIoProtocolGuid,
(VOID **) &BlkIo
);
if (!EFI_ERROR (Status)) {

continue; //這邊會Skip
}
...
}

星期日, 2月 28, 2010

C語言複習3

~複習一下一些指標的概念~

問題一: 底下的這個做法的概念
int a;
*&a=30;

Ans:

int a; 可以看成 _A WORD ?
&a 可以看成 LEA BX,_A
* 可以看成 MOV 東西到某個記憶體,所以*&a=30 等同於MOV [BX],30

其實他是等同於a=30,但是這樣子寫會跑更慢!code更大!


問題二:
*200 = 30;

Ans:
這樣子寫是非法的,因為雖然a 在記憶體200的位址,但是你不知道a是多大
所以你要告訴Compiler要一次搬兩個byte. 所以(int *) 等同於word ptr.

*(int *)200=30;

用組語來看會類似 mov word ptr [200],30
其中word ptr是假指令,用來一次搬兩個BYTE
[200] 代表記憶體位址200