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