線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1499
推到 Plurk!
推到 Facebook!

嘆為觀止的程式技巧...

答題得分者是:ddy
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-25 14:45:23 IP:140.135.xxx.xxx 未訂閱
大家好:  因為小弟程式經驗尚嫩, 所以想請問大家還有哪些[漂亮]的程式?  還有怎麼知道的壓? class="code"> a^=b,b^=a,a^=b; 或是 a = a b, b = a - b, a = a - b; http://delphi.ktop.com.tw/topic.php?TOPIC_ID=26905 謝謝大家,順心 發表人 -
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-25 16:49:37 IP:61.30.xxx.xxx 未訂閱
還真的是沒想過這樣寫
jason_cyl329
高階會員


發表:123
回覆:155
積分:105
註冊:2003-05-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-25 17:46:45 IP:61.218.xxx.xxx 未訂閱
a = a*b;b = a/b;a = a/b;
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-25 18:00:23 IP:61.218.xxx.xxx 未訂閱
a = a + b, b = a - b, a = a - b; 這樣的觀念是早期在學組合時學到的 為要交換二個暫存器的值又不希望動到其它暫存器或是指令時脈考量吧 或許這樣的技巧可以讓機器碼少一些…所以速度會快一點吧 但是以目前的程式設計來看…這樣的程式反而可讀性低    其實蠻多程式開發不為人知的小技巧…多半是源由DOS 時代或是低階的觀念 像我們對於"轉向"的觀念 ping www.google.com > ping.txt 或是對標準終端機的觀念  copy con a.txt--->copy 控制台(輸入)到檔案(輸出) 就可以由鍵盤輸入文字以 ^Z (Ctrl+Z)存檔 copy a.txt con--->copy 檔案(輸入)到控制台(輸出) 就可以在營幕上顯示檔案內容    ……等等之類的,有蠻多都還可以運用在windows程式開發上 所以…誰說老掉牙的DOS 沒有用呢? 多少還有些殘餘價值 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-25 18:06:31 IP:61.218.xxx.xxx 未訂閱
引言:a = a*b;b = a/b;a = a/b;
jason_cyl329 兄這個例子舉得不好 若 a =0 結果如何??都是0 b =0 就會有除以零的系統錯誤 而且…數值一大…很容易就會超過數值的範圍 此法必須為可逆的運算才不會出錯 像是 XOR ,+ - > >最後 > < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
jason_cyl329
高階會員


發表:123
回覆:155
積分:105
註冊:2003-05-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-26 09:34:06 IP:61.218.xxx.xxx 未訂閱
感謝ddy兄的指教,不然我還沒有注意到!!
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-26 14:48:02 IP:140.135.xxx.xxx 未訂閱
引言: taishyang 不好意思啦…不是我要吐槽 a^=b,b^=a,a^=b;不但有0 的問題,也會愈算也大最後a不是原來的a,b也不是原來的b了
我有先說我很嫩的< >,而且原作者不是我< > 我主要的目的是想知道還有沒有類似這樣[神奇]的程式呢 謝謝大家熱烈的回應
dan59314
中階會員


發表:121
回覆:107
積分:86
註冊:2002-08-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-12-03 14:26:39 IP:211.23.xxx.xxx 未訂閱
插個花
void SwapAB_ASM(int *a, int *b)
{
    asm
  {   
    push EBX
    mov EAX,[EDX]
    mov EBX,[ECX]        mov [ECX],EAX
    mov [EDX],EBX        pop EBX  
  }
}
軟還要更軟,我的Artwork http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27674 Chinese Girl in Rhino3D http://rhino3d.com/gallery/figure/girl.htm 發表人 - taishyang 於 2003/12/03 15:50:56
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-12-03 15:53:11 IP:140.135.xxx.xxx 未訂閱
fy您好:  您的花插的真是漂亮< > 謝謝您的分享 < > 順心
GaryKao99
中階會員


發表:46
回覆:102
積分:54
註冊:2002-08-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-12-09 10:03:01 IP:218.32.xxx.xxx 未訂閱
插個花
引言:
void SwapAB_ASM(int *a, int *b)
{
    asm
  {   
    push EBX
    mov EAX,[EDX]
    mov EBX,[ECX]        mov [ECX],EAX
    mov [EDX],EBX        pop EBX  
  }
}
請問一下 如何知道 a與b是放在哪一個暫存器中? 發表人 - garykao99 於 2003/12/09 10:07:04
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-12-09 10:47:41 IP:61.218.xxx.xxx 未訂閱
引言:請問一下 如何知道 a與b是放在哪一個暫存器中?
看CPU 視窗就知道了 lea edx,[ebp-$08] lea eax,[ebp-$04] >< face="Verdana, Arial, Helvetica">引言:
void SwapAB_ASM(int *a, int *b)
{
    asm
  {   
    push EBX
    mov EAX,[EDX]
    mov EBX,[ECX]
    mov [ECX],EAX
    mov [EDX],EBX
    pop EBX  
  }
}
經執行,有一些些問題,可能是fy兄的筆誤,所以執行結果不正確 參數傳進是[EDX][EAX],修改如下
void SwapAB_ASM(int *a, int *b)
{
    asm
  {   
        push ebx
        mov ecx,[edx]
        mov ebx,[eax]
        mov [edx],ebx
        mov [eax],ecx
        pop ebx
    }
}
事實上,上面的和下面這段是完全一樣的(從CPU 視窗可得知)
void SwapAB_ASM(int *a, int *b)
{
   int c;
   c=b;
   b=a;
   a=c;
}
再補充另一方法,利用堆疊 ( class="code"> void SwapAB_ASM(int *a, int *b) { asm { push [edx] push [eax] pop [edx] pop [eax] } } < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
stevenchiou
一般會員


發表:11
回覆:10
積分:4
註冊:2003-09-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-12-09 10:51:00 IP:61.220.xxx.xxx 未訂閱
引言:
引言: taishyang 不好意思啦…不是我要吐槽 a^=b,b^=a,a^=b;不但有0 的問題,也會愈算也大最後a不是原來的a,b也不是原來的b了
我有先說我很嫩的< >,而且原作者不是我< > 我主要的目的是想知道還有沒有類似這樣[神奇]的程式呢 謝謝大家熱烈的回應 < face="Verdana, Arial, Helvetica"> 不好意思,我更嫩^^" 請問a^=b,b^=a,a^=b;會有0的問題嗎? 我剛才試了一下a,b其中一值為0或二者都為0,結果都是對的.
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-12-09 11:36:27 IP:61.218.xxx.xxx 未訂閱
引言: 不好意思,我更嫩^^" 請問a^=b,b^=a,a^=b;會有0的問題嗎? 我剛才試了一下a,b其中一值為0或二者都為0,結果都是對的.
我更嫩< > > 程式語言錯亂症< > < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-12-10 00:15:43 IP:210.201.xxx.xxx 未訂閱
看到 fy 的組語用到 push/pop 就想到直接由 stack 交換即可,沒想到 ddy 就已 post 了。我與 ddy 的想法相同,程式要別人容易看懂,這樣才有價值,否則,沒人看懂的程式,即使效能再好,也沒有用,非除功能已臻完美,日後完全不需要再修改(應該沒有這樣的程式吧...),只要需要修改,用了太多自已都看不太懂的技巧,日後可能連自己要維護都有問題,到頭來,還是得重寫,何必呢?現在的 Compiler 效能也不差,如 ddy 已舉出實例,fy 所寫,看似最佳的組語,用 C 去寫出來,也可以得到一樣的機器碼。這些「嘆為觀止」的程式技巧,對我來說還是「觀止」看看就好 < > 哈哈!我也很嫩 < > 最近流行比嫩嗎? <>沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-12-10 00:28:04 IP:140.135.xxx.xxx 未訂閱
真是感謝大家熱烈的回應< >< > 因為很難想像當初怎麼會人想到這樣的方式,實在是很驚訝< > 更何況是像我這樣經驗不足的人若是沒看到,這輩子怎麼可能想的到< > 就年紀與經驗上我的確是最嫩的< > 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~
GaryKao99
中階會員


發表:46
回覆:102
積分:54
註冊:2002-08-23

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-12-11 10:24:27 IP:211.23.xxx.xxx 未訂閱
嗯....感謝各位大大的見解    原來是要用CPU視窗去看組合語言使用的情況, 再進而寫成程式碼 嗯嗯....    小弟試了一下
   void SwapAB_ASM(int &a, int &b)
   {
   int c;
   c=b;
   b=a;
   a=c;
   } 
請問 move eax, [ecx] move [eax], ecx 有加中括弧的意義為何 / 問題多多
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-12-11 21:58:57 IP:210.68.xxx.xxx 未訂閱
引言: mov eax, [ecx] mov [eax], ecx
設 ecx = 10000 ,這個指的是 address [ecx] 就是取出 10000 這個address裡面的值 想想 c++ 的指標運算…就能理解了 例: > < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
GaryKao99
中階會員


發表:46
回覆:102
積分:54
註冊:2002-08-23

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-12-15 13:54:39 IP:218.32.xxx.xxx 未訂閱
ㄛ....我了解了 感謝 ddy 大大
kung
一般會員


發表:4
回覆:8
積分:2
註冊:2003-11-04

發送簡訊給我
#19 引用回覆 回覆 發表時間:2003-12-18 13:52:17 IP:211.76.xxx.xxx 未訂閱
引言: 原來是要用CPU視窗去看組合語言使用的情況, 再進而寫成程式碼 嗯嗯....
呵.......< >< > 請問各位前輩,BCB的CPU視窗要如何叫出? 哪兒有操作方法?< >< > 謝謝!!
GaryKao99
中階會員


發表:46
回覆:102
積分:54
註冊:2002-08-23

發送簡訊給我
#20 引用回覆 回覆 發表時間:2003-12-18 18:04:31 IP:202.145.xxx.xxx 未訂閱
引言: 呵.......< >< > 請問各位前輩,BCB的CPU視窗要如何叫出? 哪兒有操作方法?< >< > 謝謝!!
當程式執行時,在BCB中 View->Debug Window->CPU
系統時間:2024-05-18 5:11:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!