第5~8章
5.1,2
mov ax,[bx]表示將偏移地址和段地址分別在BX,DS的記憶體單元的內容放入ax中。
inc bx含義為bx內容加一。
loop指令格式:
mov cx,11 (cx儲存迴圈次數,每次迴圈後-1,為0時轉到loop s後繼續執行指令)
s: add ax,ax (迴圈執行的程式段)
loop s 【效果相當於(ax)的12次方。】
5.3 在debug中跟蹤用loop指令實現的迴圈程式:P103
重點:圖5.8
可用g命令直接跟蹤迴圈。
g 0012 意思為執行程式碼段到當前程式碼段的0012h處(段地址在cs中)
當希望將迴圈一次執行完時,用P命令完成,具體:遇到loop指令時,用p命令Debug自動重複執行迴圈的指令直到(cx)=0.
5.4Debug和彙編編譯器masm對指令的不同處理
mov al,[0] debug認為【0】為記憶體單元的偏移地址;masm解釋為0。
解決:
mov ax,2000h
mov ds,ax
mov bx,0 將記憶體單元地址賦給bx
mov al,[bx]
或在記憶體地址單元的偏移地址前加上段地址所在暫存器如:
mov ax,2000h
mov ds,ax
mov al,ds:0 --------(ds就是5.6中的段字首)
5.5 loop,bx聯合運用
mov ax,0ffffh
mov ds,ax
mov bx,0 ds:bx指向ffff:0
mov dx,0 (累加暫存器)
mov cx,12
s: mov al,[bx]
mov ah,0
add dx,ax
inc bx (bx)每次迴圈加一
loop s
5.6參上
5.7
8086模式中,隨意向一段記憶體地址寫入內容很危險(可能存放重要的系統資料或程式碼),如果我們需要向記憶體空間寫入資料時要使用作業系統分配的空間。(可以在作業系統下安全,規矩地程式設計,也可以自由地用匯編語言操作硬體)
DOS模式下,0:200~0:2ff沒有系統或其他程式的資料或程式碼,我們可以使用這段空間。
5.8
參見P121程式5.9
6.1~6.2
程式6.3
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ---------用dw定義的資料,偏移地址為0,2,4,6,8,a,c, e;由於它們在程式碼段中,段地址在CS。
dw 0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ————用dw定義了16個字型資料,程式載入後取得16個字的記憶體空間存放這16個數據,在後面的程式中將這段空間當棧空間使用
(資料data)
start: —————程式入口
mov ax,cs ————第一個指令
mov ss,ax
mov sp30h (棧頂ss:sp指向cs:30)
mov bx,0
mov,cx,8
s: push cs:[bx]
add bx,2
loop s (將0~15單元的八個字型資料依次入棧)
mov bx,0
mov,cx,8
s0: pop cs:[bx]
add bx,2
loop s0 (依次出棧到程式碼段的0~15單元中)
mov ax,4c00h
int 21h
code ends
end start
6.3
程式6..4
assume cs:code,ds:data,ss:stack 定義多個段:“code”,“data”,“stack”為段名(可隨意取名,a,b,c都行)
data segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data段
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 stack段
stack ends
code segment code段
start:(可以改名,比如D:則最後end D)
mov ax,stack 意為將名稱為“stack”的段的段地址送入ax,。
mov ss,ax
mov sp,20h ss:sp即棧頂指向stack:20(20-2=1d,.........)
mov ax,data
mov ds,ax
mov bx,0 ds:bx指向data段的第一個單元
mov cx,8
s: push [bx]
add bx,2
loop s 將data段0~15單元的8個字型資料入棧
mov cx,8
s0: pop [bx]
add bx,2
loop s0 依次出棧到data段的0~15單元
mov ax,4c00h
int 21h
code ends
end start
(cpu真正執行的是start~end start之間的程式碼)
7.1~7.6
mov al,01100011b
and al,00111011b(邏輯與指令,結果:al=00100011b)
mov al,01100011b
or al,00111011b(邏輯或指令,結果:al=0111011b)
由上得大寫,小寫字母在ASCLL碼的區別在於第5位數字是0還是1。
因此:可用and al,11011111b或or al,00100000b將字母變成大寫\小寫。(如果原本就符合則不變)
[bx+idata]表示一個記憶體單元的偏移地址((bx)+idata)常用格式例:[200+bx], 200[bx], [bx].200。
7.7~7.9
si,di暫存器和bx功能相近,但不能分成兩個8位暫存器使用。
[bx+si]和[bx+di]可寫為[bx][si]和[bx][di]
記憶體空間偏移地址還可以如下表示
7.10
用dx暫時儲存cx中迴圈次數(有侷限性:當所有暫存器都工作時——涼涼)
於是我們可以使用記憶體暫存資料,這時我們最好使用棧(不使用則需要記住記憶體空間位置)。
P158
8.1~8.3
bp暫存器的預設段地址為ss
tips:[bp+bx]是錯誤的。
P164,8.4
8.5
8086CPU可以處理兩種尺寸資料:byte(8位),word(16位)
通過暫存器名指明處理的資料尺寸如al,ax。
指明記憶體單元長度:byte ptr和word ptr
8.6略
8.7、8.8
div除法指令:有8位16位兩種。
被除數預設放在AX或DX和AX中。(如果除數為8位,被除數則為16位存放於AX,如果除數為16位,被除數則為32位,DX存放高16位AX存放低16位)
結果:除數為8位:al存放商,ah存放餘數;除數為16位,ax存放商,dx存放餘數。
db,dw,dd分別定義位元組型,字型,雙字型資料。
例P170,
P171分析
8.9
dup用於資料的重複,用法:
例:db 3 dup('abc','ABC')定義了18個位元組即:abcABCabcABCabcABC。