IF 判斷句是任何程式語言都有的文法,
組合語言好像不能說沒有,但是好像也有很多一般語言的語法滲入組合語言。
不過,可以用CMP和JMP來做到IF的效果。
IF (True 或 False)
True 做這裏
ELSE
做這裏。
換成組語
CMP
比較後的結果,如果是TRUE 就JMP到那一段位址,做那些事
如果是FALSE, 就JMP到另一段位址,做另外的事
而JUMP的種類還蠻多的。
CMP的語法:
試一下,和mov有點像,
08FA:0100 cmp 1,1
^ Error
08FA:0100 cmp 1,ax
^ Error
08FA:0100 cmp ax,1
08FA:0103
-------------------------------
一般初始時,暫存器為0,
測試一下,
-a 100
08FA:0100 cmp ax,0
08FA:0103 jz 150
08FA:0105 jnz 250
-t,IP=0103
-t, IP=0150
-t, IP=0151
所以 ax,0比較以後, ax是0,所以jz,可以解釋成等於Z(zero)就跳。
如果不信,可以反過來,
08FA:0100 cmp ax,0
08FA:0103 jnz 250
08FA:0107 jz 150
08FA:0109
-t , IP=0103
-t, IP=0107
-t,IP=0150
jb ,jae
測試一下
08FA:0100 cmp ax,2
08FA:0103 jae 200
08FA:0107 jb 150
08FA:0109
-t IP=0103
-t IP=0107
-t IP=0150
js,jns
08FA:0100 mov ax,-1
08FA:0103 jns 200
08FA:0107 js 150
08FA:0109
-t ,IP=0103
-t ,IP=0107
-t ,IP=0150
js 是有號(sign)就跳,所以沒有執行到的jns,是無號(no sign)就跳。
**小結:**筆者一路下來,試圖打造無痛學組語的環境。透過練習,把一些不適應的感覺慢慢降低。
練習的過程中,可以發現,電腦是很死板的,一個指令一個動作的細化程度,是用慣高階語言的程式員無法體會,試想,編譯過程中,正確的把常用的IF判斷式,按整數比較,有號數比較,字串比較,
翻成對應的JUMP,就是很鎖碎的過程,而最佳化是大家常常提到優化的名詞,如果從這些細化的
JUMP來分析,每種JUMP的指令常度是不太一樣的。用正確及最短的JUMP可以得到優化的效果。
CMP/JMP?......愈來愈有年紀後,現在對GMP比較熟一些些....
泰大...什麼都看不懂
sunallen提到:
泰大...什麼都看不懂
被發現了.....俺最厲害的就是不懂裝懂....
不像太陽大,不懂也說不懂,都讓人沒機會挑骨頭,吼~~~
泰大...我的意思是...我什麼都看不懂
不是說您啊...說錯話,我先飛
sunallen提到:
說錯話,我先飛
以後不用飛,在您的文中多來幾首新詩更是一兼二顧啦 ~~~~
ted99tw提到:
愈來愈有年紀後,現在對GMP比較熟一些些....
一直很想更通俗點來講解組語,
顯然,還是力有未逮。
應該會短吧,
比找工作來形容,
比較CMP A廠,B廠,
若是A與B好,就JUMP 跳到該收拾,
若是沒有,就跳到充實自己,等待下一個機會。
記憶體位址,就想成一列一列往下延伸的程式。
其實有時候Tim大自己悠遊地玩組語,小囉囉們自然而然也就跟著徜徉其中了,誰還計較通不通俗呢.....