指令的執(zhí)行
指令的長(zhǎng)度是可以是多個(gè)字節(jié)
- cpu從cs:ip所指向的內(nèi)存單元中讀取指令菠齿,存放到指令緩存器中
- ip=ip+所讀指令的長(zhǎng)度糠惫,從而指向下一條指令
- 執(zhí)行指令緩存器的內(nèi)容骑疆,回到下一個(gè)步驟
這個(gè)順序是很重要的贿肩,為什么要使用2和3的順序哪座哩,這是因?yàn)楫?dāng)我們調(diào)用一個(gè)函數(shù)時(shí)使用這種方式很好用
我們可以得出結(jié)論苍凛,數(shù)據(jù)和指令是沒(méi)有差別的趣席,當(dāng)使用讀取cs:ip指向的地址,cpu便將其當(dāng)成指令執(zhí)行
debug使用
-u 表示顯示出當(dāng)前位置的代碼
-u 段地址:偏移地址 顯示指定位置的代碼
-d 表示顯示當(dāng)前位置的數(shù)據(jù)
-u 段地址:偏移地址 顯示指定位置的數(shù)據(jù)
-a 表示直接在當(dāng)前位置寫入指令
-a 段地址:偏移地址 表示在指定的位置寫入指令
-r 表示顯示當(dāng)前寄存器的內(nèi)容
-r 寄存器 然后顯示指定寄存器的內(nèi)容在下一行寫入 :2000表示將這個(gè)寄存器的內(nèi)容設(shè)置成2000
-e 段地址:偏移地址 可以改寫內(nèi)存的內(nèi)容
jmp指令
jmp是轉(zhuǎn)移指令是jump的簡(jiǎn)寫醇蝴,表示跳躍的意思宣肚。
指令的格式: jmp 2000:0表示將cs設(shè)置成2000,將ip設(shè)置成0悠栓,因此這個(gè)指令能夠改變指令執(zhí)行的位置
cs和ip寄存器是不能夠使用mov來(lái)進(jìn)行更改的霉涨,只能使用jmp來(lái)改變
比如 mov cs,1000是錯(cuò)誤的
還可以使用
jmp 寄存器
的方式來(lái)更改ip的內(nèi)容
call 函數(shù)名 表示函數(shù)的開(kāi)始
這個(gè)指令也是一個(gè)轉(zhuǎn)移指令惭适,但是這個(gè)指令和jmp還是有區(qū)別的笙瑟,因?yàn)閏all指令會(huì)保存一個(gè)當(dāng)前的執(zhí)行到的位置保存在內(nèi)存中。
ret 這個(gè)指令是在函數(shù)的結(jié)束的一個(gè)指令癞志,他的操作是將call指令執(zhí)行時(shí)保存的那個(gè)地址還原回來(lái)逮走。
上面兩個(gè)的作用實(shí)現(xiàn)了函數(shù)的調(diào)用
我們可以使用
-e 2000:0
輸入數(shù)據(jù)
-r cs
:2000
-r ip
:0
表示改變cs:ip
現(xiàn)在我們便可以執(zhí)行了
問(wèn)題:
call指令將ip這個(gè)偏移地址值存放到那里去了 ret可以拿回
小端法 表示高位在高地址 低位在低地址
ds段地址寄存器
mov al,ds:[0]
mov al,ds:[1]
mov ax,ds:[0]
mov ax,ds:[1]
mov ds:[0],ax
mov ds:[1],ax
mov ds:[0],al
mov ds:[1],al
mov ax,[1]
字節(jié)型數(shù)據(jù)和自行數(shù)據(jù)在內(nèi)存中的存放
使用小端法進(jìn)行存放
ds段地址寄存器 數(shù)據(jù)段寄存器
cs和指令有關(guān)
棧 是一段連續(xù)的存儲(chǔ)單元
入棧和出棧的數(shù)據(jù)長(zhǎng)度都是16位的,因此push和pop的對(duì)象都是16位的
棧頂標(biāo)記 在入棧時(shí)決定了押入棧的數(shù)據(jù)
棧頂標(biāo)記是內(nèi)存地址 內(nèi)存地址是使用段地址和偏移地址表示的
在8086cpu中 將段地址寄存器ss和偏移地址寄存器sp所組合的內(nèi)存地址當(dāng)成棧頂標(biāo)記
因此ss和sp只能確定一個(gè)地址 棧頂?shù)刂?/p>
push的工作原理表示將數(shù)據(jù)入棧,然后sp=sp-2
pop的工作原理表示將數(shù)據(jù)出棧师溅,然后sp=sp+2
使用 d ss:偏移地址可以顯示棧的數(shù)據(jù)
在入棧時(shí)會(huì)將寄存器的值放入棧中
我們可以控制棧的位置和大小
比如我們更改ss的值來(lái)設(shè)置棧的位置 設(shè)置sp的大小來(lái)決定棧的大小茅信,這樣便可以在sp處入棧,直到ss*10h處
所以說(shuō)我們可以隨便設(shè)置一個(gè)棧的地址
棧頂?shù)脑浇鐔?wèn)題
當(dāng)數(shù)據(jù)的存儲(chǔ)滿時(shí)墓臭,還繼續(xù)push變會(huì)棧的越界蘸鲸,會(huì)破壞其他的數(shù)據(jù)
pop和push只影響sp的值
sp的變化的范圍 0~ffffH
因此棧的大小是有范圍的 如果超過(guò)這個(gè)返回會(huì)覆蓋棧的內(nèi)容,因?yàn)閟s是不變的窿锉,sp會(huì)變酌摇,sp從某個(gè)值一直減小到0,然后又從ffffH繼續(xù)減小嗡载,會(huì)覆蓋原來(lái)存入棧的內(nèi)容
如果我們需要使用函數(shù)需要設(shè)置ss和sp來(lái)設(shè)置一個(gè)棧窑多,然后使用call指令,這個(gè)call指令有兩個(gè)作用洼滚,一個(gè)是保存當(dāng)前的ip值到棧的最高位置中埂息,另一個(gè)是設(shè)置ip的新值來(lái)獲取函數(shù)的執(zhí)行地址。
棧的作用便是臨時(shí)性保存數(shù)據(jù)遥巴,這是因?yàn)榧拇嫫魇呛苌俚那Э担?dāng)執(zhí)行另外一個(gè)功能時(shí),我們需要臨時(shí)保存數(shù)據(jù)到內(nèi)存中铲掐,否則當(dāng)其他代碼使用寄存器時(shí)會(huì)覆蓋掉寄存器的內(nèi)容拾弃。
棧的作用