這個怎麼弄啊
要求在一個 0 級代碼段中將源數據段中的一段數據傳輸到目標數據段中。其中所有
段的段描述符均放臵在全局描述符表 GDT 中。
具體來說可以這麼實現:
在程序開始聲明一個數據段‚ DSEG‛,來描述這三個段的描述符,其中有代碼段描述符CODEM,源數據段描述符 DATAS 和目標數據段描述符 DATAD,將它們相應的選擇子分別定義為 CODEM_SEL, DATAS_SEL, DATAD_SEL,為這三個段分別定義描述符。
再定義GDN
部分代碼:
DSEG SEGMENT USE16 ;定義 16 位數據段
GDT LABEL BYTE ;全局描述符表
DUMMY DESC <> ;空描述符
CODEM DESC ;代碼段描述符
DATAS DESC ;源數據段描述符
DATAD DESC ;目標數據段描述符
VGDTR PDESC ;偽描述符
GDTLEN = $-GDT ;全局描述符表長度
CODEM_SEL = CODEM-GDT ;代碼段選擇子
DATAS_SEL = DATAS-GDT ;源數據段選擇子
DATAD_SEL = DATAD-GDT ;目標數據段選擇子
DSEG ENDS ;數據段定義結束
............................
..........................
START PROC
MOV AX,DSEG
MOV DS,AX
;准備要加載到 GDTR 的偽描述符
MOV BX,16 ;計算並設臵 GDT 基地址
MUL BX ;數據段地址左移 4 位
MOV WORD PTR VGDTR.BASE,AX ;將得到的物理地址填入 VGDTR 描述符
MOV WORD PTR VGDTR.BASE+2,DX
;設臵代碼段描述符
MOV AX,CS ;計算並設臵代碼段基址
MUL BX ;代碼段地址左移 4 位
MOV WORD PTR CODEM.BASEL,AX ;代碼段開始偏移為 0
MOV BYTE PTR CODEM.BASEM,DL ;將得到的物理地址填入 CODEM 描述符
MOV BYTE PTR CODEM.BASEH,DH
;設臵源數據段描述符
MOV AX,DSEG1 ;計算並設臵源數據段基址
MUL BX ;;源數據段地址左移 4 位
ADD AX,OFFSET TDATA ;加上 TDATA 的偏移得到物理地址
ADC DX,0
MOV WORD PTR DATAS.BASEL,AX ;將得到的物理地址填入 DATAS 描述符
MOV BYTE PTR DATAS.BASEM,DL
MOV BYTE PTR DATAS.BASEH,DH
;加載 GDTR
LGDT QWORD PTR VGDTR
CLI ;關中斷
;切換到保護方式
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
;清指令預取隊列,並真正進入保護方式
JUMP16 ,
VIRTUAL: ;現在開始在保護方式下運行
MOV AX,DATAS_SEL
MOV DS,AX ;加載源數據段描述符
MOV AX,DATAD_SEL
MOV ES,AX ;加載目標數據段描述符
XOR DI,DI ;DI 清零
XOR SI,SI ;SI 清零
MOV CX,D1LEN ;設臵數據長度
M1: MOVSB ;通過串傳送指令傳數
LOOP M1
;切換回實模式
MOV EAX,CR0
AND AL,11111110B
MOV CR0,EAX
;清指令預取隊列,進入實方式
JUMP16 ,
REAL: ;現在又回到實方式
STI ;開中斷
MOV AX,4C00H
INT 21H ;程序終止
START ENDP