程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> gdn-要求在一個 0 級代碼段中將源數據段中的一段數據傳輸到目標數據段中段描述符均放臵在全局描述符表 GDT 中。

gdn-要求在一個 0 級代碼段中將源數據段中的一段數據傳輸到目標數據段中段描述符均放臵在全局描述符表 GDT 中。

編輯:編程解疑
要求在一個 0 級代碼段中將源數據段中的一段數據傳輸到目標數據段中段描述符均放臵在全局描述符表 GDT 中。

這個怎麼弄啊
要求在一個 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

kiki1566
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved