[bx]和loop

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
inc bx
 
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則表示該段內存單元沒有被使用;
相關文章
相關標籤/搜索