(八)內(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):附加段寄存器