[彙編語言]-第五章[bx]和loop指令

1- [bx]和內存單元的描述 [0]表示內存單元, 他的偏移地址爲0編程

  mov ax,[0] 將一個內存單元的內容送入到ax.這個內存單元的長度爲2字節(字單元),存放一個字,偏移地址爲0,段地址在ds中.oop

  mov al,[0] 將一個內存單元的內容送入到al,這個內存單元的長度爲1字節(字節單元),存放一個字節,偏移地址爲0,段地址在ds中.spa

  完整的描述一個內存單元,須要兩種信息:(1)內存單元地址(2)內存單元的長度(類型)debug

  mov ax,[bx] 將一個內存單元的內容送入到ax, 這個內存單元的長度爲2字節(字單元),存放一個字,偏移地址在bx中,段地址在ds中.code

  mov al,[bx] 將一個內存單元的內容送入到al, 這個內存單元的長度爲1字節(字節單元),存放一個字,偏移地址在bx中,段地址在ds中.對象

2- 咱們定義得描述性符號"()" 表示一個寄存器或一個內存單元中得內容.blog

  (ax) 表示ax中得內容,(al)表示al中得內容內存

  (20000H)表示內存20000H單元的內容,()中的內存單元的地址爲物理地址編譯器

  (ds)*16+(bx)asm

    ()中的元素能夠有三種類型

    1>寄存器名 (ax)

    2>段寄存器名(ds)

    3>內存單元的物理地址(一個20位數據) (20000H) ,((ds)*16+(bx))

      不正確的表示(1000H), (2000:0),((ds):1000H)

3- 約定符號idata表示常量

  mov ax,[idata]就表明mov ax,[1] mov ax,[2] mov ax,[3]等

  mov bx,idata 就表明 mov bx,1  mov bx,2  mov bx,3等

4- loop

  實現2^12 (N * 2 能夠用N + N實現)

 1 assume cs:code
 2 code segment
 3      mov ax, 2
 4      mov cx, 11
 5  s: add ax, ax
 6      loop s    ;(1) (cx) = (cx) -  1; (2)判斷(cx)不爲零則轉到s所標示的地址處執行.如爲0則執行下一條指令
 7      
 8      mov ax, 4c00H
 9      int 21h
10 code ends
11 end

 

計算ffff:0006單元中的數乘以3,結果存儲在dx中.

 1 assume cs:code
 2 code segment
 3     mov ax, 0ffffH ;大於9FFFH的十六進制數據,A000H,B000H,FFFEH,FFFFH在書寫時是以字母開頭的,而在彙編程序中, 數據不能以字母開頭.因此要在前面加0,如0FFFE
 4     mov ds, ax
 5     mov bx, 6H
 6     
 7     mov al, [bx]
 8     mov ah, 0
 9     
10     mov dx, 0
11     
12     mov cx, 3
13 s:add dx, ax
14     loop sa
15     
16     mov ax, 4c00H
17     int 21H
18 code ends
19 end
20     

 分析

(1) 運算後的結果是否會超出dx所能存儲的範圍

  ffff:0006存儲的是一個字節型的數據,範圍0-255之間,則用它乘以3結果不會大於65535,能夠在dx中放下

(2) 咱們循環累加實現乘法, 用哪一個寄存器進行累加

  咱們將ffff:0006單元中的數據賦值給ax, 用dx進行累加.先設(dx) = 0 ,而後作3次 (dx) = (dx) + (ax).

(3) ffff:6是一個字節單元,ax是一個16位寄存器,數據長度不同,如何賦值?

  賦值:是要求ffff:0006單元中得數據,與ax中得數據值相等. 如 8位數據 06H 和 16位的 0006H 的數據長度不同,可是值是相等的.

  (al) = (ffff6H)

  (ah) = 0

5- Debug和彙編編譯器Masm對指令的不一樣處理

  Debug指令:

  mov ax,[0] 將ds:0處的數據送入ax中

  

  彙編編譯器指令:

  mov ax,[0] 被編譯器當作指令 mov ax,0   

 1 assume cs:code
 2 code segment
 3     mov ax,1000
 4     mov ds,ax
 5     mov ax,[0]
 6     
 7     mov ax,4c00H
 8     int 21h
 9 code ends
10 end

 

  

那麼如何實現內存2000:0, 2000:1, 2000:2, 2000:3單元中得數據,送入al, bl, cl, dl中?

(1) 目前的方法是將偏移地址送入bx寄存器中,用[bx]方式訪問內存單元. 訪問 2000:0內存單元

mov ax,2000H

mov ds,ax

mov bx,0

mov al,[bx]

(2) 這樣作是能夠,可是比較麻煩,但願像debug中[]訪問內存.只須要在"[]"前面顯示的給出段地址所在的寄存器.

mov ax,2000H

mov ds,ax,

mov al,ds:[0]

 

比較下彙編程序中如下指令的含義:

mov ax,[0]    (ax) = 0

mov al,ds:[0]    (al) = ( (ds) * 16 + 0 )

mov al,[bx]     (al) = ( (ds) * 16  + (bx) )

mov al,ds:[bx]      (al) = ( (ds) *16 + (bx) ) 與 mov al,[bx]相同

 

6- loop和[bx]的聯合應用

計算ffff:0-ffff:b單元中的數據和,結果存儲到dx中.

分析:

(1) 運算後的結果是否超出dx的範圍

  ffff:0-ffff:b單元中得範圍爲0-255 12個這樣的數相加不能超過65535,能夠在dx中存放下

(2) 是否將ffff:0-ffff:b中得數據直接累加到dx中

  固然不行,由於ffff:0-ffff:b中得數據是8位的,不能直接加到16位的寄存器中

(3) 可否將ffff:0-ffff:b中得數據累加到dl中, 並設置(dl)=0, 從而實現累加到dx中.

  不行,由於dl是8位寄存器,能容納的數據範圍0-255,ffff:0-ffff:b中得數據也是8位,若是向dl中累加12個8位的數據,極可能形成進位丟失

(4)到底怎樣才能將ffff:0-ffff:b中的8位數據,累加到16位寄存器dx中

  在作累加時有兩種方法

  (dx) = (dx) + 內存中得8位數據  //運算對象的類型不匹配

  (dl) = (dl) + 內存中得8位數據    //結果有可能超界

  咱們用16位的寄存器來作中介,將內存中8位數據,賦值到一個16位的寄存器ax中, 再將ax中得數據累加到dx中.從而使兩運算對象的類型匹配而且結果不會超界

相關文章
相關標籤/搜索