1.關於[bx]
1)[bx]用來表示取寄存器bx中的值做爲偏移地址;
段地址保存在段寄存器ds中;
例如:將 2000:1000 處的數據保存到寄存器ax
mov ax,2000
mov ds,ax
mov bx,1000
mov ax,[bx]
2)指令inc
inc 爲自增指令;
例如:將寄存器bx中的值自增1
3)debug和masm對指令的不一樣處理
例如:想將1000:1處的值存入ax
在debug中代碼以下:
mov ax,1000
mov ds,ax
mov ax,[1]
這裏的 mov ax,[1]中的[1]表示偏移地址爲1,段地址取段寄存器ds中的值;
而用masm編譯時不會將[1]識別爲偏移地址,而是當作常量1;
也就是說masm將mov ax,[1] 看成mov ax,1 ,做用是將ax中的值設爲1;
爲了達到原來的目的,能夠用[bx];
代碼:
mov ax,1000
mov ds,ax
mov bx,1
mov ax,[bx]
若是必定要用常量表示偏移地址,須要顯式給出段寄存器
mov ax,1000
mov ds,ax
mov ax,ds:[1]
顯式給出段寄存器時,該段寄存器稱爲段前綴;
段前綴默認是ds:
也能夠用cs:、es、ss等代替;
4)段前綴的使用
例如:想要將 ffff:0~ffff:b中的數據複製到 20:0~20:b;
思路:
將偏移地址放入bx;
循環12次,每次bx中的值自增1,而且經過一箇中轉寄存器保存待複製數據;
但這樣涉及到一個問題:
數據的段地址默認保存在段寄存器ds中;
在每次複製中,須要設置兩次ds的值:ffff和20;
能夠利用其它段寄存器分別存放兩個段地址來解決這一問題,利用段前綴可指定段地址;
代碼:
assume cs:code
code segment
mov ax,ffff
mov ds,ax
mov ax,20
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
2.loop指令
loop指令用來作循環操做;
loop的執行分爲兩步:
1】寄存器cx中的值減1;
2】判斷cx中的值是否爲0,不爲0則跳轉到標號處,爲0則繼續向下執行;
指令格式爲:loop 標號;
標號是自定義的標記,用來標記特定指令的位置;
例如:計算2的3次方
assume cs:demo
demo segment
mov ax,2
mov cx,2
s: add ax,ax
loop s
mov ax,4c00h
int 21h
demo ends
end
3.loop和[bx]聯合使用
例如:要實現 ffff:0-ffff:b中的數據累加,並將結果存入寄存器dx;
分析:
1】每一個內存單元數據爲一個字節,而寄存器dx爲一個字,沒法直接計算;
2】若是用dx的低位dl則可能超出dl的容量,累加後的結果可能超出8位;
3】每個字節的最大值爲255,0-b有13個數,累加結果不會超過16位的25536,所以dx足夠能夠存放;
4】能夠用寄存器ax做爲中介來實現字節和字之間的轉換:將目標值存入al,ah設置爲0,而後將ax的值累加到dx中;
代碼:
assume cs:demo
code demo
mov ax,ffff
mov dx,ax
mov bx,0
mov dx,0
mov cx,12
s: mov ah,0
mov al,[bx]
add dx,ax
inc bx
loop s
mov ax,4c00h
int 21h
demo ends
end
4.安全空間
利用匯編指令直接向內存寫入數據時,可能這段內存中保存有系統或其它程序的代碼;
此時寫入操做可能引起錯誤;
由於操做系統管理內存資源,若是須要向內存中寫入數據時,要使用操做系統給咱們分配的空間,而不該該隨意指定內存地址;
在dos方式下,通常狀況0:200~0:2ff空間不會有系統或其它程序的數據,一般能夠直接使用該段空間;
爲了謹慎起見,也能夠用debug查詢該段空間,若是單元內容都是0則表示該段內存單元沒有被使用;