1. 程式人生 > >【組合語言】——第五章課後總結

【組合語言】——第五章課後總結

1.[BX]

mov ax,[bx]

功能:bx中存放的資料作為一個偏移地址EA,段地址SA預設在ds中,將SA:EA處的資料送入ax中。即:(ax)=((ds)*16+(bx))。

mov [bx],ax

功能:bx中存放的資料作為一個偏移地址EA,段地址SA預設在ds中,將ax中的資料送入記憶體SA:EA初。即((ds)*16+(bx))=(ax)。

2.Loop指令

loop指令的格式是:loop標號,cpu執行loop指令的時候,要進行兩步操作

①(cx)=(cx)-1;②判斷cx中的值,不為0則轉至標號處執行程式,如果為0就向下執行

例如,我們要程式設計計算2^12,可以 mov ax,2,然後做11次add ax,ax

但是這種無疑使程式複雜化

用loop指令:

assume cs:code
code segment
  mov ax,2
  mov cx,11
s: add ax,ax
    loop s
  mov ax,4c00h
  int 21h
code ends
end

從上述程式我們可以總結:

①在cx中存放迴圈次數

②loop指令中的標號所標識地址要在前面

③要迴圈執行的程式段,要寫在標號和loop指令的中間

用cx和loop指令相配合實現迴圈功能的程式框架如下:

 mov cx,迴圈次數
s: 
    要迴圈執行的程式段
    loop s

3.在debug中跟蹤用loop指令實現的迴圈程式

這個內容太長了,想了半天也沒有很好的總結方法

書本上實驗過程和解析過程相當詳細

4.lool和[bx]的聯合使用

型別的匹配和結果的不超界的解決辦法:用一個16位暫存器來做中介,將記憶體單元中的8位資料賦值到一個16位暫存器ax中,再將ax中的資料加到dx上。

①(dx)=(dx)+記憶體中的8位資料

②(dl)=(dl)+記憶體中的8位資料

 

在指令中,我們不能用常量來表示偏移地址。我們可以將偏移地址放在bx中,用[bx]的方式訪問記憶體單元。在迴圈開始前設(bx)=0,每次迴圈,將bx中的內容+1即可。

 

在實際程式設計中,經常會遇到,用同一種方式處理地址連續的記憶體單元在的資料的問題。我們需要用迴圈來解決這類問題,同時我們必須能夠在每次玄幻的時候按照同一種方式來改變要訪問的記憶體單元的地址。

這時就不能用常量類給出記憶體單元的地址(比如[0],[1],[2]中,012是常量),而應用變數。“mov al,[bx]”中的bx就可以看作一個代表記憶體單元地址的變數,我們可以不屑新的指令,僅通過改變bx中的值,改版指令訪問的記憶體單元。

5.段字首

指令mov ax,[bx]中記憶體單元的偏移地址由bx給出,而短地址預設在ds中。

我們可以在訪問記憶體單元的指令中顯示地給出記憶體單元的段地址所在的段暫存器,比如:

mov ax,ds:[bx]

將一個記憶體單元的內容送入ax,這個記憶體單元的長度為2位元組(字單元),存放一個字,偏移地址在bx中,段地址在ds中。

還有ss,es,cs都是一樣,但是段地址分別在ss,es,cs中x