1. 程式人生 > >彙編學習第二課之 CS:IP,DS,SS:SP 暫存器

彙編學習第二課之 CS:IP,DS,SS:SP 暫存器

日期:2016-05-03 星期二
彙編學習方法,先熟悉下基本的彙編指令,然後開始看滴水逆向視訊教程,逆向下基本的語句,比如條件語句,迴圈語句,等等.一定要自己多動手實踐,才能更好的理解其中的原理.知道基本的原理後,去踏踏實實的寫c程式碼來反彙編.

1、DS暫存器(Data segment)
CPU根據DS暫存器和任意一個通用暫存器的值或其他數值組成的資料段實體地址

mov DS:[13ABH] ,1234H
將16進位制常量1234H賦值給DS×16+偏移地址13ABH 的實際實體記憶體。
或 mov [13ABH] , 1234H
預設是將段暫存器DS的內容作為基地址

2、CS:IP 暫存器:
CPU通過CS:IP暫存器中的內容找到要執行的程式碼片段所在的實際實體記憶體地址

CS暫存器:儲存CPU將要執行程式碼所在實體記憶體的基地址
IP暫存器:儲存CPU將要執行程式碼所在實體記憶體的 偏移地址

CS:IP是搭配在一起使用的.

3、搭建彙編實驗環境
環境:xp+cmd(debug)

cmd.exe debug模式下-r命令實現當前系統的暫存器的內容
-u cs:0100 #檢視cs:0100 表示的記憶體中的內容,並且內容已經轉為正常人看的懂的彙編指令了
-t:跟蹤程式碼執行過程
例項:要求把ax、bx、cx的內容分別入棧,最後以相反順序輸出
before ax:1234H,bx:7ba1H,cx:2213H
after ax:2213H,bx:7ba1H,cx:1234H
-a (進入彙編編輯模式)
0B5D:0100 mov ax,1234
0B5D:0103 mov bx,7ba1
0B5D:0106 mov cx,2213
0B5D:0109 push ax
0B5D:010A push bx
0B5D:010B push cx
0B5D:010C pop ax
0B5D:010D pop bx
0B5D:010E pop cx
0B5D:010F

4.loop指令和bx指令
loop指令的格式是:loop標號,cpu執行loop指令的時候,要進行兩步操作
1:(cx)=(cx)-1
2:判斷cx中的值,不為零則轉至標號處執行,如果為零,則向下執行

assume cs:codesg
codesg segment
start: mov ax,0#初始化ax和cx的值
mov cx,20
s: add ax,2
loop s

mov ax,4c00H
int 21H

codesg ends
end start

bx 和 loop指令
寫彙編程式碼經常應用到[0]、[1]等標誌,方括號中的數字表示某個偏移地址,該地址同段地址一起表示某個記憶體的位置。但是,masm等編譯器實際上不支援[n]這樣的寫法,在程式碼中的[1]、[2]實際上會被處理成1、2等數字型常量,而不是我們希望的偏移 地址。

push ax
將ax的內容送入ss:sp指向的棧頂記憶體單元
sp = sp -2此時sp指向新的棧定單元
入棧資料從高位元組向低位元組排列,出棧相反.

pop ax
將SS:SP指向的棧頂記憶體單元內容送入ax暫存器
sp=sp+2,此時SS:SP指向新的棧頂單元
出棧資料從低位元組向高位元組排列

描述一個記憶體單元,需要兩種資訊:1.記憶體單元的地址 2.記憶體單元的長度
bx中存放的資料作為一個偏移地址EA,段地址SA預設在ds中,將SA:EA處的資料送入ax中

彙編是個很抽象的東西,學習起來不是很容易理解,所以一定要在平時多實踐多練習才能更好的掌握它。