[bx]和loop指令

mov ax , [0]  將一個內存單元的內容送入 ax , 這個內存單元的長度爲 2字節字單元);
mov al , [0]   將一個內存單元的內容送入 al  , 這個內存單元的長度爲 1字節字節單元);
一、[bx]  也表示一個內存單元,它的偏移地址在 bx 中;
mov ax , [bx]   ; 將一個內存單元的內容送入 ax , 這個內存單元的長度爲 2字節(字單元),存放一個字,偏移地址在 bx 中,段地址在 ds 中。
mov al , [bx]   ; 將一個內存單元的內容送入 ax , 這個內存單元的長度爲 1字節(字節單元),存放一個字節,偏移地址在 bx 中,段地址在 ds 中。

二、loop
循環

三、描述性的符號「()」
「()」表示一個寄存器或一個內存單元中的內容。
(ax)表示 ax 中的內容、(al)表示 al 中的內容;

四、約定符號 idata 表示常量
eg:mov ax , [idata]  表明 mov ax , [1] 、mov ax , [2] 、mov ax , [3] ...
mov bx , idata 
mov ds , idata  非法指令

SA--Segment Address 段地址
EA--Effective Address  有效地址

Loop 指令:loop   標號
①、(cx)=(cx)-1;   cx 中存放循環次數
②、判斷 cx 中的值,不爲零則轉至標號處執行程序,若是爲零則向下執行。

計算2^12次方
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
mov ax , 2000h        ; 將 ds:bx 單元中的數據送入 al
mov ds , ax
mov bx , 0
mov al , [bx]        ;將 2000h:0 處的值到al中
\ mov al , [0]  在debug中和上面做用同樣,masm中就是把0放到al中


mov al , ds:[0]       ; [0] 前顯示給出段地址所在寄存器

注意:masm 中,對 [idata] 解釋成 「idata」; 在 debug 中解釋成「[idata]」是一個內存單元,idata 是內存單元的偏移地址;
因此要在源程序中實現將內存 2000:0、2000:1 ... 這樣的單元數據送入寄存器,目前的方法就是將偏移地址送入 bx 寄存器中,用 [bx] 的方式來訪問內存單元。

若是要向 debug 中那樣顯示的接用 [idata] 給出內存單元,就要在 [idata] 前給出段地址所在的段寄存器。

要將字節單元(8位)數據累加到一個16位寄存器的方法,先把這個8位數據放到一個16位寄存器的低8位,高8位置0,最後在累加到16位的寄存器。
mov ax , ffffh
mov ds , ax 
mov dx , 0            ; 初始化累加器
mov al , ds:[0]      ; 8位字節單元數據放到ax的低8位
mov ah , 0           ;高8位置0
add dx , ax

在 8086 模式中,不能隨意向一段內存空間寫入內容,由於可能那段段空間中存放着重要的系統數據或代碼。

編程的時候通常用 0:200~0:300 這段 256 個字節的空間。若是要使用其餘的空間,要先看一下這段空間的數據是否是都爲0
將內存 ffff:0~ffff:b 單元中的數據拷貝到 0:200~0:20b 單元中:
assume cs:code
code segment
     mov bx , 0
     mov cx , 12
s:   mov ax , ffffh
     mov ds , ax
     mov dl , [bx]
     mov ax , 0020h
     mov ds , ax
     mov [bx] , dl
     inc bx 
     loop s
     mov ax , 4c00h
     int 21h
code ends
end

最直接的作法,可是每次都兩次設置 ds
改進:
assume cs:code
code segment
    mov ax , ffffh
    mov ds , ax
    mov ax , 0020
    mov es , ax      ;用附加段寄存器存放另外一個段地址
    mov bx , 0 
    mov cx , 12
s:  mov dl , [bx]
    mov es:[bx] , dl
    inc bx
    loop s
    mov ax , 4c00h
    int 21h
code ends
end

masm 編譯器[idata]以前要顯示給出段地址所在寄存器
相關文章
相關標籤/搜索