5.1[bx]
- [bx]是什麼?
- 實際上debug的文法和masm編譯的文法是不一樣的
- 如果直接使用 mov ax, [0] 是不行的,編譯器會把它看做 mov ax, 0
- 需要使用bx, 比如 mov bx, 0, mov ax, [bx]的形式
- mov ax, [bx]
- 功能:将bx中存在的資料作為一個偏移位址EA,段位址SA預設在ds中, 将SA:EA處的資料送入ax中
-
mov ax, 2000H mov ds, ax mov bx, 1000H mov ax, [bx] inc bx inc bx mov [bx], ax inc bx inc bx mov [bx], ax inc bx mov [bx], al inc bx mov [bx], al
- 記憶體中的情況
- 2000:1000 = BE
- 2000:1001 = 00
- 上述程式分析:
-
先看一下前三條指令
mov ax, 2000H
Mov ds, ax
Mov bx, 1000H
- 三條指令執行後:
ds=2000 bx=1000
- 三條指令執行後:
- 再看第四條指令:
- 将記憶體中2000:1000處的字型資料送入ax中, 結果ax=00be
- inc bx inc bx, inc 表單自增, 執行後bx=1002
- mov [bx], ax
- 将ax中的值送入 ds:bx=2000:1002中
- ax == 00be,
5.2 Loop指令
-
- (x)的應用,比如:
- ax中的内容為0010, 我們可以用這樣描述:(ax)= 0010
- 2000:1000 處的内容為0010, 我們可以這樣來描述(21000)=0010
- 對于mov ax,[2]的功能, 我們來描述: (ax)=((ds)16+2)
- 對于mov[2], ax的功能,我們可以這樣來描述:((ds)16+2)=(ax)
- add ax, bx的功能:(ax)=(ax)+(bx)
- push ax的功能,我麼可以這樣描述:
- idata表示常量
- mov ax, [idata]就代表mov ax,[1], mov ax, [2]等
- 指令的格式:
- loop 标号,CPU執行loop指令的時候, 要進行兩步操作
- (cx)=(ax)- 1
- 判斷cx中的值, 不為零則轉到标号處執行程式,否則向下執行
- 從上述中。我們可以看到 cx中的值影響執行結果
- 通常我們用loop指令來實作循環功能, cx中存放循環次數
- loop 标号,CPU執行loop指令的時候, 要進行兩步操作
- loop具體應用:
-
- 程式設計計算2的2次方,結果放在ax中
-
assume cs:code code segment mov ax, 2 add ax, ax mov ax, 4c00H int 21H code ends end
- 計算2的三次方
assume cs:code code aegment mov ax, 2 add ax, ax add ax, ax mov ax, 4c00H int 21H code ends
- 計算2的12次方
-
assume cs:code code segment mov ax, 2 ; 做11次add ax,ax mov cx, 11 s:add ax, ax loop s mov ax, 4c00H int 21H code ends
-
标号:
- 在彙編語言中,标号就代表了一個位址, 此程式中一個标号它實際上表示了一個位址, 這個位址處有一條指令:add ax, ax
- Loop s
- (cx)=(cx)-1
- 判斷cx中的值, 不為0則轉至标号s所表示的位址處執行, 如果為0,則執行下一條指令
-
一下三條指令
mov cx, 11
S:add ax, ax
- 執行loop時, 首先要将(cx)- 1 若不為0 這繼續執行 add ax, ax, 是以利用cx來控制add ax, ax的執行次數
- 在cx中存放循環次數
- loop指令中的标号所辨別位址要在前面
- 要循環執行的程式段, 要寫在标号和loop指令中間
用加法計算123*236, 結果放在ax中
assume cs:code
code segment
mov ax, 0
mov cx, 123
s:add ax, 236
loops
mov ax, 4c00H
int 21H
code ends
end
5.3 在debug中用loop指令實作的循環過程
- 首先,我們将它編輯為源程式檔案, 檔案名定義為p3.asm, 對齊進行編譯連結後生p3.exe, 然後再用debug對p3.exe中的程式進行跟蹤
- 如果是循環比較多 可以使用debug的g指令調到指定位址, 跳過循環執行過程
5.4 debug和彙編編譯器masm對指令的 不同處理
- debug指令
-
mov ax, 2000H mov ds, ax mov al, [0] mov bl, [1] mov cl, [2] mov dl, [3]
- masm彙程式設計式
-
assume cs:code code segment mov ax, 2000H mov ds, ax mov bx, 0 mov al, [bx] mov bx, 1 mov bl, [bx] mov bx, 2 mov cl, [bx] mov bx, 3 mov dl, [bx] mov ax, 4c00H int 21h code ends end
- 上面說在彙程式設計式中不能直接寫[2]這種格式,但是加上段位址也可以實作
-
assume cs:code code aegment movv ax, 2000H mov ds, ax mov al, ds:[0] mov bl, ds:[1] mov cl, ds:[2] mov dl, ds:[3] mov ax, 4c00H int 21H code ends end