CTF之旅 從組合語言(王爽)開始

2021-08-21 20:54:07 字數 2092 閱讀 7179

程式和資料的區別在於訪問方式,如果是通過cs:ip訪問則是程式,如果是任意一種儲存方式訪問則是資料。

棧:lifo 先進後出。入棧時棧頂從高位址向低位址方向增長。

8086cpu中可以將一段記憶體當做棧來使用,且其入棧和出棧操作都是以字為單位進行的

8086cpu中:段暫存器ss存放棧頂的段位址,暫存器sp存放偏移位址

任意時刻:ss:sp指向棧頂元素。

push ax 時sp=sp-2,ss:sp指向當前棧上面字的棧頂,以當前棧上面字的棧頂單元為新棧頂。

當棧為空時棧頂指向棧底的下乙個位元組。比如:

若將10000h~1000fh當做棧,初始狀態棧為空,則此時ss=1000h,sp=0010h,

即1000f的下乙個高位元組為位址。

pop ax 時將ss:sp指向的單元資料送入棧,sp=sp+2,ss:sp指向當前棧頂下面的單元,以此單元為新棧頂。但此時pop的資料任然在原來的記憶體單元處,只是一杯認為他在棧中。

當棧滿時執行push 指令入棧,或棧空時執行pop指令出棧,都將發生棧頂超界問題。

8086cpu不保證我們對棧的操作不會越界,它只考慮當前的情況:當前棧頂在何處、當前要執行的命令是哪一條,而不知道棧空間有多大,要執行的指令是多少。

所以我們在程式設計時要小心棧頂超界問題。

push pop可以對暫存器,段暫存器和記憶體單元進行操作。

mov ax,1000h

mov ss,ax

mov sp,0010h

這三行**將10000h~1000fh這段空間當做棧。

注意:mov指令要給出要訪問的記憶體單元,而push和pop指令不在指令中給出記憶體單元,而是有ss:sp給出。

mov指令只需要一步操作,就是傳送,而push和pop指令需要兩步操作,push時,先改變sp,在向ss:sp處傳送,執行pop時,先讀取ss:sp處的資料,後改變sp。

push pop等棧操作指令,只修改sp,也就是說,棧頂的變化範圍最大為0~ffffh

當棧空間為10000h~1ffffh時,初始空棧,則ss=1000h,sp=0000h,乙個棧的最大容量為64kb,滿棧壓棧和空棧出棧都會使棧頂環繞。

總結:若要將記憶體定義為資料段,則將它的段位址放在ds中,用mov sub add等指令訪問記憶體單元時,cpu會將其作為資料訪問,

若要將記憶體定義為**段,就將它的段位址放在cs中,將段中第一條指令的偏移位址放在ip中,cpu會執行指令

若要將記憶體單元定義為棧段,就將它的段位址放在ss中,將棧頂單元的偏移位址放在sp中,這樣cpu執行push pop等指令時,會將其作為棧空空間使用。

一段記憶體既可以是**的儲存空間,又是資料的儲存空間,還可以是棧空間,也可以什麼都不是,關鍵在於cpu暫存器的設定。

debug的t命令在執行修改暫存器ss的指令時,下一條指令也緊接著執行。

組合語言包含兩種指令,一種是彙編指令,一種是偽指令,彙編指令有對應的機器碼,可以被編譯為機器指令,cpu執行。偽指令沒有對應的機器指令,最終不被cpu執行,而被編譯器執行。

segment和ends是一對成對使用的偽指令,這是在編譯器編譯的匯程式設計序時,必須要用到的一對偽指令,它定義了乙個段,該段必須有乙個名詞來標識,格式為:

段名 segment

:段名 ends

乙個有意義的匯程式設計序至少要有乙個段,用來存放**。

end是乙個匯程式設計序結束的標記。

codesg segment  ...  codesg ends 定義了乙個名為codesg的段,在這個段中存放**,所以這是乙個**段。程式開頭,用assume cs:codesg 將用作**段的段codesg和cpu中的段暫存器cs聯絡起來了。

具體**為:

assume cs:codesg

codesg segment

codesg ends

如何寫源程式:

1。定義乙個段,2。寫入彙編指令3。指出程式結束位置4.。與暫存器聯接5.。程式返回。加上mov ax,4c00h  int 21h

段結束:段名 ends

編譯程式結束 end

程式返回: mov ax,4c00h    int  21h

程式在編譯時被編譯器發現的錯誤是語法錯誤(易發現),執行時發生的錯誤是邏輯錯誤(難發現)。

組合語言 王爽

cpu有三條匯流排 位址 資料 控制線 位址匯流排確定儲存單元 控制匯流排傳送指令 資料匯流排 傳輸資料 cpu n個位址線 位址匯流排寬度為n 可以尋找2 n個記憶體單元 儲存單元 0開始編號,乙個儲存單元可以儲存乙個byte 8086cpu有16根位址線 1bit就是一根位址線 注意 儲存器以b...

組合語言 王爽 筆記

關於pop的知識 1.出棧後,ss sp指向新的棧頂,pop操作前的棧頂元素中的資料仍然存在,但是,它已不再棧中 2.ss和sp只記錄了棧頂的位址,依靠ss和sp可以保證在入棧和出棧時找到棧頂 3.當棧滿的時候再次使用push指令入棧,棧空的時候再次使用pop指令出棧,都將發生棧頂越界問題,它是非常...

組合語言 王爽 筆記

1.乙個組合語言程式從寫出到最終執行的簡要過程 編寫,編譯連線,執行 2.可執行檔案中包含兩部分內容 一是程式 從源程式中的彙編指令翻譯過來的機器碼 和資料 源程式中定義的資料 二是相關的描述資訊 eg 程式的大小,要佔的記憶體空間等 3.彙編指令是指有對應的機器碼的指令,可以被編譯為機器指令,最終...