Feeds:
文章
留言

Archive for 九月 29th, 2005

組語 cpuid 指令

cpuid 指令主要是提供 CPU 的資訊,依據官方文件說明,如果先將 EAX 設定為 1 後呼叫 cpuid,可以透過 EAX 不同位元來獲得如下的資訊:
 0: 是否支援 FPU(Float Point Unit on chip)
 1; 是否支援 VME(Virtual 8086 Mode Enhancements)
 2: 是否支援 DE(Debugging Extensions)
 3: PSE(Page Size Extensions)
 4: TSC(Time Stamp Counter)
 5: MSR(Model Specific Registers)
 6: PAE(Physical Address Extension)
 7: MCE(Machine Check Exception)
 8: CX8(CMPXCHG 8B Instruction)
 9: APIC(Advanced Programmable Interrupt Controller)
10: 保留
11: SEP(Fast System Call), 支援 SYSENTER 和 SYSEXIT 指令
12: MTRR(Memory Type Range Registers)
13: PGE(PTE Global Flag)
14: MCA(Machine Check Architecture)
15: CMOV(Conditional Move and Compare Instructions)
16: FGPAT(Page Attribute Table)
17: PSE-36(36-bit Page Size Extension)
18: PN(Processor Number)
19-22: 保留
23: 是否支援 MMX 指令集,
24: FXSR(Fast FP/MMX. Technology/Streaming SIMD Extensions save/restore)
25: XMM(Streaming SIMD Extensions)
26-31 保留
補充:不在 intel 的文件中 28 bits 表示是否支援 HyperThread
 
下面範例會顯示 EDX 暫存器 0~31 bits 的狀態值
#include <iostream>
void main( void )
{
 int v;
 int idx = 0;
 int iEDX;
 __asm{ 
  mov eax, 1  ;
  cpuid   ;
  mov iEDX, edx
  mov eax, idx ;
  mov ebx, 0x1 ; mask = 0000 0000 0000 0000 0000 0000 0000 0001
for:
  mov edx, iEDX
  and edx, ebx ;
  cmp edx, 0
  jz yes
  mov v, 1 ;
  jmp no
yes: mov v, 0 ;
no:
  mov idx, eax
 }
 
 std::cout << v << ",";
 __asm{
  shl ebx, 1  ; << 1
  mov eax, idx ;
  inc eax   ; ++EAX  
  cmp eax, 32  ;
  jnz for
 }
 
}

Read Full Post »

組語 1+2+3+…10

一層迴圈測試

 

#include <iostream>
void main( void )
{
 // 1+2+3+…+10 = 55
 int sum;
 __asm{  
  mov eax, 0  ;
  mov ecx, 1  ;
for:
  add eax, ecx ;  
  inc ecx   ;
  cmp ecx, 10+1 ;  
  jnz for   ;
  mov sum, eax;  
 }
 std::cout << sum;
}

Read Full Post »

終於找到 intel x86 的手冊

最近在玩組語,可惜缺少指令集,今天查找資料的時候終於找到官方手冊,有興趣的人可以到 http://support.intel.com/design/pentiumii/manuals/243191.htm 下載

Read Full Post »

VC 用組語初始化字元陣列

char 資料型態的長度為 1byte,所以使用 BYTE PTR

 

void main( void )
{
 char msg[6];

 __asm{
  mov BYTE PTR msg,   104   ; h
  mov BYTE PTR msg+1, 101 ; e
  mov BYTE PTR msg+2, 108 ; l
  mov BYTE PTR msg+3, 108 ; l
  mov BYTE PTR msg+4, 111 ; o
  mov BYTE PTR msg+5, 0    ;
 }

 std::cout << msg << std::endl ; 
}

Read Full Post »

[笑話]醫生你能不能說快點

話說同事那天陪老婆去產檢……然後拍3D胎兒照!

照片出來時,夫妻二人很高興的看著,說話的內容當然不外乎是寶寶那裡像誰……那裡又像誰……

正當二人正進行上述甜蜜的對話時,醫生對著爸爸說:「這孩子不是你的……

啥米???!!!

先生的臉馬上垮了下來……(孩子不是我的……不是我的… …

太太:「老公,你要相信我,我沒有作出對不起你的事吶!」

正當二人快要吵起來時……醫生說:….「這張才是,剛拿錯了……

Read Full Post »

SQL_SMALL_RESULT 有何用途

之前剛接觸 MySQL 的時候,同事告訴我如果查詢的資料結果很小,可以加上 SQL_SMALL_RESULT 來最佳化,可是最近查找 MySQL 官方手冊的時候發現,SQL_SMALL_RESULT 必須與 GROUP BY、DISTINCT 或 DISTINCTROW 一起使用。那是不是說沒有使用上述那個修飾字的查詢,加上 SQL_SMALL_RESULT 並沒有效果呢?似乎並不是這樣,在 MySQL 講述 where 最佳化的的地方也有提到,假如使用 SQL_SMALL_RESULT,將會要求 MySQL使用記憶體臨時資料表( in-memory temporary table),所以,應該還是有效果的。至於何謂查詢結果小的定義,可能要看需求面而定。

Read Full Post »