[原創]匯編初學者問題合集
上次有兄弟問關於 指令時間的問題,答複查看 intel 手冊是一個辦法。
但很多人沒有那個東東吧!,所以可以用另一招,在編譯時加入 /Sc
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
retf
code ends
end start
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 個時鍾周期。
***************************
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。
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)
(masm611下載地址: www.aogosoft.com,masm32下載地址
最後更新:2017-04-02 00:06:21