第四章 1.
匯程式設計序中包含兩種指令
:偽指令與彙編指令
偽指令(類似於
c語言中用
#開頭的語句):
assume cs:*** (
將暫存器與程式中的某個段相關聯)
*** segment : (
段開始)
...*** ends (
段結束)
end (
整個程式的結束)
2.程式返回:
在dos(
乙個單任務作業系統)中
,某程式
p2在可執行檔案中
,則必須有乙個正在執行的程式
p1,將
p2從可執行檔案載入記憶體,將
cpu的控制權交給
p2.p2
開始後p1
暫停執行,等到
p2執行完畢後將控制權交還
p1,p1
再繼續執行
彙編指令:
mov ax,4c00h
或者mov ah,4ch
int 21h
3.dos
系統中,
可執行檔案由程式
command.com(
命令直譯器
,dos
系統的shell)執行
command
先將可執行檔案的程式載入記憶體
(由暫存器
cx存放程式的長度
),設定
cs:ip
指向程式的入口,此後
command
暫停執行
,cpu
執行程式
.程式執行結束後
,返回到
command
中,command
才能繼續執行等待使用者的下乙個輸入
第五章1.定義乙個
描述性的符號().(20000h)
表示記憶體
20000h
單元(實體地址)的內容
即當ds=2000h
時, [0]
與(20000h)
表示同一位址 ()
內也可以是含有暫存器和運算的位址 例如
mov ax,[2]
可以用(ax) = ( (ds)*16 + 2 )
來描述
add ax,2
可以用(ax) = (ax)+2
來描述
push ax
可以用(sp) = (sp)-2
((ss)*16+sp ) = (ax)
來描述
(x)表示的資料可以是字(8位
,1b)
或者位元組型
(16位
,2b),
具體是哪種型別由暫存器名或者具體的運算來決定
如(al) = (20000h) 則訪問
(20000h)
得到的資料為位元組型 若
(ax) =(20000h)
則訪問得到的資料為字型 2.
指令mov ax,[bx]
是把暫存器
bx中存放的資料作為乙個偏移位址(設為
ea),
段位址sa預設在ds中
,將sa:ea
這個位址的資料送入ax中
,即(ax) = ((ds)*16+bx )
3.loop
指令: loop
段名稱
執行loop
的時候cpu
執行兩步
: cx -= 1 ;
判斷cx
值若不為
0則跳到標號處執行程式,若為
0則向下執行 4.
對於mov ax,[1]
這條指令(注意
內是idata) , debug
會將它解釋為
mov ax,[1],
然而彙編編譯器
masm
則會解釋為
movax,1
即把[1]
內的idata
直接拿出來當做乙個普通的常量
,只會把
mov ax,[bx]即用
括起來的暫存器的值當做偏移位址
.因此以防萬一應該都把
movax,[1]
寫成mov ax,[bx]
的形式(
事先mov bx,1) 補
:其實masm
中寫成mov ax,ds:[1]
的指令就會和
debug
中mov ax,[1]
達到相同的效果 5.
段字首:
顯式地指明記憶體單元段位址,如
mov ax,es:[bx]
中的ex: 6.
一般的pc
中在dos
方式下,do
和其他合法的程式都不會使用
0:200~0:2ff (00200h~002ffh)
這256
個位元組的空間
,所以這段空間是安全的
7.0:200~0:20b
與0020:0~0020:b
描述的是同一段記憶體空間 8.
在8086cpu
中,只有bx,
si,di,
bp這4個暫存器可以用在
[...]
中來進行記憶體單元的定址
第六章1.datasegment
dw0123h,0456h,0789h,0abch
assumecs:code, ds:data
定義了四個字型資料
, 每個佔
2個位元組
(2*8bit),
一共佔8
個位元組(
也可以說開闢了一段記憶體空間)
位址分別為
ds:0, ds:2,ds:4, ds:6 2.
載入完程式時若
ds=0b2d,
則可推出程式(所有
)**(包括
data段)
從0b3d:0000
開始存放(有
0x10h
的一段記憶體用來存放
psp),
即用-d
檢視會出現
0b3d:0000
23 01 56 04 89 07 bc 0a 00 00
上面即使
data
段的資料
3.mov ds,data
是錯誤的,因為
8086(16
位)cpu
不允許將乙個乙個數值直接送入段暫存器中 (
因為該條指令的
"data"
被編譯器處理為乙個表示段位址的數值)
4.不一定要設乙個
data
段來存放資料
,也可以直接在
code
段中定義資料,
但這樣資料就與**存放在一起
,程式會自動將入口設在定義的首個資料位址開始執行
,此時的機器碼是資料
,不是想要執行的程式彙編**
,因此可能會出現錯誤
在這種情況下
,在需要執行的**開頭加上乙個段標如
main: 並在
code ends
下一行加上
end main即可告訴編譯器要從main處開始執行
這條end與其他段的ends指令都不同
組合語言學習筆記
學習參考資料 大灰狼 講彙編 資料匯流排,位址匯流排,控制匯流排。位址匯流排有多少條就決定了cpu最大的記憶體使用量。80386有32位位址匯流排,所以它的定址能力就是4g.暫存器 通用暫存器,段暫存器,ax暫存器 通用暫存器,存放資料。高位位元組ah,低位位元組al。實體地址表示方法 位址加法器,...
組合語言學習筆記
cs ip是指向程式執行的位置 code segment ds 儲存記憶體中取資料的位址,data segment ss sp是指向堆疊的位置 stack segment cx 裡儲存的是loop執行的標誌 loop執行時,cx cx 1,若此時cx裡值為0,則跳出loop,否則繼續loop 初始 ...
組合語言學習筆記
編譯下面的程式,生成列表檔案,觀察標號在機器碼中變成了什麼?小組中的同學都說一說,說出你看到了什麼,說出你的疑問,讓小夥伴們一起解決。下面是程式 這個程式的功能沒有意義,只用於觀察程式中的標號 assume cs codesg,ds datasg datasg segment a db 1,2,3,...