《組合語言》學習筆記 四 六章

2021-07-04 05:53:35 字數 3935 閱讀 2165

第四章 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,...