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中.從而使兩運算對象的類型匹配而且結果不會超界