幾個簡單的彙編初學者問題總結
網上哪位前輩的作品,小生這裡借用了,不要見怪哦,*^_^*!
0 關於指令時間的問題
上次有兄弟問關於 指令時間的問題,回覆查看 intel 手冊是一個辦法。
但很多人沒有那個東東吧!,所以可以用另一招,在編譯時間加入 /Sc
選項:
ML /Fl /Sc Kinds.asm
還有有位兄弟問過 為什麼 mov ax,offset table 比 lea ax,table 速度
要快?但到底快到什麼程度,恐怕也沒法感性認識。下面讓偶們來
看看實際效果:
首先在源檔案 Kinds.asm 中敲入:
data segment
tabledw?
data ends
code segment
assume cs:code,ds:data
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,offset table
lea ax,table
idiv table
retf
code ends
end start
儲存後,控制台中敲入:
ML /Fl /Sc Kinds.asm
完成後,在同一目錄下用記事本開啟 Kinds.lst 檔案:
0000 datasegment
0000 0000 tabledw?
0002 dataends
0000 codesegment
assume cs:code,ds:data
0000start:
0000 10 1Epushds
0001 3 2B C0 subax,ax
0003 11 50 pushax
0004 4 B8 ---- Rmovax,data
0007 2 8E D8 movds,ax
0009 4 B8 0000 Rmovax,offset table
000C 8 8D 06 0000 R leaax,table
0010 177+ F7 3E 0000 R idivtable
0014 26 CB retf
0015 codeends
endstart
可以清楚地看到 :
mov ds,ax 只需要 2個刻度
mov ax,offset table 需要 4個
lea ax,table 則需要 8 個
而 idiv table 更是誇張的用到了超過 177 個刻度。
是不是一目瞭然呢?呵呵!
1 debug中使用sal指令的問題
[問題]
在debug裡面使用A指令,輸入如下代碼:
***************************
MOV AX,0ABC
DEC AX
AND AX,00FFH
MOV CL,4
SAL AL,1
***************************
當輸入到 sal al,1 時提示error
[回答]
shl 與 sal 作用是完全一樣的,所以在編譯的時候自動將
sal 轉換成了 shl .使用sal dubug 不識別,換成shl就搞定了。
可以把上述代碼編譯成 EXE 檔案,然後用debug 中 u 指令查看,
結果 sal 的地方 被換成 shl。
2 看似 ''不可能'' 的彙編問題
[問題]
怎樣用一條指令把BX的內容加上123,放在AX裡?
[回答]
猛一看起來好像不可能,通常的做法是:
add bx,123
mov ax,bx
這至少要用到兩條指令~~~要是mips機構的系統就好了,因為其中有
3參數指令:
addx $1,$2,100 ----- $1=$2+100
那麼沒辦法了嗎?不是的!
想一下 lea 指令 ,呵呵~~~看一下如下的指令:
lea ax,[bx+123]
lea 取變數的位移放入 ax 中,[] 代表變數是間接定址,他的地址就等於[]
中的值,即 bx+123,這樣就達到了題目的目的。
3 用移位指令來代替乘法指令
大家都知道可以用移位指令來做形如 2,4,8 等2的整次冪的乘法,
但是非整次冪呢?比如 乘10。其實很簡單:
36 * 10 = 36 * (8 + 2) = 36 * 8 + 36 * 2
即等於:
24h * 8 + 24h * 2
接下來不用我講了吧,這一方法也可以進一步推廣。
4 察看 debug 狀態寄存器
of(溢出) df(方向) if(中斷) sf(符號) zf(零) af(輔助進位) pf(奇偶) cf(進位)
為一的時候
ov(OVerflow) dn(DowN) ei(Enable Interrupt) ng(NeGtive) zr(ZeRo) ac(Auxiliary Carry) pe(Parity Even) cy(CarrY)
為零的時候
nv(Not oVerflow) up(UP) di(DIsable interrupt) pl(PLus) nz(Not Zero) na(Not Auxiliary) po(Parity Odd) nc(Not Carry)
5 關於簡單彙編環境的搭建
如果是老鳥,則隨心所欲自由選擇。我在這裡只是給新手一些我的建議。
我一向反對新手一上來(毫無彙編編譯經驗)就使用彙編的整合式開發環境比如
radasm之類,這樣不但容易出錯,而且不能真正瞭解編譯器和連接器的底
層命令列用法。因為彙編本身編譯就已經很簡單了,不像C++之類有那麼多
最佳化的東東,你再套一個花裡胡哨的Integration Environment,對初學者豈不很累?
但我認為用一個帶顏色標記的編輯器卻是有必要的。
(比如簡單的幾句用記事本就很好,複雜的我推薦使用editplus2(別忘了要
下載彙編的文法檔案。)
總的來說整個彙編環境是這樣的:
16位dos程式: masm6.1x or nasm + editplus2
32位windows程式: masm32v9.0 or nasm + editplus2 + 一個資源編輯器
(masm611: www.aogosoft.com,masm32
www.masm32.com)