組合語言學習筆記

2021-06-22 10:23:31 字數 3736 閱讀 8924

cs:ip是指向程式執行的位置

code segment 

ds 儲存記憶體中取資料的位址,

data segment

ss:sp是指向堆疊的位置

stack segment

cx 裡儲存的是loop執行的標誌:loop執行時,cx=cx-1,若此時cx裡值為0,則跳出loop,否則繼續loop

初始**段長度存放在cx裡

記憶體的位址 cs*10h + ip

ds*10h + [..]

ss*10h + sp    :push後,sp=sp-2;pop後,sp=sp+2;棧為空時,指向棧底,否則總是指向棧頂

ps:           

程式執行時,總是執行cs*10h+ip位置的**;

類似mov ax, [..]時,總是從ds*10h+..位置處讀記憶體,..可是是數,亦可以是bx暫存器,以bx暫存器裡內容作為位址

push一次,sp=sp-2;

pop一次,sp=sp+2;

loop一次,cx=cx-1;根據cx是否為0決定迴圈是否繼續

ds,cs,es,ss 不能直接mov值進去,需通過暫存器簡介賦值

[..]中的只能用bx和bp暫存器做位址訪問,且bx是預設以ds為基位址訪問記憶體單元的,bp是以ss為基位址訪問記憶體單元的

word ptr 和 byte ptr指明在沒有暫存器參與的定址單元中必要:

如:mov byte ptr [1000h], 1  -- 2000:1000 01 ff ff ..

mov word ptr [1000h], 1  -- 2000:1000 01 00 ff..

push指令只進行字操作

除法指令div :  除數非8位和16位,存放在reg或者記憶體單元中

被除數:16位時,存放在ax中,32位時,高16位存放在dx中,低16位存放在ax中

結果:除數8位,al儲存商,ah存放餘數;除數16位時,ax儲存商,dx儲存餘數

div byte ptr ds:[0] -- (al) = (ax)/((ds)*16+0)商,(ah) = (ax)/((ds)*16+0)餘數

div word ptr ds:[0] -- (ax) = ((dx)*10000h + (ax))/((ds)*16+0)商,(dx) = ((dx)*10000h + (ax))/((ds)*16+0)餘數

jmp dword ptr 記憶體單元位址 -- (cs) = (記憶體單元位址+2)

(ip) = (記憶體單元位址)

jcxz  ---  if cx==0:ip = ip + 位移 else: ip不變,什麼也不做,接著往下執行

ret和retf指令:

1.ret執行後:ip = (ss) * 10h + sp; sp = sp + 2

pop ip

2.retf執行後:ip = (ss) * 10h + sp; sp = sp + 2; cs = (ss) * 10h + sp; sp = sp+2

pop ip; pop cs

call指令:

call執行執行後,即先執行再壓棧,ip或cs和ip壓入棧中:sp = sp - 2; ((ss) * 10h + sp) = ip

call far ptr 標號:--ip指向下一條指令,執行完call指令後,push cs; push ip。

call ax/bx.. -- push ip;jmp ax--ip = (ax)

call word ptr -- push ip; jmp word ptr -- ip = 。。

call dword ptr -- push cs;push ip; jmp dword ptr .. cs高位,ip低位

彙編具有子程式的源程式框架:

assume cs:code

code segment

main:

...call sub1

...mov ax, 4c00h

int 21h

sub1:

......

call sub2

...ret

sub2:

...ret

code ends

end main

mul指令:

mul 記憶體單元

乘數:8位存al,16位存ax

結果:8位乘數存ax,16位乘數高16存dx,低16存ax

mul byte ptr ds:[0]  -- ax = al * (ds*10h + 0)

mul word ptr [bx + si + 8] -- ax 存低16位,dx存高16位

adc是對add的功能擴充:當加法位超過16位時

1ef000h + 201000h

mov ax, 001eh

mov bx, 0f000h

add bx, 1000h   bx + 1000h

adc ax, 0020h   ax + 0020h + cf(進製值) 對應sbb就是借位值sbb bx, 0020h -- bx - 0020h - cf

cmp指令:cmp ax, bx

ax = bx  -- zf = 1

ax != bx -- zf = 0

ax < bx  -- cf = 1

ax >= bx -- cf =0

ax > bx  -- cf = 0 && zf =0

ax <= bx -- cf = 1 && zf = 1

和cmp搭配使用的指令

zf = 1

je    equal

zf = 0

jne   not equal

cf = 1

jb    below

cf = 0

jnb   not below

zf = 0 && cf = 0 ja    above

zf = 1 && cf = 1 jna   not above

cld  df = 0正

tld  df = 1反

將ds:si指向的內容送入es:di指向的記憶體中

movsb指令:df = 0 -- si = si + 1, di = di + 1

df = 1 -- si = si - 1, di = di - 1

movsw

: df = 0 -- si = si + 2, di = di + 2

df = 1 -- si = si - 2, di = di - 2

rep movsb -- 根據cx進行的迴圈傳送

中斷:8位(4位元組)的中斷型別碼儲存中斷處理程式的入口位址8086cpu 0000:0000~0000:03ff,高位址字存放段位址(cs),低位址字存放偏移位址(ip)

中斷過程:(機器自動完成)

1.取得中斷型別碼,即中斷處理程式的cs:ip

2.標誌暫存器的值入棧,因為中斷過程中要改變標誌暫存器的值

3.設定標誌暫存器的第8位tf和第9為if的值為0

4.cs的內容入棧

5.ip的內容入棧

6.中斷型別碼*4 + 2字單元讀cs,中斷型別碼*4字單元讀ip

中斷入棧順序:標誌暫存器、cs、ip

iret 對比 retf

pop ip    pop ip

pop cs    pos cs

popf

int n中斷處理過程(自動完成):

1.取中斷型別碼n;

2.標誌暫存器入棧,if=0,tf=0

3.cs,ip入棧

4.ip=n*4,cs=n*4+2

組合語言學習筆記

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

組合語言學習筆記

編譯下面的程式,生成列表檔案,觀察標號在機器碼中變成了什麼?小組中的同學都說一說,說出你看到了什麼,說出你的疑問,讓小夥伴們一起解決。下面是程式 這個程式的功能沒有意義,只用於觀察程式中的標號 assume cs codesg,ds datasg datasg segment a db 1,2,3,...

組合語言學習筆記

組合語言 assembly language 是任何一種用於電子計算機 微處理器 微控制器或其他可程式設計器件的低階語言,亦稱為符號語言。在組合語言中,用助記符代替機器指令的操作碼,用位址符號或標號代替指令或運算元的位址。在不同的裝置中,組合語言對應著不同的機器語言指令集,通過彙編過程轉換成機器指令...