今天學習了王爽《組合語言》第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
裡面,0
和h
乙個都不能少。
1.2 將記憶體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
ffff:0~ffff:b
單元中的資料複製到0:200~0:20b
中?
段字首的應用,ds、cs、ss、es
都可以使用,很靈活。
注意題目是,將記憶體ffff:0~ffff:b
單元中的資料複製到0:200~0:20b
單元中。將段字首設定為0020h
比0
要方便。
2.包含多個段的程式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.1 如何對資料進行累加?
即一些資料常量應該如何宣告,如何引用?
採用dw 0123h,0456h,0789h
進行宣告。
通過cs:[bx]
進行定位,bx
每次增加2個位元組。
但是僅僅只做這些改變,在執行時就會出現問題。先看一下程式的記憶體:
可以看出前6個位元組儲存的三個字的值,為避免將資料當作指令,程式應該從0c53:0006開始執行。
所以需要在源程式中用end
標號,標記程式的入口位址。
2.2 利用棧,將程式中定義的資料逆向存放?
首先,提前宣告一塊空間,供棧使用。
另外,設定好棧的段位址和偏移位址。
示例程式如下:
2.3 結構更清晰——將**分多個段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
下面是之前提及的例子,不過分了資料、棧和**三段。
需要注意的是:
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。實體地址表示方法 位址加法器,...