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

【匯編語言】——第五章課後總結

div 訪問內存 段地址 [1] 方式 賦值 解決 行程 bug

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

【匯編語言】——第五章課後總結