組合語言(王爽)第六章

2021-10-03 07:27:26 字數 3819 閱讀 9683

6.1 在**段中使用資料

程式設計以下8個資料的和,結果存在ax暫存器中,用迴圈累加的方式

想用迴圈,就需要把這些資料儲存在一組位址連續的記憶體單元中,之前提到過應該讓系統來分配空間,因此我們在程式中定義希望處理的資料,這些資料最終會成為程式的一部分寫到可執行檔案中,可執行檔案載入到記憶體中後,這些資料便自然獲得了儲存空間

assume cs:code

code segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

mov bx,0

mov ax,0

mov cx,8

s:add ax,cx:[bx]

add bx,2

loop s

mov ax,4c00h

int 21h

code ends

end

dw的含義是定義字型資料,這段**中定義了8個字型資料,佔16個位元組的記憶體單元,由於在**段中,且定義在**段最開始,所以位址為cs:0,cs:2.cs:4……以此類推

在debug中使用u命令,這些資料會被翻譯為彙編指令,如果想要執行第一條真正的指令,就需要更改ip的值,這樣一來,直接編譯、連線而後執行的話會出現問題,因為ip初始為0,因此**需要更改

assume cs:code

code segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

start: mov bx,0

mov ax,0

mov cx,8

s:add ax,cx:[bx]

add bx,2

loop s

mov ax,4c00h

int 21h

code ends

end start

偽指令end除了通知編譯器程式結束外,還可以通知編譯器程式的入口在哪

如何設定cpu中cs:ip指向第一條要執行的指令,這一點由可執行檔案中的描述資訊指明,上面的程式中end start指明入口位址的偏移位址為10h,這個資訊被存放在可執行檔案中,載入者會根據該資訊設定cs:ip

6.2 在**段中使用棧

利用棧,將程式中定義的資料逆序存放

assume cs:codesg

codesg segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;再定義16個字型資料,程式載入後

;取得16個字的記憶體空間

;後面的程式將這段空間當作棧來使用

start: mov ax,cs

mov ss,ax

mov sp,30h ;將cs:10~cs:2f的記憶體空間當作棧

;注意棧頂的設定方法

mov bx,0

mov cx,8

s:push cs:[bx]

add bx,2

loop s ;將**段0~15單元8個字型資料入棧

mov bx,0

mov cx,8

s0:pop cs:[bx]

add bx,2

loop s0 ;依次出棧8個字型資料,達到逆序存放的目的

mov ax,4c00h

int 21h

codesg ends

end start

我們在描述dw的作用時,既可以說是用來定義資料,也可以說是用來開闢記憶體空間,最終效果是一樣的,定義8個字型資料,也可以說開闢了8個字的記憶體空間

練習:依次用記憶體0:0~0:15單元中的內容改寫程式中的資料,資料的傳送用棧來進行,棧空間設定在程式內

assume cs:codesg

codesg segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

dw 0,0,0,0,0,0,0,0,0,0 ;10個字單元用作棧空間

start: mov ax,cs

mov ss,ax

mov sp,24h

mov ax,0

mov ds,ax

mov bx,0

mov cx,8

s:push [bx] ;先把0:[bx]處的資料入棧

pop cs:[bx] ;入棧後立刻彈出存到原有資料處cs:0 cs:2等

add bx,2

loop s

mov ax,4c00h

int 21h

codesg ends

end start

6.3 將資料、**、棧放入不同的段

在前面的內容裡我們把資料、棧、**等放到同乙個段裡,這樣顯得混亂,如果資料、棧、**需要的空間超過64kb,就超出了乙個段的最大容量(8086模式下)

因此考慮用多個段分別存放

assume cs:code,ds:data,ss:tack

data sgement

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

data ends

stack segment

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

stack ends

code segment

start: mov ax,stack

mov ss,ax

mov sp,20h ;設定棧頂ss:sp指向stack:20

mov ax,data

mov ds,ax ;ds指向data段

mov bx,0 ;ds:bx指向data段中的第乙個單元

mov cx,8

s:push [bx]

add bx,2

loop s ;將data段0~15單元8個字型資料入棧

mov bx,0

mov cx,8

s0:pop [bx]

add bx,2

loop s0 ;依次出棧8個字型資料到data段中的0~15單元中

;達到逆序存放的目的

mov ax,4c00h

int 21h

codesg ends

end start

程式中,段名相當於乙個標號,代表了段位址,mov ax,data的含義就是將名稱為data段的段位址送入ax,不能使用mov ds,data,因為8086cpu不允許將乙個數值直接送入段暫存器中,data和stack都被編譯器處理為乙個表示段位址的數值

這裡命名的stcak,data,code只是我們的命名,cpu並不會因此就去把stack段當作棧,data段存放資料,即使assume cs:code,ds:data,ss:tack,cpu也不會使cs指向code,ds指向data,這些都只是標號,僅存在於源程式中

想要cpu按照我們的安排操作,需要用機器指令控制,源程式中的彙編指令是cpu需要執行的內容,我們用end start使得cpu得知第一條指令的位置

通過

mov ax,stack

mov ss,ax

mov sp,20h

設定ss:sp指向stack:20,所以把stack段當作棧空間使用

總之,cpu如何處理我們定義段的內容,當作資料還是段,完全靠彙編指令以及彙編指令對具體暫存器的設定來決定的,將源程式中code改為a,data改為b,stack改為c,start改為d也是可以的

王爽 組合語言 第六章檢測題分析

一 在intel8086環境下,下列說法合理的是 3 1 組合語言程式載入記憶體後處於64k空間以外的資料和指令將無法使用和執行。2 乙個資料段命名為data,此標號代表這個資料段在記憶體中的起始位址。3 如果載入的程式沒有返回語句,那麼當程式 執行完畢,將繼續讀取後續記憶體空間 儲存的指令到cpu...

王爽 組合語言 第六章 試驗五 5 答案

網上找了個答案,但是發現不正確,自己寫了個,調出來了.assume cs code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment db 0,0,0,0,0,0,0,0 c ends ...

組合語言(王爽)前六章複習(上)

組合語言的研究重點放在如何利用硬體系統的程式設計結構和指令集有效靈活地控制系統進行工作。微機原理與介面 pc機及cpu物理結構的全面研究 組成原理 對於計算機一般的結構 功能 效能的研究1.1 1.2 操作 暫存器bx的內容送到ax中 機器指令 1000100111011000 彙編指令 mov a...