谁有杨季文的T10-3.asm代码,要能编译通过的并能运行
时间:2010-12-27
来源:互联网
我下载的t10-3.asm和386scd.asm,并放在同一个目录,然后分别用masm5.1和tasm3.0编译,发现大量的错误,可是
我把源代码和书上去对,好像没有发现和书上写的有什么不同,不在哪位有t10-3.asm和386scd.asm,能编译通过的
并能运行,给我分享下吗?谢谢
我把源代码和书上去对,好像没有发现和书上写的有什么不同,不在哪位有t10-3.asm和386scd.asm,能编译通过的
并能运行,给我分享下吗?谢谢
作者: leetow2003 发布时间: 2010-12-27
如果我是你会把源程序发出来 大家找错误。
作者: znxllyuan 发布时间: 2010-12-27
那本书印刷错误非常多! 我放弃啦。
作者: masmaster 发布时间: 2010-12-27
系统提示回复内容太长,我就一个一个回
一、
;文件名:386SCD.ASM
;内容: 符号常量等的定义
;----------------------------------------------
;存储段描述符/系统段描述符结构类型的定义
DESCRIPTOR STRUC
LIMITL DW 0 ;段界限(0~15)
BASEL DW 0 ;段基地址(0~15)
BASEM DB 0 ;段基地址(16~23)
ATTRIBUTES DW 0 ;段属性
BASEH DB 0 ;段基地址(24~31)
DESCRIPTOR ENDS
;-------------------------------------------------------
;门描述符结构类型的定义
GATE STRUC ;门结构类型的定义
OFFSETL DW 0 ;32位偏移的低16位
SELECTOR DW 0 ;选择子
DCOUNT DB 0 ;双字计数字段
GTYPE DB 0 ;类型
OFFSETH DW 0 ;32位偏移的高16位
GATE ENDS
;--------------------------------------------------------
;伪描述符结构类型的定义
PDESC STRUC
LIMIT DW 0 ;16位界限
BASE DD 0 ;基地址
PDESC ends
;-----------------------------------------------------------
;任务状态段TSS结构类型的定义
TASKSS STRUC
TRLINK DW ?,0 ;链接字
TRESP0 DD ? ;0级堆栈指针
TRSS0 DW ?,0 ;
TRESP1 DD ? ;1级堆栈指针
TRSS1 DW ?,0
TRESP2 DD ? ;2级堆栈指针
TRSS2 DW ?,0
TRCR3 DD ? ;CR3
TREIP DD ? ;EIP
TREFLAG DW ?,? ;EFLAGS
TREAX DD ? ;EAX
TRECX DD ? ;ECX
TREDX DD ? ;EDX
TREBX DD ? ;EBX
TRESP DD ? ;ESP
TREBP DD ? ;EBP
TRESI DD ? ;ESI
TREDI DD ? ;EDI
TRES DW ?,0 ;ES
TRCS DW ?,0 ;CS
TRSS DW ?,0 ;SS
TRDS DW ?,0 ;DS
TRFS DW ?,0 ;FG
TRGS DW ?,0 ;GS
TRLDT DW ?,0 ;LDT
TRFLAG DW 0 ;TSS的特别属性字
TRIOMAP DW $+2 ;指向I/0许可位图区的指针
TASKSS ENDS
;--------------------------------------------------------------
;存储段描述符类型值说明
ATDR = 90H ;存在的只读数据段类型值
ATDW = 92H ;存在的可读写数据段类型值
ATDWA = 93H ;存在的已访问可读写数据段类型值
ATCE = 98H ;存在的只执行代码段类型值
ATCER = 9AH ;存在的可执行可读代码段类型值
ATCCO = 9CH ;存在的只执行一致代码段类型值
ATCCOR = 9EH ;存在的可执行可读一致代码段类型值
;系统段描述符和门描述符类型值说明
ATLDT = 82H ;局部描述符表段类型值
ATTASKGAT = 85H ;任务门类型值
AT386TSS = 89H ;386TSS类型值
AT386CGAT = 8CH ;386调用门类型值
AT386IGAT = 8EH ;386中断门类型值
AT386TGAT = 8FH ;386陷阱门类型值
;------------------------------------------------------------------
;DPL和RPL值说明
DPL1 = 20H ;DPL=1
DPL2 = 40H ;DPL=2
DPL3 = 60H ;DPL=3
RPL1 = 01H ;RPL=1
RPL2 = 02H ;RPL=2
RPL3 = 03H ;RPL=3
IOPL1 = 1000H ;IOPL=1
IOPL2 = 2000H ;IOPL=2
IOPL3 = 3000H ;IOPL=3
;-------------------------------------------------------
;其它常量值说明
D32 = 4000H ;32位代码段标志
TIL = 04H ;TI=1(描述符表标志)
VMFL = 0002H ;VMF=1
IFL = 0200H ;IF=1
;-----------------------------------------------
;32位偏移的段间转移宏指令
JUMP32 MACRO selector, offsetv
DB 0EAH ;操作码
DW offsetv ;32位偏移
DW 0
DW selector ;选择子
ENDM
;-----------------------------------------------
;32位偏移的段间调用宏指令
CALL32 MACRO selector, offsetv
DB 9AH ;操作码
DW offsetv ;32位偏移
DW 0
DW selector ;选择子
ENDM
;----------------------------------------------
;16位偏移的段间转移宏指令
JUMP16 MACRO selector, offsetv
DB 0EAH ;操作码
DW offsetv ;16位偏移
DW selector ;段值/选择子
ENDM
;---------------------------------------------
;16位偏移的段间调用宏指令
CALL16 MACRO selector, offsetv
DB 9AH ;操作码
DW offsetv ;16位偏移
DW selector ;段值/选择子
ENDM
一、
;文件名:386SCD.ASM
;内容: 符号常量等的定义
;----------------------------------------------
;存储段描述符/系统段描述符结构类型的定义
DESCRIPTOR STRUC
LIMITL DW 0 ;段界限(0~15)
BASEL DW 0 ;段基地址(0~15)
BASEM DB 0 ;段基地址(16~23)
ATTRIBUTES DW 0 ;段属性
BASEH DB 0 ;段基地址(24~31)
DESCRIPTOR ENDS
;-------------------------------------------------------
;门描述符结构类型的定义
GATE STRUC ;门结构类型的定义
OFFSETL DW 0 ;32位偏移的低16位
SELECTOR DW 0 ;选择子
DCOUNT DB 0 ;双字计数字段
GTYPE DB 0 ;类型
OFFSETH DW 0 ;32位偏移的高16位
GATE ENDS
;--------------------------------------------------------
;伪描述符结构类型的定义
PDESC STRUC
LIMIT DW 0 ;16位界限
BASE DD 0 ;基地址
PDESC ends
;-----------------------------------------------------------
;任务状态段TSS结构类型的定义
TASKSS STRUC
TRLINK DW ?,0 ;链接字
TRESP0 DD ? ;0级堆栈指针
TRSS0 DW ?,0 ;
TRESP1 DD ? ;1级堆栈指针
TRSS1 DW ?,0
TRESP2 DD ? ;2级堆栈指针
TRSS2 DW ?,0
TRCR3 DD ? ;CR3
TREIP DD ? ;EIP
TREFLAG DW ?,? ;EFLAGS
TREAX DD ? ;EAX
TRECX DD ? ;ECX
TREDX DD ? ;EDX
TREBX DD ? ;EBX
TRESP DD ? ;ESP
TREBP DD ? ;EBP
TRESI DD ? ;ESI
TREDI DD ? ;EDI
TRES DW ?,0 ;ES
TRCS DW ?,0 ;CS
TRSS DW ?,0 ;SS
TRDS DW ?,0 ;DS
TRFS DW ?,0 ;FG
TRGS DW ?,0 ;GS
TRLDT DW ?,0 ;LDT
TRFLAG DW 0 ;TSS的特别属性字
TRIOMAP DW $+2 ;指向I/0许可位图区的指针
TASKSS ENDS
;--------------------------------------------------------------
;存储段描述符类型值说明
ATDR = 90H ;存在的只读数据段类型值
ATDW = 92H ;存在的可读写数据段类型值
ATDWA = 93H ;存在的已访问可读写数据段类型值
ATCE = 98H ;存在的只执行代码段类型值
ATCER = 9AH ;存在的可执行可读代码段类型值
ATCCO = 9CH ;存在的只执行一致代码段类型值
ATCCOR = 9EH ;存在的可执行可读一致代码段类型值
;系统段描述符和门描述符类型值说明
ATLDT = 82H ;局部描述符表段类型值
ATTASKGAT = 85H ;任务门类型值
AT386TSS = 89H ;386TSS类型值
AT386CGAT = 8CH ;386调用门类型值
AT386IGAT = 8EH ;386中断门类型值
AT386TGAT = 8FH ;386陷阱门类型值
;------------------------------------------------------------------
;DPL和RPL值说明
DPL1 = 20H ;DPL=1
DPL2 = 40H ;DPL=2
DPL3 = 60H ;DPL=3
RPL1 = 01H ;RPL=1
RPL2 = 02H ;RPL=2
RPL3 = 03H ;RPL=3
IOPL1 = 1000H ;IOPL=1
IOPL2 = 2000H ;IOPL=2
IOPL3 = 3000H ;IOPL=3
;-------------------------------------------------------
;其它常量值说明
D32 = 4000H ;32位代码段标志
TIL = 04H ;TI=1(描述符表标志)
VMFL = 0002H ;VMF=1
IFL = 0200H ;IF=1
;-----------------------------------------------
;32位偏移的段间转移宏指令
JUMP32 MACRO selector, offsetv
DB 0EAH ;操作码
DW offsetv ;32位偏移
DW 0
DW selector ;选择子
ENDM
;-----------------------------------------------
;32位偏移的段间调用宏指令
CALL32 MACRO selector, offsetv
DB 9AH ;操作码
DW offsetv ;32位偏移
DW 0
DW selector ;选择子
ENDM
;----------------------------------------------
;16位偏移的段间转移宏指令
JUMP16 MACRO selector, offsetv
DB 0EAH ;操作码
DW offsetv ;16位偏移
DW selector ;段值/选择子
ENDM
;---------------------------------------------
;16位偏移的段间调用宏指令
CALL16 MACRO selector, offsetv
DB 9AH ;操作码
DW offsetv ;16位偏移
DW selector ;段值/选择子
ENDM
作者: leetow2003 发布时间: 2010-12-27
二、
;程序名:T10-3.ASM
;演示任务内无特权级变换的转移
;
INCLUDE 386SCD.ASM ;文件386SCD.ASM含有关结构、
;宏指令和符号常量的定义
.386P
;-------------------------------------------
;全局描述符表
GDTSEG SEGMENT PARA USE16 'GDT'
GDT LABEL BYTE
DUMMY DESCRIPTOR <> ;空描述符
;规范数据段描述符
NORMAL DESCRIPTOR <0FFFFH,0,0,ATDW,0>
NORMAL_SEL = NORMAL - GDT
;代码段K的描述符
CODEK DESCRIPTOR <0FFFFH,,,ATCE,>
CODEK_SEL = CODEK - GDT
;局部描述符表段的描述符
LDTABLE DESCRIPTOR <LDTLEN-1,,,ATLDT,>
LDT_SEL = LDTABLE - GDT
GDTLEN = $ - GDT ;;;;;;;;;;;;;;
GDTSEG ENDS
;------------------------------------------------
;演示任务局部描述符表
LDTSEG SEGMENT PARA USE16 'LDT'
LDT LABEL BYTECODEL
;代码段L描述符
CODEL DESCRIPTOR <CODELLEN-1,SEG CODELSEG,,ATCE,>
CODEL_SEL = (CODEL-LDT) + TIL
;代码段C描述符
CODEC DESCRIPTOR <CODECLEN-1,SEG CODECSEG,,ATCE,>
CODEC_SEL = (CODEC-LDT) + TIL
;显示缓冲区段描述符
VIDEOBUFF DESCRIPTOR <0FFFFH,0,0,0F00H+ATDW,0>
VIDEO_SEL = (VIDEOBUFF-LDT) + TIL
;演示任务LDT别名段描述符(DPL=3)
TOLDT DESCRIPTOR <LDTLEN-1,LDTSEG,,ATDR+DPL3,>
TOLDT_SEL = (TOLDT-LDT) + TIL
;显示信息缓冲区段描述符(DPL=3)
MDATA DESCRIPTOR <MDATALEN-1,SEG MDATASEG,,ATDW+DPL3,>
MDATA_SEL = (MDATA-LDT) + TIL + RPL3
;堆栈段描述符
STACKS DESCRIPTOR <TOPOFS-1,SEG STACKSEG,,ATDWA,>
STACK_SEL = (STACKS-LDT) + TIL
LDNUM = ($-LDT) / (SIZE DESCRIPTOR) ;LDT含描述符个数
LDTLEN = $ - LDT ;LDT字节长
LDTSEG ENDS
;--------------------------------------------
;演示信息缓冲区段
MDATASEG SEGMENT PARA USE16 'MDATA'
MESSAGE DB 'Value=',0
BUFFER db 80 dup (0)
MDATALEN = $ - MDATASEG
MDATASEG ENDS
;--------------------------------------------
;演示任务堆栈段
STACKSEG SEGMENT PARA USE16 'STACK'
DW 512 DUP (0)
TOPOFS = $ - STACKSEG
STACKSEG ENDS
;--------------------------------------------
;演示任务代码段C(含子程序D和子程序H)
CODECSEG SEGMENT PARA USE16 'CODEC'
ASSUME CS:CODECSEG
;显示信息子程序D
;入口参数: FS:SI指向要显示字符串,字符串以0结束
; ES:EDI指向显示缓冲区
DISPMESS PROC FAR
MOV AH,7
DISP1:MOV AL,FS:[SI]
INC SI
OR AL,AL
JZ DISP2
MOV ES:[EDI],AX
INC EDI
INC EDI
JMP DISP1
DISP2:RET
DISPMESS endp
;
;子程序H,把一位十门进制数转换成对应字符的ASCII友
HTOASC PROC FAR
AND AL,0FH
ADD AL,90H
DAA
ADC AL,40H
DAA
ret
HTOASC endpCODECLEN = $ - CODECSEG
CODECSEG ENDS
;----------------------------------------------
;演示任务代码段L
CODELSEG SEGMENT PARA USE16 'CODEL'
ASSUME CS:CODELSEG
VIRTUAL2:
MOV AX,VIDEO_SEL
MOV ES,AX ;设置显示缓冲区指针
MOV EDI,0B8000H
;
MOV AX,MDATA_SEL
MOV FS,AX ;设置提示信息缓冲区指针
MOV SI,OFFSET MESSAGE
;
CALL16 CODEC_SEL,DISPMESS ;;;显示提示信息
;
MOV AX,TOLDT_SEL ;把演示任务的LDT的
MOV GS,AX ;别名段的描述符选择子装入GS
;
MOV DX,GS:[CODEL.LIMITL] ;取代码段L的段界限值
MOV SI,OFFSET BUFFER ;并转换铖对应可显示字符串
MOV CX,4
VIR:ROL DX,4
MOV AL,DL
CALL16 CODEC_SEL,HTOASC ;转换出ASCII码
MOV FS:[SI],AL
INC SI
LOOP VIR
MOV WORD PTR FS:[SI],'H'
;
MOV SI,OFFSET BUFFER
CALL16 CODEC_SEL,DISPMESS ;显示转换出的字符串
;
JUMP16 CODEK_SEL,VIRTUAL3 ;跳转到代码段K
CODELLEN = $ - CODELSEG
CODELSEG ENDS
;-----------------------------------------------------
;演示任务代码段K
CODEKSEG SEGMENT PARA USE16 'CODEK'
ASSUME CS:CODEKSEG
VIRTUAL1:
MOV AX,LDT_SEL
LLDT AX ;装载局部描述符表寄存器LDTR
;
MOV AX,STACK_SEL
MOV SS,AX ;演示任务堆栈
MOV SP,OFFSET TOPOFS
;
JUMP16 CODEL_SEL,VIRTUAL2 ;跳转到代码段L
VIRTUAL3:
MOV AX,NORMAL_SEL ;准备返回实方式
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV SS,AX
;
MOV EAX,CR0
AND EAX,0FFFFFFFEH
MOV CR0,EAX ;返回实方式
JUMP16 <SEG REAL>,<OFFSET REAL>
CODEKLEN = $ - CODEKSEG
CODEKSEG ENDS
;=======================================================
;实方式数据段
RDATASEG SEGMENT PARA USE16
VGDTR PDESC <GDTLEN-1,> ;GDT伪描述符
SPVAR DW ? ;保存实方式下堆栈指针
SSVAR DW ?
RDATASEG ENDS
;------------------------------
;实方式代码段
RECODESEG SEGMENT PARA USE16
ASSUME CS:RECODESEG
START: jmp $
ASSUME DS:GDTSEG
MOV AX,GDTSEG
MOV DS,AX
;初始化全局描述符表
MOV BX,16
MOV AX,CODEKSEG
MUL BX
MOV CODEK.BASEL,AX
MOV CODEK.BASEM,DL
MOV CODEK.BASEH,DH
MOV AX,LDTSEG
MUL BX
MOV LDTABLE.BASEL,AX
MOV LDTABLE.BASEM,DL
MOV LDTABLE.BASEH,DH
;设置GDT伪描述符
ASSUME DS:RDATASEG
MOV AX,RDATASEG
MOV DS,AX
MOV AX,GDTSEG
MUL BX
MOV WORD PTR VGDTR.BASE,AX
MOV WORD PTR VGDTR.BASE+2,DX
;初始化演示任务LDT
CLD
CALL INIT_MLDT
;保存实方式堆栈指针
MOV SSVAR,SS
MOV SPVAR,SP
;装载GDTR
LGDT FWORD PTR VGDTR
CLI
;切换到保护方式
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JUMP16 <CODEK_SEL>,<OFFSET VIRTUAL1>
REAL:;又回到实方式
LSS SP,DWORD PTR SPVAR ;恢复实方式堆栈指针
STI
MOV AX,4C00H
INT 21H
;-----------------------------------------
;初始化演示任务LDT的子程序
INIT_MLDT PROC
PUSH DS
MOV AX,LDTSEG
MOV DS,AX
MOV CX,LDNUM
MOV SI,OFFSET LDT ;CODEL(SI=0)
INITL:MOV AX,[SI].BASEL ;CODEL.BASEL=CODELSEG==>等于实方式CODELSEG的16位基址
MOVZX EAX,AX ;无符号扩展EAX
SHL EAX,4 ;逻辑左移4位(32位地址) ;参考实方式下段描述符高速缓冲寄存器
SHLD EDX,EAX,16 ;把EAX的高16位移动到EDX ;实际上只有DX有意义
MOV [SI].BASEL,AX
MOV [SI].BASEM,DL
MOV [SI].BASEH,DH
ADD SI,SIZE DESCRIPTOR ;
LOOP INITL
POP DS
ret
INIT_MLDT endp
RECODESEG ENDS
END START
;程序名:T10-3.ASM
;演示任务内无特权级变换的转移
;
INCLUDE 386SCD.ASM ;文件386SCD.ASM含有关结构、
;宏指令和符号常量的定义
.386P
;-------------------------------------------
;全局描述符表
GDTSEG SEGMENT PARA USE16 'GDT'
GDT LABEL BYTE
DUMMY DESCRIPTOR <> ;空描述符
;规范数据段描述符
NORMAL DESCRIPTOR <0FFFFH,0,0,ATDW,0>
NORMAL_SEL = NORMAL - GDT
;代码段K的描述符
CODEK DESCRIPTOR <0FFFFH,,,ATCE,>
CODEK_SEL = CODEK - GDT
;局部描述符表段的描述符
LDTABLE DESCRIPTOR <LDTLEN-1,,,ATLDT,>
LDT_SEL = LDTABLE - GDT
GDTLEN = $ - GDT ;;;;;;;;;;;;;;
GDTSEG ENDS
;------------------------------------------------
;演示任务局部描述符表
LDTSEG SEGMENT PARA USE16 'LDT'
LDT LABEL BYTECODEL
;代码段L描述符
CODEL DESCRIPTOR <CODELLEN-1,SEG CODELSEG,,ATCE,>
CODEL_SEL = (CODEL-LDT) + TIL
;代码段C描述符
CODEC DESCRIPTOR <CODECLEN-1,SEG CODECSEG,,ATCE,>
CODEC_SEL = (CODEC-LDT) + TIL
;显示缓冲区段描述符
VIDEOBUFF DESCRIPTOR <0FFFFH,0,0,0F00H+ATDW,0>
VIDEO_SEL = (VIDEOBUFF-LDT) + TIL
;演示任务LDT别名段描述符(DPL=3)
TOLDT DESCRIPTOR <LDTLEN-1,LDTSEG,,ATDR+DPL3,>
TOLDT_SEL = (TOLDT-LDT) + TIL
;显示信息缓冲区段描述符(DPL=3)
MDATA DESCRIPTOR <MDATALEN-1,SEG MDATASEG,,ATDW+DPL3,>
MDATA_SEL = (MDATA-LDT) + TIL + RPL3
;堆栈段描述符
STACKS DESCRIPTOR <TOPOFS-1,SEG STACKSEG,,ATDWA,>
STACK_SEL = (STACKS-LDT) + TIL
LDNUM = ($-LDT) / (SIZE DESCRIPTOR) ;LDT含描述符个数
LDTLEN = $ - LDT ;LDT字节长
LDTSEG ENDS
;--------------------------------------------
;演示信息缓冲区段
MDATASEG SEGMENT PARA USE16 'MDATA'
MESSAGE DB 'Value=',0
BUFFER db 80 dup (0)
MDATALEN = $ - MDATASEG
MDATASEG ENDS
;--------------------------------------------
;演示任务堆栈段
STACKSEG SEGMENT PARA USE16 'STACK'
DW 512 DUP (0)
TOPOFS = $ - STACKSEG
STACKSEG ENDS
;--------------------------------------------
;演示任务代码段C(含子程序D和子程序H)
CODECSEG SEGMENT PARA USE16 'CODEC'
ASSUME CS:CODECSEG
;显示信息子程序D
;入口参数: FS:SI指向要显示字符串,字符串以0结束
; ES:EDI指向显示缓冲区
DISPMESS PROC FAR
MOV AH,7
DISP1:MOV AL,FS:[SI]
INC SI
OR AL,AL
JZ DISP2
MOV ES:[EDI],AX
INC EDI
INC EDI
JMP DISP1
DISP2:RET
DISPMESS endp
;
;子程序H,把一位十门进制数转换成对应字符的ASCII友
HTOASC PROC FAR
AND AL,0FH
ADD AL,90H
DAA
ADC AL,40H
DAA
ret
HTOASC endpCODECLEN = $ - CODECSEG
CODECSEG ENDS
;----------------------------------------------
;演示任务代码段L
CODELSEG SEGMENT PARA USE16 'CODEL'
ASSUME CS:CODELSEG
VIRTUAL2:
MOV AX,VIDEO_SEL
MOV ES,AX ;设置显示缓冲区指针
MOV EDI,0B8000H
;
MOV AX,MDATA_SEL
MOV FS,AX ;设置提示信息缓冲区指针
MOV SI,OFFSET MESSAGE
;
CALL16 CODEC_SEL,DISPMESS ;;;显示提示信息
;
MOV AX,TOLDT_SEL ;把演示任务的LDT的
MOV GS,AX ;别名段的描述符选择子装入GS
;
MOV DX,GS:[CODEL.LIMITL] ;取代码段L的段界限值
MOV SI,OFFSET BUFFER ;并转换铖对应可显示字符串
MOV CX,4
VIR:ROL DX,4
MOV AL,DL
CALL16 CODEC_SEL,HTOASC ;转换出ASCII码
MOV FS:[SI],AL
INC SI
LOOP VIR
MOV WORD PTR FS:[SI],'H'
;
MOV SI,OFFSET BUFFER
CALL16 CODEC_SEL,DISPMESS ;显示转换出的字符串
;
JUMP16 CODEK_SEL,VIRTUAL3 ;跳转到代码段K
CODELLEN = $ - CODELSEG
CODELSEG ENDS
;-----------------------------------------------------
;演示任务代码段K
CODEKSEG SEGMENT PARA USE16 'CODEK'
ASSUME CS:CODEKSEG
VIRTUAL1:
MOV AX,LDT_SEL
LLDT AX ;装载局部描述符表寄存器LDTR
;
MOV AX,STACK_SEL
MOV SS,AX ;演示任务堆栈
MOV SP,OFFSET TOPOFS
;
JUMP16 CODEL_SEL,VIRTUAL2 ;跳转到代码段L
VIRTUAL3:
MOV AX,NORMAL_SEL ;准备返回实方式
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV SS,AX
;
MOV EAX,CR0
AND EAX,0FFFFFFFEH
MOV CR0,EAX ;返回实方式
JUMP16 <SEG REAL>,<OFFSET REAL>
CODEKLEN = $ - CODEKSEG
CODEKSEG ENDS
;=======================================================
;实方式数据段
RDATASEG SEGMENT PARA USE16
VGDTR PDESC <GDTLEN-1,> ;GDT伪描述符
SPVAR DW ? ;保存实方式下堆栈指针
SSVAR DW ?
RDATASEG ENDS
;------------------------------
;实方式代码段
RECODESEG SEGMENT PARA USE16
ASSUME CS:RECODESEG
START: jmp $
ASSUME DS:GDTSEG
MOV AX,GDTSEG
MOV DS,AX
;初始化全局描述符表
MOV BX,16
MOV AX,CODEKSEG
MUL BX
MOV CODEK.BASEL,AX
MOV CODEK.BASEM,DL
MOV CODEK.BASEH,DH
MOV AX,LDTSEG
MUL BX
MOV LDTABLE.BASEL,AX
MOV LDTABLE.BASEM,DL
MOV LDTABLE.BASEH,DH
;设置GDT伪描述符
ASSUME DS:RDATASEG
MOV AX,RDATASEG
MOV DS,AX
MOV AX,GDTSEG
MUL BX
MOV WORD PTR VGDTR.BASE,AX
MOV WORD PTR VGDTR.BASE+2,DX
;初始化演示任务LDT
CLD
CALL INIT_MLDT
;保存实方式堆栈指针
MOV SSVAR,SS
MOV SPVAR,SP
;装载GDTR
LGDT FWORD PTR VGDTR
CLI
;切换到保护方式
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JUMP16 <CODEK_SEL>,<OFFSET VIRTUAL1>
REAL:;又回到实方式
LSS SP,DWORD PTR SPVAR ;恢复实方式堆栈指针
STI
MOV AX,4C00H
INT 21H
;-----------------------------------------
;初始化演示任务LDT的子程序
INIT_MLDT PROC
PUSH DS
MOV AX,LDTSEG
MOV DS,AX
MOV CX,LDNUM
MOV SI,OFFSET LDT ;CODEL(SI=0)
INITL:MOV AX,[SI].BASEL ;CODEL.BASEL=CODELSEG==>等于实方式CODELSEG的16位基址
MOVZX EAX,AX ;无符号扩展EAX
SHL EAX,4 ;逻辑左移4位(32位地址) ;参考实方式下段描述符高速缓冲寄存器
SHLD EDX,EAX,16 ;把EAX的高16位移动到EDX ;实际上只有DX有意义
MOV [SI].BASEL,AX
MOV [SI].BASEM,DL
MOV [SI].BASEH,DH
ADD SI,SIZE DESCRIPTOR ;
LOOP INITL
POP DS
ret
INIT_MLDT endp
RECODESEG ENDS
END START
作者: leetow2003 发布时间: 2010-12-27
我编译时要求生成的T10-3.LST文件,里面有错误提示,太长发不出来,我提出来些,可能有漏:
132 ;全局描述符表
133 0000 GDTSEG SEGMENT PARA USE16 'GDT'
t10-3.asm(9): error A2015: Symbol already different kind: @CURSEG
134 GDT LABEL BYTE
t10-3.asm(10): error A2015: Symbol already different kind: GDT
148 = 0008 NORMAL_SEL = NORMAL - GDT
t10-3.asm(14): error A2052: Improper operand type: GDT
156 = 0010 CODEK_SEL = CODEK - GDT
t10-3.asm(17): error A2052: Improper operand type: GDT
157 ;局部描述符表段的描述符
158 0018 002F R U LDTABLE DESCRIPTOR <LDTLEN
-1,,,ATLDT,>
t10-3.asm(19): error A2009: Symbol not defined: LDTLEN
164 = 0018 LDT_SEL = LDTABLE - GDT
t10-3.asm(20): error A2052: Improper operand type: GDT
165 = 0020 GDTLEN = $ - GDT
;;;;;;;;;;;;;;
t10-3.asm(21): error A2052: Improper operand type: GDT
166 0020 GDTSEG ENDS
t10-3.asm(22): error A2015: Symbol already different kind: @CURSEG
169 0000 LDTSEG SEGMENT PARA USE16 'LDT'
t10-3.asm(25): error A2015: Symbol already different kind: @CURSEG
170 LDT LABEL BYTECODEL
t10-3.asm(26): error A2003: Unknown type specifier
180 0008 FFFF CODEC DESCRIPTOR <CODECL
EN-1,SEG CODECSEG,,ATCE,>
t10-3.asm(31): error A2009: Symbol not defined: CODECLEN
186 = 000C CODEC_SEL = (CODEC-LDT) + T
IL
t10-3.asm(32): error A2052: Improper operand type: LDT
194 = 0014 VIDEO_SEL = (VIDEOBUFF-LDT)
+ TIL
t10-3.asm(35): error A2052: Improper operand type: LDT
196 0018 002F R U TOLDT DESCRIPTOR <LDTLEN
-1,LDTSEG,,ATDR+DPL3,>
t10-3.asm(37): error A2009: Symbol not defined: LDTLEN
202 = 001C TOLDT_SEL = (TOLDT-LDT) + T
IL
t10-3.asm(38): error A2052: Improper operand type: LDT
210 = 0027 MDATA_SEL = (MDATA-LDT) + T
IL + RPL3
t10-3.asm(41): error A2052: Improper operand type: LDT
218 = 002C STACK_SEL = (STACKS-LDT) +
TIL
t10-3.asm(44): error A2052: Improper operand type: LDT
219 = 0006 LDNUM = ($-LDT) / (SIZE
DESCRIPTOR) ;LDT含
描述符个数
t10-3.asm(45): error A2052: Improper operand type: LDT
220 = 0030 LDTLEN = $ - LDT
;LDT字
节长
t10-3.asm(46): error A2052: Improper operand type: LDT
221 0030 LDTSEG ENDS
t10-3.asm(47): error A2015: Symbol already different kind: @CURSEG
224 0000 MDATASEG SEGMENT PARA USE16
'MDATA'
t10-3.asm(50): error A2015: Symbol already different kind: MDATA
232 0057 MDATASEG ENDS
t10-3.asm(54): error A2015: Symbol already different kind: @CURSEG
235 0000 STACKSEG SEGMENT PARA USE16
'STACK'
t10-3.asm(57): error A2015: Symbol already different kind: @CURSEG
241 0400 STACKSEG ENDS
t10-3.asm(60): error A2015: Symbol already different kind: @CURSEG
244 0000 CODECSEG SEGMENT PARA USE16
'CODEC'
t10-3.asm(63): error A2015: Symbol already different kind: CODEC
271 HTOASC endpCODECLEN = $ -
CODECSEG
t10-3.asm(90): error A2105: Expected: instruction, directive, or label
272 0020 CODECSEG ENDS
t10-3.asm(91): error A2015: Symbol already different kind: @CURSEG
275 0000 CODELSEG SEGMENT PARA USE16
'CODEL'
t10-3.asm(94): error A2015: Symbol already different kind: CODEL
276 ASSUME CS:CODELSEG
277 0000 VIRTUAL2:
278 0000 A1 0014 R U MOV AX,VIDEO_SEL
t10-3.asm(97): error A2009: Symbol not defined: VIDEO_SEL
282 000B A1 0027 R U MOV AX,MDATA_SEL
t10-3.asm(101): error A2009: Symbol not defined: MDATA_SEL
289 0016 000C R U 1 DW CODEC_SEL ;段值/
选择子
t10-3.asm(105): error A2009: Symbol not defined: CODEC_SEL
290 ;
291 0018 A1 001C R U MOV AX,TOLDT_SEL
;把演示任务的LDT的
t10-3.asm(107): error A2009: Symbol not defined: TOLDT_SEL
312 0043 000C R U 1 DW CODEC_SEL ;段值/
选择子
t10-3.asm(122): error A2009: Symbol not defined: CODEC_SEL
317 0048 0010 R U 1 DW CODEK_SEL ;段值/
选择子
t10-3.asm(124): error A2009: Symbol not defined: CODEK_SEL
319 004A CODELSEG ENDS
t10-3.asm(126): error A2015: Symbol already different kind: @CURSEG
325 0000 A1 0018 R U MOV AX,LDT_SEL
t10-3.asm(132): error A2009: Symbol not defined: LDT_SEL
328 0006 A1 002C R U MOV AX,STACK_SEL
t10-3.asm(135): error A2009: Symbol not defined: STACK_SEL
335 0011 0004 R U 1 DW CODEL_SEL ;段值/
选择子
t10-3.asm(139): error A2009: Symbol not defined: CODEL_SEL
337 0013 A1 0008 R U MOV AX,NORMAL_SEL
;准备返回实方式
t10-3.asm(141): error A2009: Symbol not defined: NORMAL_SEL
351 002D CODEKSEG ENDS
t10-3.asm(152): error A2015: Symbol already different kind: @CURSEG
355 0000 001F R U VGDTR PDESC <GDTLEN-1,>
;GDT伪描述符
t10-3.asm(156): error A2009: Symbol not defined: GDTLEN
132 ;全局描述符表
133 0000 GDTSEG SEGMENT PARA USE16 'GDT'
t10-3.asm(9): error A2015: Symbol already different kind: @CURSEG
134 GDT LABEL BYTE
t10-3.asm(10): error A2015: Symbol already different kind: GDT
148 = 0008 NORMAL_SEL = NORMAL - GDT
t10-3.asm(14): error A2052: Improper operand type: GDT
156 = 0010 CODEK_SEL = CODEK - GDT
t10-3.asm(17): error A2052: Improper operand type: GDT
157 ;局部描述符表段的描述符
158 0018 002F R U LDTABLE DESCRIPTOR <LDTLEN
-1,,,ATLDT,>
t10-3.asm(19): error A2009: Symbol not defined: LDTLEN
164 = 0018 LDT_SEL = LDTABLE - GDT
t10-3.asm(20): error A2052: Improper operand type: GDT
165 = 0020 GDTLEN = $ - GDT
;;;;;;;;;;;;;;
t10-3.asm(21): error A2052: Improper operand type: GDT
166 0020 GDTSEG ENDS
t10-3.asm(22): error A2015: Symbol already different kind: @CURSEG
169 0000 LDTSEG SEGMENT PARA USE16 'LDT'
t10-3.asm(25): error A2015: Symbol already different kind: @CURSEG
170 LDT LABEL BYTECODEL
t10-3.asm(26): error A2003: Unknown type specifier
180 0008 FFFF CODEC DESCRIPTOR <CODECL
EN-1,SEG CODECSEG,,ATCE,>
t10-3.asm(31): error A2009: Symbol not defined: CODECLEN
186 = 000C CODEC_SEL = (CODEC-LDT) + T
IL
t10-3.asm(32): error A2052: Improper operand type: LDT
194 = 0014 VIDEO_SEL = (VIDEOBUFF-LDT)
+ TIL
t10-3.asm(35): error A2052: Improper operand type: LDT
196 0018 002F R U TOLDT DESCRIPTOR <LDTLEN
-1,LDTSEG,,ATDR+DPL3,>
t10-3.asm(37): error A2009: Symbol not defined: LDTLEN
202 = 001C TOLDT_SEL = (TOLDT-LDT) + T
IL
t10-3.asm(38): error A2052: Improper operand type: LDT
210 = 0027 MDATA_SEL = (MDATA-LDT) + T
IL + RPL3
t10-3.asm(41): error A2052: Improper operand type: LDT
218 = 002C STACK_SEL = (STACKS-LDT) +
TIL
t10-3.asm(44): error A2052: Improper operand type: LDT
219 = 0006 LDNUM = ($-LDT) / (SIZE
DESCRIPTOR) ;LDT含
描述符个数
t10-3.asm(45): error A2052: Improper operand type: LDT
220 = 0030 LDTLEN = $ - LDT
;LDT字
节长
t10-3.asm(46): error A2052: Improper operand type: LDT
221 0030 LDTSEG ENDS
t10-3.asm(47): error A2015: Symbol already different kind: @CURSEG
224 0000 MDATASEG SEGMENT PARA USE16
'MDATA'
t10-3.asm(50): error A2015: Symbol already different kind: MDATA
232 0057 MDATASEG ENDS
t10-3.asm(54): error A2015: Symbol already different kind: @CURSEG
235 0000 STACKSEG SEGMENT PARA USE16
'STACK'
t10-3.asm(57): error A2015: Symbol already different kind: @CURSEG
241 0400 STACKSEG ENDS
t10-3.asm(60): error A2015: Symbol already different kind: @CURSEG
244 0000 CODECSEG SEGMENT PARA USE16
'CODEC'
t10-3.asm(63): error A2015: Symbol already different kind: CODEC
271 HTOASC endpCODECLEN = $ -
CODECSEG
t10-3.asm(90): error A2105: Expected: instruction, directive, or label
272 0020 CODECSEG ENDS
t10-3.asm(91): error A2015: Symbol already different kind: @CURSEG
275 0000 CODELSEG SEGMENT PARA USE16
'CODEL'
t10-3.asm(94): error A2015: Symbol already different kind: CODEL
276 ASSUME CS:CODELSEG
277 0000 VIRTUAL2:
278 0000 A1 0014 R U MOV AX,VIDEO_SEL
t10-3.asm(97): error A2009: Symbol not defined: VIDEO_SEL
282 000B A1 0027 R U MOV AX,MDATA_SEL
t10-3.asm(101): error A2009: Symbol not defined: MDATA_SEL
289 0016 000C R U 1 DW CODEC_SEL ;段值/
选择子
t10-3.asm(105): error A2009: Symbol not defined: CODEC_SEL
290 ;
291 0018 A1 001C R U MOV AX,TOLDT_SEL
;把演示任务的LDT的
t10-3.asm(107): error A2009: Symbol not defined: TOLDT_SEL
312 0043 000C R U 1 DW CODEC_SEL ;段值/
选择子
t10-3.asm(122): error A2009: Symbol not defined: CODEC_SEL
317 0048 0010 R U 1 DW CODEK_SEL ;段值/
选择子
t10-3.asm(124): error A2009: Symbol not defined: CODEK_SEL
319 004A CODELSEG ENDS
t10-3.asm(126): error A2015: Symbol already different kind: @CURSEG
325 0000 A1 0018 R U MOV AX,LDT_SEL
t10-3.asm(132): error A2009: Symbol not defined: LDT_SEL
328 0006 A1 002C R U MOV AX,STACK_SEL
t10-3.asm(135): error A2009: Symbol not defined: STACK_SEL
335 0011 0004 R U 1 DW CODEL_SEL ;段值/
选择子
t10-3.asm(139): error A2009: Symbol not defined: CODEL_SEL
337 0013 A1 0008 R U MOV AX,NORMAL_SEL
;准备返回实方式
t10-3.asm(141): error A2009: Symbol not defined: NORMAL_SEL
351 002D CODEKSEG ENDS
t10-3.asm(152): error A2015: Symbol already different kind: @CURSEG
355 0000 001F R U VGDTR PDESC <GDTLEN-1,>
;GDT伪描述符
t10-3.asm(156): error A2009: Symbol not defined: GDTLEN
作者: leetow2003 发布时间: 2010-12-27
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28