閱讀453 返回首頁    go 阿裏雲 go 技術社區[雲棲]


[原創]匯編初學者問題合集

 

 

 

上次有兄弟問關於 指令時間的問題,答複查看 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下載地址

   www.masm32.com)

最後更新:2017-04-02 00:06:21

  上一篇:go 可重用的 Hsqldb 啟動、停止之 Ant 任務腳手架
  下一篇:go [原創]和DriverStudio過不去之加強版:)