嘆為觀止的程式技巧... |
答題得分者是:ddy
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
大家好:
因為小弟程式經驗尚嫩, 所以想請問大家還有哪些[漂亮]的程式?
還有怎麼知道的壓?
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 發送簡訊給我 |
|
jason_cyl329
高階會員 發表:123 回覆:155 積分:105 註冊:2003-05-26 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
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 發送簡訊給我 |
|
jason_cyl329
高階會員 發表:123 回覆:155 積分:105 註冊:2003-05-26 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
dan59314
中階會員 發表:121 回覆:107 積分:86 註冊:2002-08-16 發送簡訊給我 |
插個花
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 發送簡訊給我 |
|
GaryKao99
中階會員 發表:46 回覆:102 積分:54 註冊:2002-08-23 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
引言:請問一下 如何知道 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 發送簡訊給我 |
引言:引言: 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 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
看到 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 發送簡訊給我 |
|
GaryKao99
中階會員 發表:46 回覆:102 積分:54 註冊:2002-08-23 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
|
GaryKao99
中階會員 發表:46 回覆:102 積分:54 註冊:2002-08-23 發送簡訊給我 |
|
kung
一般會員 發表:4 回覆:8 積分:2 註冊:2003-11-04 發送簡訊給我 |
|
GaryKao99
中階會員 發表:46 回覆:102 積分:54 註冊:2002-08-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |