研究一段时间纯dos到保护模式的方式后写了个程序,帮助建立SLIC表,使用的是网上的Asus oem vista激活slic ,nasm汇编编译 nasm -fobj asusslic.asm
详细代码放在另一篇中,这里就一个头文件一些宏定义
;/////////////386scd.inc//////
;名称:386SCD.INC
;功能:符号常量等的定义
;----------------------------------------------------------------------------
%ifndef __386SCD_INC
%define __386SCD_INC
;----------------------------------------------------------------------------
;.386P
CPU 386
;----------------------------------------------------------------------------
;打开A20地址线
;----------------------------------------------------------------------------
%macro EnableA20 0
push ax
in al,92h
or al,00000010b
out 92h,al
pop ax
%endmacro
;----------------------------------------------------------------------------
;关闭A20地址线
;----------------------------------------------------------------------------
%macro DisableA20 0
push ax
in al,92h
and al,11111101b
out 92h,al
pop ax
%endmacro
;----------------------------------------------------------------------------
;16位偏移的段间直接转移指令的宏定义(在16位代码段中使用)
;----------------------------------------------------------------------------
%macro JUMP16 2
DB 0eah ;操作码
DW %2 ;16位偏移量
DW %1 ;段值或段选择子
%endmacro
;----------------------------------------------------------------------------
;32位偏移的段间直接转移指令的宏定义(在32位代码段中使用)
;----------------------------------------------------------------------------
;COMMENT <JUMP32>
;JUMP32 MACRO Selector,Offset
; DB 0eah ;操作码
; DD OFFSET
; DW Selector ;段值或段选择子
; ENDM
;<JUMP32>
;-------------------------------------------------
%macro JUMP32 2
DB 0eah ;操作码
DW %2
DW 0
DW %1 ;段值或段选择子
%endmacro
;----------------------------------------------------------------------------
;16位偏移的段间调用指令的宏定义(在16位代码段中使用)
;----------------------------------------------------------------------------
%macro CALL16 2
DB 9ah ;操作码
DW %2 ;16位偏移量
DW %1 ;段值或段选择子
%endmacro
;----------------------------------------------------------------------------
;32位偏移的段间调用指令的宏定义(在32位代码段中使用)
;----------------------------------------------------------------------------
;COMMENT <CALL32>
;CALL32 MACRO Selector,Offset
; DB 9ah ;操作码
; DD Offset
; DW Selector ;段值或段选择子
; ENDM
;<CALL32>
;-------------------------------------------------
%macro CALL32 2
DB 9ah ;操作码
DW %1
DW 0
DW %2 ;段值或段选择子
%endmacro
;----------------------------------------------------------------------------
;存储段描述符结构类型定义
;----------------------------------------------------------------------------
;STRUC Desc
;LimitL DW 0 ;段界限(BIT0-15)
;BaseL DW 0 ;段基地址(BIT0-15)
;BaseM DB 0 ;段基地址(BIT16-23)
;Attributes DB 0 ;段属性
;LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
;BaseH DB 0 ;段基地址(BIT24-31)
;ENDSTRUC
;----------------------------------------------------------------------------
;门描述符结构类型定义
;----------------------------------------------------------------------------
;STRUC Gate
;OffsetL DW 0 ;32位偏移的低16位
;Selector DW 0 ;选择子
;DCount DB 0 ;双字计数
;GType DB 0 ;类型
;OffsetH DW 0 ;32位偏移的高16位
;ENDSTRUC
;----------------------------------------------------------------------------
;伪描述符结构类型定义(用于装入全局或中断描述符表寄存器)
;----------------------------------------------------------------------------
;STRUC PDesc
;Limit DW 0 ;16位界限
;Base DD 0 ;32位基地址
;ENDSTRUC
;----------------------------------------------------------------------------
;任务状态段结构类型定义
;----------------------------------------------------------------------------
%macro TSSDef 1
%1 :
STRUC TSS
.TRLink DW 0 ;链接字段
DW 0 ;不使用,置为0
.TRESP0 DD 0 ;0级堆栈指针
.TRSS0 DW 0 ;0级堆栈段寄存器
DW 0 ;不使用,置为0
.TRESP1 DD 0 ;1级堆栈指针
.TRSS1 DW 0 ;1级堆栈段寄存器
DW 0 ;不使用,置为0
.TRESP2 DD 0 ;2级堆栈指针
.TRSS2 DW 0 ;2级堆栈段寄存器
DW 0 ;不使用,置为0
.TRCR3 DD 0 ;CR3
.TREIP DD 0 ;EIP
.TREFlag DD 0 ;EFLAGS
.TREAX DD 0 ;EAX
.TRECX DD 0 ;ECX
.TREDX DD 0 ;EDX
.TREBX DD 0 ;EBX
.TRESP DD 0 ;ESP
.TREBP DD 0 ;EBP
.TRESI DD 0 ;ESI
.TREDI DD 0 ;EDI
.TRES DW 0 ;ES
DW 0 ;不使用,置为0
.TRCS DW 0 ;CS
DW 0 ;不使用,置为0
.TRSS DW 0 ;SS
DW 0 ;不使用,置为0
.TRDS DW 0 ;DS
DW 0 ;不使用,置为0
.TRFS DW 0 ;FS
DW 0 ;不使用,置为0
.TRGS DW 0 ;GS
DW 0 ;不使用,置为0
.TRLDTR DW 0 ;LDTR
DW 0 ;不使用,置为0
.TRTrip DW 0 ;调试陷阱标志(只用位0)
.TRIOMap DW $+2 ;指向I/O许可位图区的段内偏移
ENDSTRUC
%endmacro
;----------------------------------------------------------------------------
;存储段描述符类型值说明
;----------------------------------------------------------------------------
ATDR equ 90h ;存在的只读数据段类型值
ATDW equ 92h ;存在的可读写数据段属性值
ATDWA equ 93h ;存在的已访问可读写数据段类型值
ATCE equ 98h ;存在的只执行代码段属性值
ATCER equ 9ah ;存在的可执行可读代码段属性值
ATCCO equ 9ch ;存在的只执行一致代码段属性值
ATCCOR equ 9eh ;存在的可执行可读一致代码段属性值
;----------------------------------------------------------------------------
;系统段描述符类型值说明
;----------------------------------------------------------------------------
ATLDT equ 82h ;局部描述符表段类型值
ATTaskGate equ 85h ;任务门类型值
AT386TSS equ 89h ;可用386任务状态段类型值
AT386CGate equ 8ch ;386调用门类型值
AT386IGate equ 8eh ;386中断门类型值
AT386TGate equ 8fh ;386陷阱门类型值
;----------------------------------------------------------------------------
;DPL值说明
;----------------------------------------------------------------------------
DPL0 equ 00h ;DPLequ0
DPL1 equ 20h ;DPLequ1
DPL2 equ 40h ;DPLequ2
DPL3 equ 60h ;DPLequ3
;----------------------------------------------------------------------------
;RPL值说明
;----------------------------------------------------------------------------
RPL0 equ 00h ;RPLequ0
RPL1 equ 01h ;RPLequ1
RPL2 equ 02h ;RPLequ2
RPL3 equ 03h ;RPLequ3
;----------------------------------------------------------------------------
;IOPL值说明
;----------------------------------------------------------------------------
IOPL0 equ 0000h ;IOPLequ0
IOPL1 equ 1000h ;IOPLequ1
IOPL2 equ 2000h ;IOPLequ2
IOPL3 equ 3000h ;IOPLequ3
;----------------------------------------------------------------------------
;其它常量值说明
;----------------------------------------------------------------------------
D32 equ 40h ;32位代码段标志
GL equ 80h ;段界限以4K为单位标志
TIL equ 04h ;TIequ1(局部描述符表标志)
VMFL equ 00020000h ;VMFequ1
VMFLW equ 0002h
IFL equ 00000200h ;IFequ1
RFL equ 00010000h ;RFequ1(重启动标志,为1表示忽略调试故障)
RFLW equ 0001h
NTL equ 00004000h ;NTequ1
;----------------------------------------------------------------------------
;分页机制使用的常量说明
;----------------------------------------------------------------------------
PL equ 1 ;页存在属性位
RWR equ 0 ;R/W属性位值,读/执行
RWW equ 2 ;R/W属性位值,读/写/执行
USS equ 0 ;U/S属性位值,系统级
USU equ 4 ;U/S属性位值,用户级
;----------------------------------------------------------------------------
%macro Desc 3 ;段描述符宏
dw (%2) & 0ffffh ;界限值0-15位
dw (%1) & 0ffffh ;基地址0-15位
db ((%1) >> 16) & 0ffh ;基地址16-23位
dw (((%2) >> 8) & 0f00h) | (%3) ;界限值16-19位,和段属性
db ((%1) >> 24) & 0ffh ;基地址24-31位
%endmacro
%macro Gate 4 ;门描述符宏
dw (%1) & 0ffffh ;偏移0-15位
dW %2 ;选择子
db %3 ;双字计数
db %4 ;类型
db ((%1) >> 16) & 0ffffh ;偏移16-31位
%endmacro
%macro PDesc 2
DW %2 ;16位界限
DD %1 ;32位基地址
%endmacro
SA_BYTES equ 0 << 15 ;段粒度:字节
SA_PAGES equ 1 << 15 ;段粒度:页
SA_16BIT equ 0 << 14 ;16位段
SA_32BIT equ 1 << 14 ;32位段
SA_ABSENT equ 0 << 7 ;不存在
SA_PRESENT equ 1 << 7 ;存在
SA_DPL_0 equ 0 << 5 ;段特权级0-3
SA_DPL_1 equ 1 << 5
SA_DPL_2 equ 2 << 5
SA_DPL_3 equ 3 << 5
SA_SYSTEM equ 0 << 4 ;系统段
SA_STORAGE equ 1 << 4 ;存储段
SA_DATA equ 0 << 3 ;数据段
SA_CODE equ 1 << 3 ;代码段
SA_CONFORM equ 1 << 2 ;一致代码段
SA_STACK equ 1 << 2 ;堆栈段
SA_READ equ 1 << 1 ;可读
SA_WRITE equ 1 << 1 ;可写
SA_UNACCESSED equ 0 << 0 ;访问过
SA_ACCESSED equ 1 << 0 ;未访问过
%endif
详细代码放在另一篇中,这里就一个头文件一些宏定义
;/////////////386scd.inc//////
;名称:386SCD.INC
;功能:符号常量等的定义
;----------------------------------------------------------------------------
%ifndef __386SCD_INC
%define __386SCD_INC
;----------------------------------------------------------------------------
;.386P
CPU 386
;----------------------------------------------------------------------------
;打开A20地址线
;----------------------------------------------------------------------------
%macro EnableA20 0
push ax
in al,92h
or al,00000010b
out 92h,al
pop ax
%endmacro
;----------------------------------------------------------------------------
;关闭A20地址线
;----------------------------------------------------------------------------
%macro DisableA20 0
push ax
in al,92h
and al,11111101b
out 92h,al
pop ax
%endmacro
;----------------------------------------------------------------------------
;16位偏移的段间直接转移指令的宏定义(在16位代码段中使用)
;----------------------------------------------------------------------------
%macro JUMP16 2
DB 0eah ;操作码
DW %2 ;16位偏移量
DW %1 ;段值或段选择子
%endmacro
;----------------------------------------------------------------------------
;32位偏移的段间直接转移指令的宏定义(在32位代码段中使用)
;----------------------------------------------------------------------------
;COMMENT <JUMP32>
;JUMP32 MACRO Selector,Offset
; DB 0eah ;操作码
; DD OFFSET
; DW Selector ;段值或段选择子
; ENDM
;<JUMP32>
;-------------------------------------------------
%macro JUMP32 2
DB 0eah ;操作码
DW %2
DW 0
DW %1 ;段值或段选择子
%endmacro
;----------------------------------------------------------------------------
;16位偏移的段间调用指令的宏定义(在16位代码段中使用)
;----------------------------------------------------------------------------
%macro CALL16 2
DB 9ah ;操作码
DW %2 ;16位偏移量
DW %1 ;段值或段选择子
%endmacro
;----------------------------------------------------------------------------
;32位偏移的段间调用指令的宏定义(在32位代码段中使用)
;----------------------------------------------------------------------------
;COMMENT <CALL32>
;CALL32 MACRO Selector,Offset
; DB 9ah ;操作码
; DD Offset
; DW Selector ;段值或段选择子
; ENDM
;<CALL32>
;-------------------------------------------------
%macro CALL32 2
DB 9ah ;操作码
DW %1
DW 0
DW %2 ;段值或段选择子
%endmacro
;----------------------------------------------------------------------------
;存储段描述符结构类型定义
;----------------------------------------------------------------------------
;STRUC Desc
;LimitL DW 0 ;段界限(BIT0-15)
;BaseL DW 0 ;段基地址(BIT0-15)
;BaseM DB 0 ;段基地址(BIT16-23)
;Attributes DB 0 ;段属性
;LimitH DB 0 ;段界限(BIT16-19)(含段属性的高4位)
;BaseH DB 0 ;段基地址(BIT24-31)
;ENDSTRUC
;----------------------------------------------------------------------------
;门描述符结构类型定义
;----------------------------------------------------------------------------
;STRUC Gate
;OffsetL DW 0 ;32位偏移的低16位
;Selector DW 0 ;选择子
;DCount DB 0 ;双字计数
;GType DB 0 ;类型
;OffsetH DW 0 ;32位偏移的高16位
;ENDSTRUC
;----------------------------------------------------------------------------
;伪描述符结构类型定义(用于装入全局或中断描述符表寄存器)
;----------------------------------------------------------------------------
;STRUC PDesc
;Limit DW 0 ;16位界限
;Base DD 0 ;32位基地址
;ENDSTRUC
;----------------------------------------------------------------------------
;任务状态段结构类型定义
;----------------------------------------------------------------------------
%macro TSSDef 1
%1 :
STRUC TSS
.TRLink DW 0 ;链接字段
DW 0 ;不使用,置为0
.TRESP0 DD 0 ;0级堆栈指针
.TRSS0 DW 0 ;0级堆栈段寄存器
DW 0 ;不使用,置为0
.TRESP1 DD 0 ;1级堆栈指针
.TRSS1 DW 0 ;1级堆栈段寄存器
DW 0 ;不使用,置为0
.TRESP2 DD 0 ;2级堆栈指针
.TRSS2 DW 0 ;2级堆栈段寄存器
DW 0 ;不使用,置为0
.TRCR3 DD 0 ;CR3
.TREIP DD 0 ;EIP
.TREFlag DD 0 ;EFLAGS
.TREAX DD 0 ;EAX
.TRECX DD 0 ;ECX
.TREDX DD 0 ;EDX
.TREBX DD 0 ;EBX
.TRESP DD 0 ;ESP
.TREBP DD 0 ;EBP
.TRESI DD 0 ;ESI
.TREDI DD 0 ;EDI
.TRES DW 0 ;ES
DW 0 ;不使用,置为0
.TRCS DW 0 ;CS
DW 0 ;不使用,置为0
.TRSS DW 0 ;SS
DW 0 ;不使用,置为0
.TRDS DW 0 ;DS
DW 0 ;不使用,置为0
.TRFS DW 0 ;FS
DW 0 ;不使用,置为0
.TRGS DW 0 ;GS
DW 0 ;不使用,置为0
.TRLDTR DW 0 ;LDTR
DW 0 ;不使用,置为0
.TRTrip DW 0 ;调试陷阱标志(只用位0)
.TRIOMap DW $+2 ;指向I/O许可位图区的段内偏移
ENDSTRUC
%endmacro
;----------------------------------------------------------------------------
;存储段描述符类型值说明
;----------------------------------------------------------------------------
ATDR equ 90h ;存在的只读数据段类型值
ATDW equ 92h ;存在的可读写数据段属性值
ATDWA equ 93h ;存在的已访问可读写数据段类型值
ATCE equ 98h ;存在的只执行代码段属性值
ATCER equ 9ah ;存在的可执行可读代码段属性值
ATCCO equ 9ch ;存在的只执行一致代码段属性值
ATCCOR equ 9eh ;存在的可执行可读一致代码段属性值
;----------------------------------------------------------------------------
;系统段描述符类型值说明
;----------------------------------------------------------------------------
ATLDT equ 82h ;局部描述符表段类型值
ATTaskGate equ 85h ;任务门类型值
AT386TSS equ 89h ;可用386任务状态段类型值
AT386CGate equ 8ch ;386调用门类型值
AT386IGate equ 8eh ;386中断门类型值
AT386TGate equ 8fh ;386陷阱门类型值
;----------------------------------------------------------------------------
;DPL值说明
;----------------------------------------------------------------------------
DPL0 equ 00h ;DPLequ0
DPL1 equ 20h ;DPLequ1
DPL2 equ 40h ;DPLequ2
DPL3 equ 60h ;DPLequ3
;----------------------------------------------------------------------------
;RPL值说明
;----------------------------------------------------------------------------
RPL0 equ 00h ;RPLequ0
RPL1 equ 01h ;RPLequ1
RPL2 equ 02h ;RPLequ2
RPL3 equ 03h ;RPLequ3
;----------------------------------------------------------------------------
;IOPL值说明
;----------------------------------------------------------------------------
IOPL0 equ 0000h ;IOPLequ0
IOPL1 equ 1000h ;IOPLequ1
IOPL2 equ 2000h ;IOPLequ2
IOPL3 equ 3000h ;IOPLequ3
;----------------------------------------------------------------------------
;其它常量值说明
;----------------------------------------------------------------------------
D32 equ 40h ;32位代码段标志
GL equ 80h ;段界限以4K为单位标志
TIL equ 04h ;TIequ1(局部描述符表标志)
VMFL equ 00020000h ;VMFequ1
VMFLW equ 0002h
IFL equ 00000200h ;IFequ1
RFL equ 00010000h ;RFequ1(重启动标志,为1表示忽略调试故障)
RFLW equ 0001h
NTL equ 00004000h ;NTequ1
;----------------------------------------------------------------------------
;分页机制使用的常量说明
;----------------------------------------------------------------------------
PL equ 1 ;页存在属性位
RWR equ 0 ;R/W属性位值,读/执行
RWW equ 2 ;R/W属性位值,读/写/执行
USS equ 0 ;U/S属性位值,系统级
USU equ 4 ;U/S属性位值,用户级
;----------------------------------------------------------------------------
%macro Desc 3 ;段描述符宏
dw (%2) & 0ffffh ;界限值0-15位
dw (%1) & 0ffffh ;基地址0-15位
db ((%1) >> 16) & 0ffh ;基地址16-23位
dw (((%2) >> 8) & 0f00h) | (%3) ;界限值16-19位,和段属性
db ((%1) >> 24) & 0ffh ;基地址24-31位
%endmacro
%macro Gate 4 ;门描述符宏
dw (%1) & 0ffffh ;偏移0-15位
dW %2 ;选择子
db %3 ;双字计数
db %4 ;类型
db ((%1) >> 16) & 0ffffh ;偏移16-31位
%endmacro
%macro PDesc 2
DW %2 ;16位界限
DD %1 ;32位基地址
%endmacro
SA_BYTES equ 0 << 15 ;段粒度:字节
SA_PAGES equ 1 << 15 ;段粒度:页
SA_16BIT equ 0 << 14 ;16位段
SA_32BIT equ 1 << 14 ;32位段
SA_ABSENT equ 0 << 7 ;不存在
SA_PRESENT equ 1 << 7 ;存在
SA_DPL_0 equ 0 << 5 ;段特权级0-3
SA_DPL_1 equ 1 << 5
SA_DPL_2 equ 2 << 5
SA_DPL_3 equ 3 << 5
SA_SYSTEM equ 0 << 4 ;系统段
SA_STORAGE equ 1 << 4 ;存储段
SA_DATA equ 0 << 3 ;数据段
SA_CODE equ 1 << 3 ;代码段
SA_CONFORM equ 1 << 2 ;一致代码段
SA_STACK equ 1 << 2 ;堆栈段
SA_READ equ 1 << 1 ;可读
SA_WRITE equ 1 << 1 ;可写
SA_UNACCESSED equ 0 << 0 ;访问过
SA_ACCESSED equ 1 << 0 ;未访问过
%endif