Feeds:
文章
迴響

Archive for 2005 年 09 月

字串反轉

#include <iostream>
void main(void){
 const char str[] = "ArickLoveMavis";
 //int len = strlen2(str);
 std::cout << str << std::endl;
 _asm{
  mov  ebx, 0      ; iterator
for: 
  mov  al, str[ebx]     ;
  push al
  inc  ebx       ;
  cmp  al, 0      ;
  jnz  for
  pop  eax
  dec  ebx
  mov  ecx,0
for2: 
  pop  eax
  mov  str[ecx], al
  inc  ecx
  dec  ebx       ;
  cmp  ebx, 0      ;
  jnz  for2
 }
 std::cout << str << std::endl;
}

Read Full Post »

組語模擬 strlen 函數

雖然今天對於工作上有點不太愉快的事情發生,不過還是不會影響我最近研究組語的熱情,今天寫了一個模擬計算字串長度的函數,如下:
 
#include <string>
#include <iostream>
 
int strlen2(const char* pstr){ 
  __asm{ 
  mov ebx, 0               ; iterator
for: 
  mov edx, pstr;
  mov al, [edx][ebx]     ;
  inc ebx                     ;
  cmp al, 0                  ;
  jnz for
  mov eax, ebx            ;

  }
}
void main(void){
  const char str[] = "Hello Arick";
  std::string hello(str);
  const char* pstr = str;
  std::cout << strlen( hello.c_str() ) << ","
    << strlen2( hello.c_str() )
    << std::endl;
  std::cout << strlen( str ) << ","
    << strlen2( str )
    << std::endl;
  std::cout << strlen( str ) << ","
    << strlen2( pstr )
    << std::endl;
}
 
 

Read Full Post »

組語 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 »

Older Posts »