匯編二

(八)內(nèi)存分段管理

1.物理地址=基礎(chǔ)地址(段地址*0x10)+偏移地址

所以采用分段的內(nèi)存管理:

2.在編程時可以根據(jù)需要,將若干連續(xù)地址的內(nèi)存單元看做一個段,用段地址×16定為段的起始地址(基礎(chǔ)地址),用偏移地址定位段中的內(nèi)存單元。

->段地址×16必然是16的倍數(shù),所以一個段的起始地址(基礎(chǔ)地址)也一定是16的倍數(shù)

->偏移地址為16位,16位地址的尋址能力為64KB,所以一個段的長度最大為64KB

結(jié)論:偏移地址:0-0xFFFF ?64KB個內(nèi)存單元,加入給的段地址為0x10000 ?CPU尋址范圍為0x10000-0x1FFFF


(九)段寄存器

以8086CPU為例:

8086有4個段寄存器:CS、DS、SS、ES,當CPU需要訪問內(nèi)存時由這4個段寄存器提供內(nèi)存單元的段地址

->CS (Code Segment):代碼段寄存器

1.CS為代碼段寄存器,IP為指令指針寄存器,它們指示了CPU當前要讀取指令的地址:例如

->CS:IP : 2000H:0000H

->執(zhí)行mov ax,0123H -> AX:0123H -> CS:IP : 2000H:0003H

->執(zhí)行mov bx,0003H -> BX:0003H -> CS:IP : 2000H:0006H

->執(zhí)行mov ax,bx ?-> AX:0003H -> CS:IP 2000H:0008H

->執(zhí)行add ax,bx -> AX:0006H ->CS:IP 2000H:000AH

.........

在內(nèi)存或者磁盤上,指令和數(shù)據(jù)沒有任何區(qū)別,都是二進制信息,CPU將CS:IP指向的內(nèi)存單元的內(nèi)容看做指令

2.jmp指令

mov指令不能用于設置CS、IP的值,8086提供了另外的指令來修改CS、IP的值,這些指令統(tǒng)稱為轉(zhuǎn)移指令,最簡單的是jmp指令:



練習:

-> CS:IP ?2000H:0000H -> 執(zhí)行20000H處指令 -> mov ax,6622H -> AX:6622H -> CS:IP 2000H:0003H

-> 執(zhí)行20003H處指令 -> jmp 1000:3 -> CS:IP 1000H:0003H

-> 執(zhí)行10003H處指令 -> mov ax,0000 -> AX:0000H ->CS:IP 1000H:0006H

-> 執(zhí)行10006H處指令 -> mov bx, ax ->BX:0000H ->CS:IP 1000H:0008H

-> 執(zhí)行10008H處指令 -> jmp bx -> CS:IP 1000H:0000H

-> 執(zhí)行10000H處指令 -> mov ax 0123H ->AX:0123H -> CS:IP 1000H:0003H

-> 開始陷入死循環(huán)

由此可以看出,每次讀取命令CPU會改變一次IP,執(zhí)行到jmp時會多改變一次IP。


->DS (Data Segment):數(shù)據(jù)段寄存器

1.DS ?[address]

CPU要讀寫一個內(nèi)存單元時,必須要先給出這個內(nèi)存單元的地址,在8086中,內(nèi)存地址由段地址和偏移地址組成8086中有一個DS段寄存器,通常用來存放要訪問數(shù)據(jù)的段地址

-> mov bx,1000H

-> mov ds,bx

-> mov al,[0]

*上面3條指令的作用將10000H(1000:0)中的內(nèi)存數(shù)據(jù)賦值到al寄存器中

*mov al,[address]的意思將DS:address中的內(nèi)存數(shù)據(jù)賦值到al寄存器中

*由于al是8位寄存器,所以是將一個字節(jié)的數(shù)據(jù)賦值給al寄存器

練習1:寫出下面指令執(zhí)行后寄存器ax,bx,cx中的值


1.AX: 1000H

2.DS: 1000H

3.AX: 1123H

4.BX: 6622H

5.CX: 2211H

6.BX: 8833H

7.CX:8833H

----> AX:1123H ? BX:8833H ?CX:8833H

練習2:寫出下面指令執(zhí)行后寄存器ax,bx中的值

1.AX 1000H

2.DS 1000H

3.AX 11316 = 2C34H?

4.10000H:34 ?10001H:2C ?10002H:22 ?10003H:11

5.BX 2C34

6.10000H:34? 10001H:2C? 10002H:22? 10003H:11

7.BX 1B12

8.10000H:34? 10001H:2C? 10002H:12? 10003H:1B


指令的概念:

練習:

各寄存器的初始值:CS=2000H,IP=0,DS=1000H,AX=0,BX=0;

1.寫出CPU執(zhí)行的指令序列(用匯編指令寫出)

2.寫出CPU執(zhí)行完指令后,CS,IP和相關(guān)寄存器中的數(shù)值

3.再次體會:數(shù)據(jù)和程序有區(qū)別嗎?如何確定內(nèi)存中的信息哪些是數(shù)據(jù),哪些又是程序?


以上。

->SS (Stack Segment):堆棧段寄存器

->ES (Extra Segment):附加段寄存器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容