这个怎么弄啊
要求在一个 0 级代码段中将源数据段中的一段数据传输到目标数据段中。其中所有
段的段描述符均放臵在全局描述符表 GDT 中。
要求在一个 0 级代码段中将源数据段中的一段数据传输到目标数据段中段描述符均放臵在全局描述符表 GDT 中。
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
5条回答 默认 最新
- kiki1566 2016-05-25 10:42关注
具体来说可以这么实现:
在程序开始声明一个数据段‚ 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本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报