幾個簡單的彙編初學者問題總結

來源:互聯網
上載者:User

幾個簡單的彙編初學者問題總結 

 網上哪位前輩的作品,小生這裡借用了,不要見怪哦,*^_^*!

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)

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.