組合語言學習(二)

2021-08-21 15:15:12 字數 3391 閱讀 9491

今天學習了王爽《組合語言》第5、6章。

我感覺這兩章主要加深了對於這個概念的理解。

第5章[bx]和loop指令,重點在於段位址和偏移位址的理解,段字首的應用。

第6章包含多個段的程式,重點在於理解為什麼要分段,掌握分段匯程式設計序的寫法,搞清楚段在記憶體當中的儲存。

1.loop指令[bx]的應用

1.1 計算ffff:0~ffff:b單元中資料的和,並將結果儲存在dx中?

存在的問題:8位的記憶體單元累加之和放到16位的暫存器中

解決的方法:ax為中介,其中ah設為0,al為記憶體單元的值。

mov ax,0ffffh裡面,0h乙個都不能少。

assume cs:code

code segment

mov ax,0ffffh

mov ds,ax

mov ax,0

mov dx,0

mov bx,0

mov cx,12

s:mov al,[bx]

add dx,ax

inc bx

loop s

mov ax,4c00h

int 21h

code ends

end

1.2 將記憶體ffff:0~ffff:b單元中的資料複製到0:200~0:20b中?

段字首的應用ds、cs、ss、es都可以使用,很靈活。

注意題目是,將記憶體ffff:0~ffff:b單元中的資料複製到0:200~0:20b單元中。將段字首設定為0020h0要方便。

mov ax,0ffffh

mov ds,ax

mov ax,0020h

mov es,ax

mov bx,0

mov cx,12

s:mov dl,[bx]

mov es:[bx],dl

inc bx

loop s

2.包含多個段的程式

2.1 如何對資料進行累加?

即一些資料常量應該如何宣告,如何引用?

採用dw 0123h,0456h,0789h進行宣告。

通過cs:[bx]進行定位,bx每次增加2個位元組。

但是僅僅只做這些改變,在執行時就會出現問題。先看一下程式的記憶體:

可以看出前6個位元組儲存的三個字的值,為避免將資料當作指令,程式應該從0c53:0006開始執行。

所以需要在源程式中用end標號,標記程式的入口位址。

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

首先,提前宣告一塊空間,供棧使用。

另外,設定好棧的段位址和偏移位址。

示例程式如下:

assume cs:code

code segment

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

dd 0,0,0,0,0,0,0,0

start:

mov ax,cs

mov ss,ax

mov sp,30h

mov bx,0

mov cx,8

s: push cs:[bx]

add bx,2

loop s

mov bx,0

mov cx,8

s1:pop cs:[bx]

add bx,2

loop s1

mov ax,4c00h

int 21h

code ends

end start

2.3 結構更清晰——將**分多個段

下面是之前提及的例子,不過分了資料、棧和**三段。

需要注意的是:

1.在assume之後,cpu不會將cs指向code,不會將ds指向data,不會將ss指向stack。

2.end指明了程式的入口,這個入口將被寫入可執行檔案的描述資訊。可執行檔案中的程式被載入到記憶體之後,cpu的cs:ip被設定指向這個入口,開始執行程式中的第一條指令。

所以,cs的值不用在**中設定,但是ds和ss的值需要在**中進行說明。

3.對於乙個段,如果段中的資料佔n個位元組,則程式載入後,該段實際占有的空間為:

(n/256+1)*256

其中除法取整。

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

data segment

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

data ends

stack segment

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

stack ends

code segment

start:

mov ax,stack

mov ss,ax

mov sp,20h

mov ax,data

mov ds,ax

mov bx,0

mov cx,8

s:push [bx]

add bx,2

loop s

mov bx,0

mov cx,8

s1:pop [bx]

add bx,2

loop s1

mov ax,4c00h

int 21h

code ends

end start

自己通過除錯,發現段在記憶體中的儲存方式,是很有意思的一件事情。

不過更有意思的永遠都在後面(手動滑稽)

組合語言學習

參考書籍 組合語言 王爽 著 清華大學出版社 選單導航 一 彙編基礎知識 二 暫存器和常見彙編指令演示 一 基礎知識 1 彙編指令是機器指令的助記符,同機器指令一一對應 2 每一種cpu都有自己的彙編指令集 3 cpu可以直接使用的資訊在儲存器中存放 4 在儲存器中指令和資料沒有任何區別,都是二進位...

組合語言學習

持續更新 彙編指令 1.mov指令 mov是乙個傳送指令,可以實現以下操作 有一點需要注意,資料不能直接傳給段暫存器,比如mov ds,100h就是錯誤的。但是可以將其他暫存器中的值賦給段暫存器。段暫存器有cs,ds,ss,es等。如果你想知道為什麼,那就可以去了解一下關於每條指令的硬體實現。後面還...

組合語言學習筆記

學習參考資料 大灰狼 講彙編 資料匯流排,位址匯流排,控制匯流排。位址匯流排有多少條就決定了cpu最大的記憶體使用量。80386有32位位址匯流排,所以它的定址能力就是4g.暫存器 通用暫存器,段暫存器,ax暫存器 通用暫存器,存放資料。高位位元組ah,低位位元組al。實體地址表示方法 位址加法器,...