
UI701 0xLab
2011年4月26日 星期二
2011年4月21日 星期四
How to share your knowledge to Blogger with WL Writer and PicPack / 如何分享妳的知識到部落格(使用Writer寫文,PicPack截圖)
Agenda:
(A) 前言
(B) Windows Live! Writer(寫文) + PicPack(截圖)
(A) 前言
大家畢業也將近一年了,我們平常都忙著做事,雖然工作上稍有領略,但都只能專注於手頭上的專業,利用分享及po文的過程,來強化個人記憶及互相學習或許是個不錯的idea,這個平台還盼各位一起努力,大家一起成長吧!!
Q: 為甚麼要用部落格?
Ans: 最重要的考量是:
- 便於分享,要能多位作者功能。
- 編輯便利,要有方便編輯的配套、快速的網站瀏覽速度。
- 便於討論,要有留言功能。
- 長期有效,盡量不要有網路空間經營不下去,然後搬站的資料轉移的麻煩。
- 免費使用。
所以我挑上Google Blogger做為共享的部落格,是有符合以上要求的。
原有意使用雲端筆記本,但缺少留言討論,所以作罷。
Q: Goole Blogger 的缺點?
Ans: 不是每個人都有意願及需要去申請Google帳號,現在新申請帳號還得留電話註冊,感覺不是很爽。
Q: 編輯如何快速、便利?
Ans: 用 Windows Live! Writer 寫文,再配上PicPack截圖,操他媽方便、簡單。
(B) Windows Live! Writer(寫文) + PicPack(截圖)
(1)下載及安裝,這應該不用講。
(2)以下是帳號設定SOP
選擇”其他服務”
網址如下,直接複製、貼上吧,http://ui701-0xlab.blogspot.com/
中間會問妳要不要發一篇測試用的文,以偵測部落格的主題(顏色等外觀的東西),選Yes吧
然後就設定好了。
(3)接下來就操他媽的簡單了,記得po完文後,替這篇文上個分類用的標籤,方便其他人分類閱讀,目前這幾類是我隨便建的,沒有就建一個類別標籤吧!!
(4)下載、安裝PickPack
(5)PickPack 也操他媽簡單,看一下這幾個圖妳就操他媽上手了。
(6)整個很方便、迅速啊。
Ctrl + C、Ctrl + V,圖就上好了,還可以自己加框、箭頭、文字。
對了,很重要的一件事,po文很容易有公司機密(eg.source code),但為了要閃洩漏機密卻得另外精心po文搞一大堆替代文字,卻會因此而懶得po文,所以,請回覆討論這個部落格是要開放為任何人皆可閱讀,還是只有我們幾個人可以閱讀??
目前是”任何人皆可閱讀”。
我想,目前還是先做公開的好了,先看這個站大家反應如何再來決定下一步。
以IO的方式,掃瞄PCI bus device。(透過CF8、CFC port)
-a
mov eax, 80000000 #bus0_dev0_fun0
mov dx, cf8 #IO port cf8(Index)
out dx, eax #寫入eax的值到cf8這個port
mov dx, cfc #IO port cfc(Data)
in eax, dx #到cfc這個port去讀值,放到eax暫存器
- 準備一隻可開機至dos的隨身碟,
裡面放好debug32.exe這隻檔案,
不確定debug32.exe是不是免費的,版權自理,
開機進入DOS,執行debug32.exe。 - 這是debug32的選項
詳見小木偶的網頁
-D, dump – dump記憶體內容
-E, Edit – 編輯記憶體內容
-A, Assembly - 寫簡單的組語
-U, Un-assembly - 反組譯
-R, Register - 看暫存器
-T, Trace - 可以Trace指令(Instruction),單步等。
-G, Go - 直接執行指令(Instruction)
-S, Search – 在某段記憶體中,搜尋某字串or某值
以上是我有用過的幾種選項,其他的就要另外再查。
這裡要先用到-A,寫簡單的組語 - Segment: Offset,詳見小木偶的網頁
- 編輯組合語言,
我們要到用到IN、OUT,詳見IN、OUT指令
OUT 指令
out dx,al
#out 輸出入埠編號,欲送至此埠的資料
IN 指令
in al,dx
#in 存放讀出來的資料,輸出入埠編號
第1行—>mov eax, 80000000
第2行—>mov dx, cf8
第3行—>out dx, eax
code只有5行, 主要目的是第3行的out這個動作, 透過IO port cf8,去偵測 Bus_0, Device_0, Function_0, 那為甚麼80000000h就是Bus_0, Dev0, Fun_0? 詳見PCI Bus spec。
第四行—>mov dx, cfc
第五行—>in eax, dx
其實就是這樣,
去cfc把資料(Data)讀出來。
- -u 100
反組譯,從offset 100的地方開始。
如果打得是-u 10b,那就會從offset 10b的地方開始反組譯。 - 30D5: 0100 ~ 30D5: 010e,
這幾行的記憶體位址,就是我們剛剛寫的code。 - 像第一行的mov指令,佔了6個Byte,(0100 ~ 0105)
第二行的mov指令,佔了3個Byte,(0106 ~ 0108)
…以此類推
- -r ip 0100
主要目的是要執行我們剛剛寫的code,
所以要寫入 ip 這個暫存器,0100的值,
0100,就是我們的第一行指令。
若像下一行一樣只單打一個 –r
就是顯示目前暫存器的值。
IP, Instruction Pointer, 指令指標,
這個暫存器是一個指標,指向下一條指令。 - -t
就是trace,目前就是單步執行。
可以看到執行了幾次單步之後,
我們最後一行從 port cfc in 回來的值會放在 AX 這個暫存器,
然後看得到 AX = 8086,
也就是 Bus_0, Dev_0, Fun_0 的 Vendor ID,
也就是 Intel。
如果要掃瞄整個PCI bus,
就把這幾行寫成一個迴圈,
只要掃回來的值不是 ffffh,
那就是有Device。
利用Dos的Debug指令,制作簡易的重開機執行檔--Reset.com
-a
jmp f000:fff0
按下Enter鍵結束。
看到剛剛輸入完後一共用了5個Byte,
所以要輸入size到cx暫存器,
-r cx
輸入0005
然後指定檔名,這裡取名為Reset.com
最後儲存。
-w
完成。
最大公因數 GCD
最大公因數(Greatest Common Divisor,簡寫為G.C.D.;或Highest Common Factor,簡寫為H.C.F.),指某幾個整數共有因數中最大的一個。參考來源:最大公因數 - 維基百科 、展轉相除法 - 維基百科
兩個整數的最大公因數主要有三種尋找方法:
//
//還沒加入檢查輸入不可為float(浮點數)
//
#include <stdio.h>
#include <stdlib.h>
#define INT int
#define UINT unsigned int
#define STATUS
#define SUCCESS 0
#define ERROR_PARSE 1
#define ERROR_BUFFER 2
#define DEVISOR_FIRST_VALUE 1
//求出兩傳入值的最大公因數。
STATUS UINT
CaculateGcd(INT InputVariableA,INT InputVariableB,UINT *Result);
//
//輸入兩數,求最大公因數
//
int main(int argc, char *argv[]){
INT InputVariableA;
INT InputVariableB;
UINT Result;
UINT Status;
InputVariableA = NULL;
InputVariableB = NULL;
Status = NULL;
Result = DEVISOR_FIRST_VALUE;
//等待按鍵輸入
scanf("%d %d", &InputVariableA, &InputVariableB);
printf("您輸入的數字為%d, %d\n", InputVariableA, InputVariableB);
//呼叫副程式,求最大公因數,然後判斷Status。
Status = CaculateGcd(InputVariableA, InputVariableB, &Result);
switch(Status){
case(SUCCESS):
printf("%d與 %d的最大公因數為:%d\n", InputVariableA, InputVariableB, Result);
break;
case(ERROR_PARSE):
printf("Error No. = %d,傳入值錯誤\n", ERROR_PARSE);
break;
case(ERROR_BUFFER):
printf("Error No. = %d,Buffer錯誤\n", ERROR_BUFFER);
break;
}
system("PAUSE");
return 0;
}
//求出兩傳入值的最大公因數。
STATUS UINT
CaculateGcd(INT InputVariableA, INT InputVariableB, UINT *Result){
UINT Bigger;
UINT Smaller;
UINT Buffer;
//檢查傳入值
if(InputVariableA == NULL || InputVariableB == NULL || InputVariableA < 1 || InputVariableB < 1){
return ERROR_PARSE;//不接受的傳入值
}
if(*Result != DEVISOR_FIRST_VALUE){
return ERROR_BUFFER;//Buffer錯誤
}
//(1)檢查兩數是否相等。
if(InputVariableA == InputVariableB){
*Result = InputVariableA;
return SUCCESS;
}
//(2)檢查兩數之中,何為大數,何為小數。
if(InputVariableA > InputVariableB){
Bigger = InputVariableA;
Smaller = InputVariableB;
} else{
Bigger = InputVariableB;
Smaller = InputVariableA;
}
//(3)輾轉相除法
do{
Buffer = Bigger % Smaller;
if(Buffer == 0){
*Result = Smaller;
} else {
Bigger = Smaller;
Smaller = Buffer;
}
} while(Buffer != 0);
return SUCCESS;
}
檢視S3 喚醒,BIOS所花時間
在S3喚醒後,"事件檢視器"->"Windows紀錄"->"系統"->"PowerTroubleShooter"->"詳細資料"->"BiosInitDuration"
可以看到S3喚醒,BIOS所花的時間。
一般要求在500~600(單位未查證,應該是ms,千分之一秒)
而有獨顯的機種S3喚醒時間會比較長。
IA-32處理器 - 基本操作模式
IA-32處理器有三個基本操作模式:
- Protected Mode。(保護模式)
- Real-address Mode。(實體位址模式)
- System Mangement Mode; SMM。(系統管理模式)
另一種模式是 Vitual-8086 Mode (虛擬8086模式),它是保護模式的特殊情況。
—>在保護模式下的同時,處理器還可以在安全的多工環境中,直接執行 Real-address Mode 軟體,例如像是 MS-DOS 程式。換句話說,就算有一個 MS-DOS 程式當機,或者此程式要將資料寫入系統記憶體區域,也不會影響其他正在執行的程式。 Windows XP 可以同時執行多個各別的 Vitual-8086 session (對話)。
* 每個程式都可以擁有自己的 1 MB 記憶體區域。
(1) Protected Mode:
Protected Mode 是處理器最原始的狀態,在這種模式下,所有指令與功能都是可以使用的。此時程式會被分配得到各自的記憶體空間,此記憶體空間稱為 segments (區段),且處理器會防止程式referrence (參考) 被指派的 segments (區段) 以外的記憶體。
(2) Real-address Mode:
* Real-address Mode 可以實作出 Intel 8086 處理器的程式執行環境,而且所實作的環境還具有一些額外的功能,例如切換到其他模式的功能。Real-address Mode 可以在 Windows 98 中使用,而且可以用來執行一個須要直接存取系統記憶體或硬體裝置的 MS-DOS 程式。在Real-address Mode 下執行的程式,可能導致作業系統當機(無法再對使用者所下達的命令加以反應)。
* Real-address Mode 的程式,最多僅能存取 1 MB 的記憶體範圍。
(3) Ssytem Management Mode; SMM:
SMM 提供作業系統額外的機制,用於增加像電源管理和系統安全等功能。電腦製造商為了特定的系統設定,會使用自訂的處理器,而且這些廠商通常也會實作上述的額外功能。