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
選擇”其他服務”
image
網址如下,直接複製、貼上吧,http://ui701-0xlab.blogspot.com/
image
中間會問妳要不要發一篇測試用的文,以偵測部落格的主題(顏色等外觀的東西),選Yes吧
image
然後就設定好了。
(3)接下來就操他媽的簡單了,記得po完文後,替這篇文上個分類用的標籤,方便其他人分類閱讀,目前這幾類是我隨便建的,沒有就建一個類別標籤吧!!
image
(4)下載、安裝PickPack
(5)PickPack 也操他媽簡單,看一下這幾個圖妳就操他媽上手了。
image
image
(6)整個很方便、迅速啊。
Ctrl + C、Ctrl + V,圖就上好了,還可以自己加框、箭頭、文字
image

對了,很重要的一件事,po文很容易有公司機密(eg.source code),但為了要閃洩漏機密卻得另外精心po文搞一大堆替代文字,卻會因此而懶得po文,所以,請回覆討論這個部落格是開放為任何人皆可閱讀還是只有我們幾個人可以閱讀??
目前是”任何人皆可閱讀”。
我想,目前還是先做公開的好了,先看這個站大家反應如何再來決定下一步。

以IO的方式,掃瞄PCI bus device。(透過CF8、CFC port)

Dos debug32.com
-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暫存器


image

  1. 準備一隻可開機至dos的隨身碟,
    裡面放好debug32.exe這隻檔案,
    不確定debug32.exe是不是免費的,版權自理,
    開機進入DOS,執行debug32.exe。
  2. 這是debug32的選項
    詳見小木偶的網頁
    -D, dump – dump記憶體內容
    -E, Edit – 編輯記憶體內容
    -A, Assembly - 寫簡單的組語
    -U, Un-assembly - 反組譯
    -R, Register - 看暫存器
    -T, Trace - 可以Trace指令(Instruction),單步等。
    -G, Go - 直接執行指令(Instruction)
    -S, Search – 在某段記憶體中,搜尋某字串or某值
    以上是我有用過的幾種選項,其他的就要另外再查。
    這裡要先用到-A,寫簡單的組語
  3. Segment: Offset,詳見小木偶的網頁
  4. 編輯組合語言,
    我們要到用到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
  5. code只有5行, 主要目的是第3行的out這個動作, 透過IO port cf8,去偵測 Bus_0, Device_0, Function_0, 那為甚麼80000000h就是Bus_0, Dev0, Fun_0? 詳見PCI Bus spec。

  6. 第四行—>mov dx, cfc
    第五行—>in eax, dx
    其實就是這樣,
    去cfc把資料(Data)讀出來。
image

  1. -u 100
    反組譯,從offset 100的地方開始。
    如果打得是-u 10b,那就會從offset 10b的地方開始反組譯。
  2. 30D5: 0100 ~ 30D5: 010e,
    這幾行的記憶體位址,就是我們剛剛寫的code。
  3. 像第一行的mov指令,佔了6個Byte,(0100 ~ 0105)
    第二行的mov指令,佔了3個Byte,(0106 ~ 0108)
    …以此類推
image
  1. -r ip 0100
    主要目的是要執行我們剛剛寫的code,
    所以要寫入 ip 這個暫存器,0100的值,
    0100,就是我們的第一行指令。
    若像下一行一樣只單打一個 –r
    就是顯示目前暫存器的值。

    IP, Instruction Pointer, 指令指標,
    這個暫存器是一個指標,指向下一條指令。
  2. -t
    就是trace,目前就是單步執行。
image
可以看到執行了幾次單步之後,
我們最後一行從 port cfc in 回來的值會放在 AX 這個暫存器,
然後看得到 AX = 8086,
也就是 Bus_0, Dev_0, Fun_0 的 Vendor ID,
也就是 Intel。
如果要掃瞄整個PCI bus,
就把這幾行寫成一個迴圈,
只要掃回來的值不是 ffffh,
那就是有Device。

利用Dos的Debug指令,制作簡易的重開機執行檔--Reset.com

開到Dos然後輸入Debug
-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所花時間

Windows 7有此功能,Vista應該也有…
在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 提供作業系統額外的機制,用於增加像電源管理和系統安全等功能。電腦製造商為了特定的系統設定,會使用自訂的處理器,而且這些廠商通常也會實作上述的額外功能。