彙編語言第三版(王爽著)(第五章.[BX]和loop指令)

小小的引導

1.[bx]表示一個內存單元,它的偏移地址在bx中。例如
mov ax,[bx] 表示:將一個內存單元中的內容送入ax,這個內存單元的長度爲2個字節,存放一個字,偏移地址在bx中,段地址在ds中。
2. loop 循環
3. 描述性的符號()表示一個寄存器或者一個內存單元中的內容
(ax)表示ax中的內容、(al)表示al中的內容,(20000h)表示20000h單元中的內容(()中的內存單元的地址爲物理地址)
在這裏插入圖片描述
4.約定idata表示常量

mov ax,idata 就代表mov ax,[1]、mov ax,[2],…這些都是非法指令

5.1 [BX]

mov ax,[bx] '加入bx中存放偏移地址EA,段地址爲SA。則
(ax) = ((SA)*16+EA)
inc bx 代表bx+1
dec 代表-1

5.2 loop指令

loop指令執行的時候要進行兩步操作
1.(cx) = (cx)-1
2.判斷cx中的值,不爲零就轉到標號處執行程序,如果爲零則向下執行。

assume cs:codesg

codesg segment

mov ax,2
cx = 11
s:add ax,ax
loop s

mov ax 004ch
int 21h
codesg ends
end

5.3在debug中跟蹤用loop指令實現的循環指令

考慮這樣一個問題,計算ffff:0006單元中的數*3,結果存儲在dx中
分析:
1.運算的結果會不會超過存儲範圍
該單元中的數是一個字節型數據,範圍0-255,*3不會大於65535.
2.將該單元中的值賦給ax,用dx進行累加。設(dx) = 0,然後做3次(dx) = (dx)+(ax)
3.ax是16位,該單元中是八位。
設該單元中的數據是xxH,要ax中的值和該單元中的值一樣,則應該是00XXH.
要實現ax中賦值,則設置(ah) = 0,(al) = (ffff6H)
assume cs:code

code segment
mov ax,0ffffh
mov ds,ax
mov bx,6

mov al,[bx]
mov ah,0

mov dx,0
mov cx,3

s:mov dx,ax
loop s
mov ax,4c00h
int 21h
code ends
end

1.注意:在彙編語言中,數據不能以字母開頭,所以在前面加0
直接用g命令,“g 0012”表示 將使Debug從當前的CS:IP指向的指令執行,一直執行到(IP)=0012h爲止。
遇到loop指令,用p 命令,可以自動重複執行循環。直到(cx) = 0。

5.4Debug 和 彙編編譯器 masm對指令的不同處理

1.在Debug中,mov ax,[0]
表示將ds:0處的數據送入ax中。
在masm中,mov ax,[0]表示 mov ax,0
解決方案:可將偏移地址送入bx寄存器中,用[bx]的方式來訪問內存單元
mov bx,0
mov al,[bx]
但是這樣太麻煩了
可以寫成這樣:mov al,ds:[0]

5.5 loop和[bx] 的聯合應用

問題引出:計算ffff:0~ffff:b單元中的數據的和,結果存儲在dx中
主要考慮兩個問題:一個是類型的匹配和結果的不超界
ffff:0~ffff:b單元中的數據的和不超過12*255 = 65535,可以存在dx中
但是不能直接累加,因爲字節型(8位)的數據不能直接累加在16位的寄存器中
也不能直接累加在dl中,因爲兩個都是8位,很有可能造成進位丟失
解決方法:將內存單元中的8位數據賦值到一個16位寄存器ax中,再將ax中的數據加到dx上,從而使兩個運算對象的類型匹配並且結果不會超界。

5.6 段前綴

用於顯示地指明內存單元的段地址。

5.7 一段安全的空間

在內存中寫入內容時,我們要確定這段內存空間不應存放系統或其他程序的數據或代碼,否則寫入操作很可能引發錯誤。
DOS方式下,一般情況,0:200~0:2ff空間中沒有系統或其他程序的數據或代碼。

5.8 段前綴的使用

考慮一個問題,將內存ffff:0~ffff:b單元中的數據複製到0:200-0:20b單元中
分析:
1.0:200-0:20b單元等同於0020:0-0020:b單元。
2.簡要描述如下:
X=0
循環12次
將ffff:X單元中的數據送入0020:X.需要一個寄存器中轉
X=X+1
3.X是變量,我們用bx來存放。
4.0:200-0:20b單元等同於0020:0-0020:b單元。就是爲了使目標單元的偏移地址和原始偏移地址單元的偏移地址從同一數值開始。

assume cs:code
code segment
	mov bx,0
	mov ax,0ffffh
	mov ds,ax
	mov ax,0200h
	mov es,ax
	mov cx,12
  s:mov dl,[bx]
    mov es:[bx],dl
    inc bx
    loop s
    mov ax,4c00h
    int 21h
code ends
end

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章