Feeds:
文章
留言

Archive for 2005 年 9 月 28 日

VC利用組語存取陣列

研究好久,原來處理陣列還是有一些注意事項…
 
#include <iostream>
 
void displayArray(int* arr, int size){
 for(int i = 0; i<size; ++i)
  std::cout << arr[i] << std::endl;
}
// 利用 assembler 取得陣列資料
void displayArray_asm(int* arr, int size){
 for(int i = 0; i<size; ++i){
  int tmp;
  
  __asm{
   mov ebx, arr     ; 將 arr 記憶體位址放入 EBX
   mov ecx, i      ; 將索引值放路 ECX
   mov eax, [ebx][ecx * TYPE int] ; 取得指定索引陣列值, [ebx]表示arr記憶體的起始位置, [ecx * TYPE int] 表示陣列索引
   mov tmp, eax;     ; 將結果放入變數 tmp
  }
  std::cout << tmp << std::endl;  
 }
}
 
void main( void )
{
 int a[5]={10,20,30,40,50};
 std::cout << "init:" << std::endl;
 displayArray_asm(a, sizeof(a)/sizeof(a[0]));
 __asm{
  mov a[0 * TYPE int], -1 ;
  mov a[1 * TYPE int], -1 ;
  mov a[2 * TYPE int], -1 ;
  mov a[3 * TYPE int], -1 ;
  mov a[4 * TYPE int], -1 ;
 }

 
 std::cout << "after reset():" << std::endl;
 displayArray(a, sizeof(a)/sizeof(a[0])); 
 
 for(int idx = 0; idx<5; ++idx){
  __asm{
   mov ebx, idx
   mov ecx, idx
   mov a[ecx * TYPE int], ebx;
  }

 }
 std::cout << "after for:" << std::endl;
 displayArray_asm(a, sizeof(a)/sizeof(a[0])); 
 
 int tmp;
 __asm mov eax, a[2 * TYPE int];
 __asm mov tmp, eax;

 std::cout << "a[2] = " << tmp << std::endl;
}

Read Full Post »

上帝不是這麼容易當的…

 

新婚之夜,比爾對新娘發誓道:"親愛的,我會愛你一生一世,
如果我做了對你不忠之事,情願接受上帝的懲罰。"

婚後不久,他就做出了背叛妻子的事情,卻一直平平安安。終于有一天,他
在海上遇到了風暴,他記起了自己的誓言,忙跪在甲板上大聲祈禱:"上帝呀,
雖然我罪不可恕,但請您看在滿船其他無辜旅客的份上,暫且饒恕我吧!"

"什麼無辜!"空中傳來一個疲憊的聲音,

"你以為這些年來我在閒著?湊滿這一船人那麼容易嗎?"

 

不是不報,時候未到

Read Full Post »

因為組語的指令集不熟,所以,只簡單的用 add 指令為範例
 
#include <iostream>
// 將 a+b 運算結果放入 EAX 暫存器回傳
int add_EAX(int a, int b){
 _asm{
  mov eax, a;
  add eax, b;
 }
}
// 將 a+b 運算結果透過 return 回傳
int add_return(int a, int b){
 int c = 0;
 _asm{
  mov eax, a;
  add eax, b;  EAX = a+b
  mov c,eax;  c = EAX
  mov eax, 99;  這個步驟是多餘的,只是為了確認他是透過 EAX 或是 return 回傳
 }
 return c;
}
 
void main( void )
{
 std::cout << add_EAX(10, 20) << std::endl;     // 30
 std::cout << add_return(10, 30) << std::endl;  // 40             
}

Read Full Post »

VC 怎麼使用 Assembler

最近和好友 TTCH 在研究硬體控制的部份,剛好昨天找到 _asm 這各VC 保留字,應而知道VC內嵌assmebler 的方法,其實用法說來相當的簡單,如果是要寫一個區塊的組合語言就用
 
_asm {
  組合語言  
}
 
如果是要單一敘述,就使用
_asm mov eax, 3
 
也因為組語在工作上沒有什麼機會用到,也差不多忘光了,還好TTCH工作上有用到,適時給了我指點,所以,下面是一些針對資料型態的簡單測試:
 
#include <iostream>
#include <string>
// 將資料放入 EAX,呼叫端即可接收到資料
int getInt(int v){
 _asm{
  mov eax, v; 透過 EAX 將資料回傳
 }
}
long getLong(long v){
 _asm{
  mov eax, v; 透過 EAX 將資料回傳
 }
}
char* getString(const char* str){
 _asm{
  mov eax, str;
 }
}
void main( void )
{
 std::cout << getInt(10) << std::endl;   
 std::cout << getLong(99999L) << std::endl;   
         
 std::string str = "hello asm";
 std::cout << getString(str.c_str() ) << std::endl;              
}
 
已上簡單的範例一來是測試 Assembler 二來測試 eax 對於資料型態的支援。
 
使用內嵌組語有什麼好處呢?好處是可以提高程式速度、減少記憶體的使用量或硬體控制…等,但是相對的,因為組語是和硬體相依,因此開發出來的程式較不具可攜性。這些是使用時需要注意的。另外,目前 VC6.0 依據MSDN描述它只支援 Intel x86 相容的CPU 指令集。
 

Read Full Post »

毛里求斯南部的七色土

這是在毛里求斯南部的" 七色土"景區是世界上罕見的,
同時擁有七種不同顏色泥土的地區之一。
據地質學家分析,這些泥土是由火山噴發出來的,
經氧化後而變色,因腐蝕而形成一個個波浪紋的小山丘,
經太陽的照曬折射出不同顏色

Read Full Post »

唐崇榮線上講道

今天查資料 麥基 時,意外發現唐崇榮的講道,有興趣的可以點選下面的連結

Read Full Post »

今天遇到一個很奇怪的問題,程式碼如下:
<html>
<body>
<input type = ‘button’ value = ‘go’ onclick = "enterCourse(1, ‘1’);">
<a href="javascript:;" onclick="enterCourse(1,’1′);">click</a>
<form id = ‘frmQuery’ action = "index.php" method = "post">
 <input type="hidden" name="_class_name" id = ‘_class_name’ value="">
</form>
<script type = "text/javascript">
<!– //
 function enterCourse(n,m){
  alert("Entercourse(n,m)");
  var frmQuery = document.getElementById(‘frmQuery’);
  var fldcname = document.getElementById(‘_class_name’);  
  fldcname.value = m;  
  alert(frmQuery);
  frmQuery.submit();
  alert(‘here’);
 }
//–>
</script>
</body>
</html>
當我點選按鈕可以正常的運作,但是我點選超連結雖然他也會呼叫 enterCourse,但是表單的資料卻不會送出,真是奇怪,後來同事告訴我再 enterCouese 後面加上 return false; 就可以了,修改後如下
<html>
<body>
<input type = ‘button’ value = ‘go’ onclick = "enterCourse(1, ‘1’);">
<a href="javascript:;" onclick="enterCourse(1,’1′); return false;">click</a>
<form id = ‘frmQuery’ action = "index.php" method = "post">
 <input type="hidden" name="_class_name" id = ‘_class_name’ value="">
</form>
<script type = "text/javascript">
<!– //
 function enterCourse(n,m){
  alert("Entercourse(n,m)");
  var frmQuery = document.getElementById(‘frmQuery’);
  var fldcname = document.getElementById(‘_class_name’);  
  fldcname.value = m;  
  alert(frmQuery);
  frmQuery.submit();
  alert(‘here’);
 }
//–>
</script>
</body>
</html>
真是奇怪這樣就可以運作了,如果改成 return true; 也無法運作,目前我還不知道真正的原因,我個人猜測是
<A> 處理程序 → onclick 處理程序 → enterCourse
所以,可能" <A> 處理程序"有重導超連結(href屬性),是否重導的依據就是接收到 true 或 false….

Read Full Post »

怎麼清除 shell history 呢

今天因為需要遠端登入客戶的系統進行除錯,因為 linux 環境實在不是很熟悉,所以,指令用的零零落落,且部分指令也連同密碼直接輸入,所以,為了避免有人從我的 shell history 中查找密碼,終於找到 history -c 來清除 history,不過不知道這樣是不是真的清除,但用 history 是看不到 shell history 是肯定的

Read Full Post »