第三章 暫存器(記憶體訪問)
3.2 ds和[address] 記憶體單元位址,由段位址和偏移位址組成,可以利用mov進行修改,但是不能利用立即數進行修改,需要利用通用暫存器作為中介。對於字的傳送,指定低位位址,高位位元組自動放在高位址單元。
3.3 mov、sub、add指令
兩個運算元,add/sub/mov暫存器或[立即數],暫存器或[立即數]
3.5 資料段:與**段對應,在記憶體中劃分出64k的記憶體段用來儲存資料。cpu利用ds加上偏移量來讀取資料
3.6 棧:先入後出的一種資料結構,可以利用軟體或者硬體的方式實現,用於倒序陣列(lifo)。
操作指令push壓棧指令,記憶體取址ss:sp指向棧頂元素,每次取兩個位元組。從高到低排列
push ax
sp=sp-2
送入ax中元素
·pop ax
送出ax中元素
sp=sp+2
8086cpu利用ss和sp指示棧頂的位址,並提供push和pop指令實現對於棧的入棧和出棧,但是無法保證棧頂不超過棧空間,如果超過棧空間,則會將棧外資料覆蓋。
棧空間是一段在記憶體中分配的以特殊的訪問方式進行操作的空間,它從位址較大段向位址較小段寫入,從位址較小段向位址較大段讀取
push pop可以操作通用暫存器、段暫存器和記憶體單元,只有乙個運算元。
棧段在程式設計時進行安排,cpu在需要讀取棧段時會將ss:sp所指向記憶體的內容進行訪問
關於棧的使用:
使用棧之前需要首先分配棧空間,利用資料段.data中 dup(?)
利用mov 來指定ss和sp,指定到一定的記憶體空間為棧空間。
第四章 程式格式及程式的解讀
格式一:
assume cs:codeseg ds:dataseg ss:stackseg ;assume關聯段暫存器與段定義
codeseg segment
mov ax,dataseg
mov ds,ax
mov ax,stackseg
mov ss,ax
;mov ah,4ch
int21h
codeseg ends
dataseg segment
;cdataseg ends
stackseg segment
;stackseg ends
end格式二:
.model small
.stack 100h ;規定棧大小
.data
;.code
[label] proc far
mov ax,@data
mov ds,ax
; mov ah,4ch
int 21h
[label] endp
end [label]
格式三:
.model small ; 設定8086匯程式設計序使用small model
.8086 ; 設定採用8086彙編指令集
.stack 100h ; 定義256位元組容量的堆疊
.data ; 定義資料段
.code ; code segment definition
.startup ; 定義匯程式設計序執行入口點
; end ;指示匯程式設計序結束編譯
格式四:
org 100h
;
注意程式執行時會保留頭部100h的記憶體空間來儲存資訊
當然,也可以在**段使用資料,這是資料將儲存在**段,可以利用cs:ip來使用這些資料。也可以在**段使用棧,基本**如下:
movax,cs
movss,ax
movsp,30h ;堆疊指標指向cs:30h,當然,在**段前面部分需要分配相對應大小的資料空間。
但是為了程式結構清晰,最好**資料堆疊分開放置
組合語言 AT T組合語言
這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...
組合語言筆記
1 暫存器操作 cs暫存器不能用mov指令賦值,需要用jmp等調轉指令。但還可以將cs暫存器的值mov到暫存器或者記憶體 ds暫存器可以用mov賦值,通常是這樣操作 mov bx 位址 mov ds bx。可以將ds中的值mov到暫存器或者記憶體。2 實模式和保護模式 實模式 實模式下訪問記憶體是通...
組合語言筆記
原作者是哪位大佬已經不可考,寫的挺好的 一波,侵刪 8086有14個暫存器 控制暫存器 ip flag 段暫存器 8086中 中的 只能是bx bp si di。此時bp預設ss段,di預設es段,bx si預設ds。16位 flags 32位 eflags 標誌位控制標誌位 系統標誌位 影響標誌暫...