彙編基礎-實例分析

一、[BX]和loop指令
   直接來解釋下這兩個指令吧!我們知道[0]可以表示偏移量爲0的內存單元(段地址存在CS裏),[BX}則提供了更爲靈活的方式,即mov ax, [bx]的功能是寄存器bx中存放的數據作爲一個便宜地址EA,段地址SA默認在ds中,將SA:EA處的數據送入ax中,即(ax)=((ds)*16+(bx)),()表示寄存器中的值。實際上,[]就表示一個內存單元,其中的數值或寄存器則表示了偏移量的來源
   loop指令是循環指令,格式是loop 標號。當CPU執行loop命令時需要執行兩步操作:1)(cx) = (cx)-1; 2) 判斷cx中的值,不爲零時則轉至標號處執行循環體語句。比如程序:

    assume cs:code

    code segment

           mov ax, 2

           mov cx, 11

    s: add ax, ax

          loop s

          mov ax, 4c00h

          int 21h

    code ends

    end

二、and與or指令
   and指令即邏輯按位與操作,利用此操作可以將操作對象的相應位設爲0,其他位不變:

    mov al, 01100011B

    and al, 00111011B

    al = 00100011B  //執行後

or指令即邏輯按位或操作,利用此操作可以將操作對象的相應位設爲1,其他位不變:

    mov al, 01100011B

    or al, 00111011B

    al = 01111011B

除了[A-D]X的四個通用寄存器之外,還有與bx功能相近的兩個寄存器:si與di,si與di不能夠分成兩個8位寄存器來使用,其餘功能類似,比如:

    mov bx, 0

    mov ax, [bx]


    mov si, 0

    mov ax, [si]

下面的語句功能也是一樣的:

    mov bx, 0

    mov ax, [bx+123]


    mov si, 0

    mov ax, [si+123]


    mov di, 0

    mov ax, [di+123]

    mov di, 0

    mov ax, [di]

三、轉移指令
   可以修改IP,或同時修改CS和IP的指令統稱爲轉移指令。8086CPU的轉移行爲有兩類:
-1. 只修改IP,稱爲段內轉移,如:jmp ax;
-2. 同時修改CS和IP,稱爲段外轉移,如:jmp 1000:0;
   至於call和ret指令,其實也是轉移指令,從執行效果上看:
-1. CPU執行ret指令時,相當於進行:pop IP;
-2. CPU執行retf指令時,相當於進行:pop IP; pop CS;
   當CPU執行call指令時,進行兩步操作:
-1* 將當前的IP或CS和IP一起壓入棧中;
-2* 轉移

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章