1. 程式人生 > >第5~8章

第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。