(八)內存分段管理
1.物理地址=基礎地址(段地址*0x10)+偏移地址
所以采用分段的內存管理:
2.在編程時可以根據(jù)需要寸癌,將若干連續(xù)地址的內存單元看做一個段瓶蚂,用段地址×16定為段的起始地址(基礎地址)强霎,用偏移地址定位段中的內存單元鸯两。
->段地址×16必然是16的倍數(shù)闷旧,所以一個段的起始地址(基礎地址)也一定是16的倍數(shù)
->偏移地址為16位,16位地址的尋址能力為64KB钧唐,所以一個段的長度最大為64KB
結論:偏移地址:0-0xFFFF ?64KB個內存單元忙灼,加入給的段地址為0x10000 ?CPU尋址范圍為0x10000-0x1FFFF
(九)段寄存器
以8086CPU為例:
8086有4個段寄存器:CS、DS钝侠、SS该园、ES,當CPU需要訪問內存時由這4個段寄存器提供內存單元的段地址
->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
.........
在內存或者磁盤上,指令和數(shù)據(jù)沒有任何區(qū)別忽舟,都是二進制信息双妨,CPU將CS:IP指向的內存單元的內容看做指令
2.jmp指令
mov指令不能用于設置CS淮阐、IP的值,8086提供了另外的指令來修改CS斥难、IP的值枝嘶,這些指令統(tǒng)稱為轉移指令,最簡單的是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要讀寫一個內存單元時镀裤,必須要先給出這個內存單元的地址竞阐,在8086中,內存地址由段地址和偏移地址組成8086中有一個DS段寄存器暑劝,通常用來存放要訪問數(shù)據(jù)的段地址
-> mov bx,1000H
-> mov ds,bx
-> mov al,[0]
*上面3條指令的作用將10000H(1000:0)中的內存數(shù)據(jù)賦值到al寄存器中
*mov al,[address]的意思將DS:address中的內存數(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和相關寄存器中的數(shù)值
3.再次體會:數(shù)據(jù)和程序有區(qū)別嗎?如何確定內存中的信息哪些是數(shù)據(jù),哪些又是程序?
以上。
->SS (Stack Segment):堆棧段寄存器
->ES (Extra Segment):附加段寄存器