組合語言學習筆記
一、補碼
00000000b~01111111b表示0~127,按位取反後加1表述負數:
00000000b:0 11111111b+1=00000000b:0
00000001b:1 11111110b+1=11111111b:-1
00000010b:2 11111101b+1=11111110b:-2
01111111b:127 10000000b+1=10000001b:-127
結論:
1)最高位為1,表示負數
2)正數補碼取反加1後為負數的補碼;負數的補碼取反加1後位其絕對值。比如:
1的補碼位00000001b,取反加1後位:11111111b,表示-1
-1的補碼位11111111b,取反加1後位:00000001b,其絕對值位1
利用此特性可以得知負數補碼代表什麼數值
二、暫存器
1、CS為指令段暫存器;IP為指令指標暫存器;CS:IP(CS*16+IP)為指令地址
不可使用mov指令直接修改暫存器值,可使用jmp指令:jmp 2Ae3:3 同時修改CS和IP;jmp ax 單獨修改IP
2、DS為記憶體資料暫存器;ds設值後,[bx]取指定索引資料;或者DS:[bx]
不可mov一個立即數給它,使用mov bx,1000h; mov ds,bx來賦值
ES指向附加段,和DS功能相同,都可訪問記憶體,特殊情況:進行串操作時,目的地址的段暫存器規定為ES。
3、SS為棧段暫存器;SP為棧指標暫存器;SS:SP(SS*16+SP)指向棧頂元素
PUSH:SP=SP-2後入棧
POP ax:SS:SP資料取到ax,SP+=2;
PUSH、POP可以對段暫存器做操作
4、BX、SI、DI、BP,只有這四個暫存器可以存放記憶體索引:
mov ax,[si]
mov ax,[bx+si]
mov ax,[si+idata]
組合情況只有四種:bx+si;bx+di;bp+si;bp+di
使用到BP暫存器,預設段在SS中;其他預設DS中。
5、CX存放迴圈次數:
mov cx,12
s: add dx,ax
loop s
儲存條件轉移指令的條件:
jcxz s
6、DX、AX預設存放除數:
除數16位則預設放AX,32位則預設DX存放高16位,AX存放低16位;
被除數位8位,預設AL存放商,AH存放餘數,16位則AX存放商,DX存放餘數。
div bx 將dx*10000H+ax除bx,商放在ax,餘數放在dx
div bl 將ax除bl,商放在al,餘數放在ah
7、DX、AX用於乘法:
8位相乘,一個預設放在AH中,另一個放在8位暫存器或者記憶體,結果預設放在AX中。
16位相乘,一個預設在AX中,另一個放在16位暫存器或者記憶體,結果高位預設放在DX中,地位在AX中。
8、in和out指令只能使用ax或al來存放從埠中讀入或傳送的資料。
in al,60h 從60h埠讀入一個位元組
out 20h,al 往20h埠寫入一個位元組
9、flag標誌暫存器,8086CPU中,各位含義:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
第0位:CF,進位標誌位,無符號運算時,記錄結果的最高有效位向更高位進位或從最高位的借位值;
第11位:OF,溢位標誌位,有符號運算時,結果發生溢位則OF=1;否則OF=0;
第2位:PF,奇偶標誌位,記錄指令執行後,結果的二進位制位中1的個數是否為偶數,是偶數則PF=1,為奇數則PF=0;
第6位:ZF,零標誌位,記錄指令執行後,結果是否為0,為0則ZF=1;不為0則ZF=0;
第7位:SF,符號標誌位,記錄指令執行後,結果是否為負,為負則SF=1;不為負則SF=0;
第10位:DF,方向標誌位,串處理指令中,控制每次操作後,si,di的增減,DF=0,每次操作後si,di遞增;DF=1,則遞減;
第9位:IF,CPU響應中斷標記,CPU檢測到可遮蔽中斷資訊時,如果IF=1,則響應中斷,如果IF=0,則不響應。
標誌暫存器在debug中式單獨標示的:
標誌 值為1的標記 值為0的標記
OF OV NV
SF NG PL
ZF ZR NZ
PF PE PO
CF CY NC
DF DN UP
三、指令
1、mov: mov ax,bx 將bx賦值給ax
2、add: add ax,bx 將bx累加到ax
3、sub: sub ax,bx 將ax減去bx,儲存到ax
4、div: div bx 將dx*10000H+ax除bx,商放在ax,餘數放在dx
5、inc: inc bx 將bx自增1
6、and: and al,11011111b 將al邏輯與11011111b,結果儲存在al
7、or: or al,11011111b 將al邏輯或11011111b,結果儲存在al
8、ptr: add word ptr [bx],2 對bx開始的記憶體做字操作
inc byte ptr [bx] 對bx開始的記憶體做位元組操作
有暫存器參與的表示式,由暫存器決定操作長度:add ax,[bx] / add al,[bx]
9、偽指令db、dw、dd分別代表定義立即數型別為位元組、字、雙字:
db 1 data:0 = 01h 佔一個位元組
dw 1 data:0 = 0001h 佔一個字
dd 1 data:0 = 00000001h 佔兩個字
10、偽指令dup表示立即數重複次數,配合db、dw、dd使用:
db 3 dup(0) 定義三個位元組都是0,即db 0,0,0
db 3 dup(0,1,2) 定義9個位元組,即db 0,1,2,0,1,2,0,1,2
11、操作符offset:
start:mov ax,offset start 相當於mov ax,0 offset操作符取得標號start的偏移地址0
s:mov ax,offset s 相當於mov ax,3
12、jmp指令:可以只修改IP,也可以同時修改CS和IP
jmp short s 短轉移,只修改IP:-128~127 機器碼包含位移
jmp near ptr s 段內近轉移,只修改IP:-32768~32767 機器碼包含位移
jmp far ptr s 段間近轉移,修改CS和IP 機器碼明確包含了CS地址和IP地址
jmp al:將al賦值給IP
jmp word ptr ds:[0]:將記憶體地址0處的一個字賦給IP
13、jcxz指令:條件轉移指令,都是短轉移,只修改IP:-128~127
jcxz s:如果CX暫存器為0,則轉移到s處。
14、loop指令為迴圈指令,所有迴圈指令都是短轉移。機器碼包括位移而不是目的地址
loop s:如果CX--後不為0,則轉移到s處
15、ret指令用棧中的資料修改IP,實現近轉移,相當於POP IP;
retf指令用棧中資料修改CS和IP內容,實現遠轉移,相當於POP IP;POP CS;
16、call指令執行以下兩步操作,不能實現短轉移,其他合jmp指令相同:
1)將當前的IP或者CS和IP壓棧
2)轉移
用法包括:
1)call 標號:將當前IP壓棧後,轉移到標號處執行,相當於
PUSH IP
jmp near ptr 標號
2)call ax:類似1
3)call word ptr [bx]:類似1
4)call dword ptr [bx]:段間轉移,相當於
push CS
push IP
jmp dword ptr [bx]
17、mul乘法指令:
8位相乘,一個預設放在AH中,另一個放在8位暫存器或者記憶體,結果預設放在AX中。
16位相乘,一個預設在AX中,另一個放在16位暫存器或者記憶體,結果高位預設放在DX中,地位在AX中。
mul reg
mul byte ptr ds:[0]
mul word ptr [bx+si+8]
舉例:
mov al,1000
mov bl,10
mul bl
結果:ax = 1000
18、adc指令:帶進位加法指令
adc ax,bx 相當於ax=ax+bx+CF
19、sbb指令:借位減法指令
sbb ax,bx 相當於ax = ax-bx-CF
20、cmp指令:比較指令,做減法運算,不儲存結果,隻影響標誌暫存器
mov ax,8
mov bx,3
cmp ax,bx
執行後:ax=8,ZF=0,PF=1,SF=0,CF=0,OF=0
cmp 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 說明ax<=bx
cmp ah,bh比較有符號數各種可能:
ZF=1 說明ah=bh
ZF=0 說明ah!=bh
SF=1 && PF=0 說明ah<bh
SF=1 && OF=1 說明ah>bh
SF=0 && OF=1 說明ah<bh
SF=0 && OF=0 說明ah>=bh
21、其他條件轉移指令:
je 等於則轉移 ZF=1
jne 不等於則轉移 ZF=0
jb 低於則轉移 CF=1
jnb 不低於則轉移 CF=0
ja 高於則轉移 CF=0 且 ZF=0
jna 不高於則轉移 CF=1 或 ZF=1
22、movsb:將di:si指向的記憶體位元組送入es:di,然後根據DF位標記,將si和di遞增或遞減
movsw:傳送的是字,然後si和di遞增或遞減2
rep movsb/w:rep指令根據cx的值,重複指向後面的串傳送指令,相當於:
s: movsb/w
loop s
cld:將標誌暫存器DF位置0
std:將標誌暫存器DF位置1
23、pushf:將標誌暫存器的值壓棧
popf:從棧中彈出資料,送入標誌暫存器
24、shl和shr邏輯移位指令
shl邏輯左移指令(shr類似):
1)將一個暫存器或記憶體單元中的資料向左移位
2)將最後移出的一位寫入CF中
3)最低位用0補充
mov al,01001000b
shl al,1
執行後al=10010000b,CF=0
如果移動位數大於1,必須將位數放在cl中。
mov al,01001000b
mov cl,3
shl al,cl
執行後al=10001000b,CF=1
25、in、out指令。
CPU最多可以定位64K個不同埠,即0~65535。
對埠的讀寫不能使用mov指令,只能使用:in和out。
in和out指令只能使用ax或al來存放從埠中讀入或傳送的資料。
對0~255以內埠讀寫:
in al,20h 從20h埠讀入一個位元組
out 20h,al 從20h埠寫入一個位元組
對256~65535的埠讀寫,埠號放在dx中:
mov dx,3f8h
in al,dx
out dx,al
26、sti、cli指令
sti 用於設定IF=1
cli 用於設定IF=0
四、中斷
1、8086CPU的中斷向量表固定在:0000:0000到0000:03E8的1000個單元中一個表項佔用兩個字,高地址字存放段地址,低地址字存放偏移地址
2、8086CPU的中斷過程:
1)從中斷資訊中取得中斷型別碼 :取得中斷型別碼N
2)標誌暫存器的值入棧 :pushf
3)設定標誌暫存器的第8位TF和第9位IF的值為0 :TF=0,IF=0(禁止其他可遮蔽中斷)
4)CS的內容入棧 :push CS
5)IP的內容入棧 :push IP
6)從記憶體地址為 中斷型別碼*4 和 中斷型別碼*4+2 的兩個字單元中讀取中斷處理程式入口地址設定IP和CS :IP=N*4 , CS=N*4+2
3、中斷處理程式常規步驟:
1)儲存用到的暫存器
2)處理中斷
3)恢復用到的暫存器
4)用iret指令返回,iret指令用匯編語法描述為:
pop IP
pop CS
popf
4、CPU執行int n指令,相當於引發一個N號中斷的中斷過程,參考2
5、BOIS和DOS中斷例程的安裝過程:
1)開機後,CPU一加電,初始化CS=0FFFFH,IP=0,自動從FFFF:0單元開始執行程式。此處有一條跳轉指令,CPU執行該指令後,轉去執行
BOIS中的硬體系統檢測和初始化程式。
2)初始化程式將建立BIOS所支援的中斷向量,即將BIOS提供的中斷例程的入口地址登記在中斷向量表中,注意,對於BIOS所提供的中斷例
程,只需將入口地址登記在中斷向量表中即可,因為它們是固化到ROM中的程式,一直在記憶體中存在。
3)硬體檢測和初始化完成後,呼叫int 19h進行作業系統的引導,從此將計算機交由作業系統控制。
4)DOS啟動後,除完成其他工作外,還將它所提供的中斷例程裝入記憶體,並建立相應的中斷向量。
6、外中斷,包括兩類:
1)可遮蔽中斷:IF=1,響應中斷,IF=0,不響應中斷
幾乎所有的外設引發的中斷,都是可遮蔽中斷。
sti 用於設定IF=1
cli 用於設定IF=0
2)不可遮蔽中斷
CPU必須響應,中斷型別碼固定為2,因此中斷過程第一步,不需要取中斷型別碼了。
相關文章
- 組合語言-學習記錄(二)組合語言
- 組合語言學習筆記03——暫存器(CPU工作原理)組合語言筆記
- 組合語言零基礎入門學習筆記(一)組合語言筆記
- Solidity語言學習筆記————32、建立合約Solid筆記
- 學習筆記(二十三):ArkTS語言-模組筆記
- 組合數學學習筆記筆記
- 【學習筆記】組合數學筆記
- C 語言學習筆記筆記
- C語言學習筆記C語言筆記
- Solidity語言學習筆記————35、抽象合約和介面Solid筆記抽象
- Solidity語言學習筆記————13、固定大小位元組陣列Solid筆記陣列
- Solidity語言學習筆記————14、動態位元組陣列Solid筆記陣列
- 組合最佳化 學習筆記筆記
- Solidity語言學習筆記————1、初識Solidity語言Solid筆記
- Solidity語言學習筆記————36、 庫Solid筆記
- Solidity語言學習筆記————37、Using forSolid筆記
- Solidity語言學習筆記————4、常量Solid筆記
- 《JavaScript語言精粹》學習筆記一JavaScript筆記
- 《JavaScript語言精粹》學習筆記二JavaScript筆記
- 熱更新語言--lua學習筆記筆記
- c語言學習筆記===函式C語言筆記函式
- Solidity語言學習筆記————44、合約的後設資料Solid筆記
- 讀書筆記:組合語言(王爽)實驗七筆記組合語言
- Go語言學習筆記(七)之方法Go筆記
- Solidity語言學習筆記————33、事件(Events)Solid筆記事件
- Solidity語言學習筆記————12、陣列Solid筆記陣列
- Solidity語言學習筆記————34、繼承Solid筆記繼承
- 初識C語言(01)—學習筆記C語言筆記
- C語言學習筆記——位運算C語言筆記
- C語言學習筆記--C運算子C語言筆記
- go 學習筆記之初識 go 語言Go筆記
- c語言程式基礎學習筆記C語言筆記
- C語言學習筆記之變數C語言筆記變數
- 組合語言1 - 什麼是組合語言?組合語言
- GO語言學習筆記之mac環境go語言配置Go筆記Mac
- 組合數學筆記-排列與組合筆記
- 組合語言組合語言
- MySQL學習筆記:組合索引-最左原則MySql筆記索引
- MySQL學習筆記:組合索引-索引下推MySql筆記索引