杨季文 80x86汇编语言程序设计 实例五
2008-03-17 22:24
113 查看
;编译:TASM T10-5.ASM
;链接:TLINK /32 T10-5.OBJ
INCLUDE 386SCD.asm
.386P
GDTSEG SEGMENT PARA USE16
GDT LABEL BYTE
DUMMY DESCRIPTOR <>
NORMAL DESCRIPTOR <0FFFFH,0,0,92H,>
NORMAL_SEL = NORMAL-GDT
EFFGDT LABEL BYTE
DEMOTSS DESCRIPTOR <DEMOTSSLEN-1,DEMOTSSSEG,0,89H,>
DEMOTSS_SEL = DEMOTSS-GDT
DEMOLDTD DESCRIPTOR <DEMOLDTLEN-1,DEMOLDTSEG,,82H,>
DEMOLDT_SEL = DEMOLDTD-GDT
TEMPTSS DESCRIPTOR <TEMPTSSLEN-1,TEMPTSSSEG,,89H+40H,>
TEMPTSS_SEL = TEMPTSS-GDT
TEMPCODE DESCRIPTOR <0ffffh,TEMPCODESEG,0,98H,>
TEMPCODE_SEL = TEMPCODE-GDT
SUBR DESCRIPTOR <SUBRLEN-1,SUBRSEG,,4098H,>
SUBR_SEL = SUBR-GDT+RPL3
VIDEOBUFFER DESCRIPTOR <0FFFFH,0,0,0F00H+92H+DPL3,0>
VIDEO_SEL = VIDEOBUFFER-GDT
GDNUM = ($-EFFGDT)/(SIZE DESCRIPTOR)
GDTLEN = $-GDT
GDTSEG ENDS
DemoLDTSEG SEGMENT PARA USE16
DEMOLDT LABEL BYTE
DEMOSTACK0 DESCRIPTOR <DEMOSTACK0LEN-1,DEMOSTACK0SEG,,92H+4000H,>
DEMOSTACK0_SEL = (DEMOSTACK0-DEMOLDT)+TIL
DEMOSTACK2 DESCRIPTOR <DEMOSTACK2LEN-1,DEMOSTACK2SEG,,92H+4000H+40H,>
DEMOSTACK2_SEL = (DEMOSTACK2-DEMOLDT)+TIL+RPL2
DEMOCODE DESCRIPTOR <DEMOCODELEN-1,DEMOCODESEG,,4098H+40H,>
DEMOCODE_SEL = DEMOCODE-DEMOLDT+TIL+RPL2
DEMODATA DESCRIPTOR <DEMODATALEN-1,DEMODATASEG,,92H+4000H+60H,>
DEMODATA_SEL = DEMODATA-DEMOLDT+TIL
TODLDT DESCRIPTOR <DEMOLDTLEN-1,DemoLDTSEG,,92H+40H,>
TODLDT_SEL = TODLDT-DEMOLDT+TIL
TOTTSS DESCRIPTOR <TEMPTSSLEN-1,TEMPTSSSEG,,92H+40H,>
TOTTSS_SEL = TOTTSS-DEMOLDT+TIL
DEMOLDNUM = ($-DEMOLDT)/(SIZE DESCRIPTOR)
TOSUBR GATE <SUBRB,SUBR_SEL,0,8CH+60H,0>
TOSUBR_SEL = TOSUBR-DEMOLDT+TIL+RPL2
TOTEMPT GATE <0,TEMPTSS_SEL,0,85H+60H,0>
TOTEMPT_SEL = TOTEMPT-DEMOLDT+TIL
DEMOLDTLEN = $-DEMOLDT
DemoLDTSEG ENDS
;----------------------------
DemoTSSSEG SEGMENT PARA USE16
DD 0
DD DemoStack0LEN
DW DemoStack0_SEL,0
DD 0
DW ?,0
DD DemoStack2LEN
DW DemoStack2_SEL,0
DD 0
DW DEMOBEGIN,0
DD 0
DD 0
DD 0
DD 0
DD 0
DD DEMOSTACK2LEN
DD 0
DD 0
DD 0B8000H
DW VIDEO_SEL,0
DW DEMOCODE_SEL,0
DW DemoStack2_SEL,0
DW DEMODATA_SEL,0
DW TODLDT_SEL,0
DW TOTTSS_SEL,0
DW DEMOLDT_SEL,0
DW 0
DW $+2
DB 0FFH
DemoTSSLEN = $
DemoTSSSEG ENDS
;------------------------------
DemoStack0SEG SEGMENT PARA USE32
DemoStack0LEN = 1024
DB DemoStack0LEN DUP(0)
DemoStack0SEG ENDS
DemoStack2SEG SEGMENT PARA USE32
DemoStack2LEN = 512
DB DemoStack2LEN DUP(0)
DemoStack2SEG ENDS
DEMODATASEG SEGMENT PARA USE32
MESSAGE DB 'VALUE = ',0
DEMODATALEN = $
DEMODATASEG ENDS
;-----------------------------
SUBRSEG SEGMENT PARA USE32
ASSUME CS:SUBRSEG
SUBRB PROC FAR
PUSH EBP
MOV EBP,ESP
PUSHAD
MOV EAX,[EBP+12]
MOV ESI,EAX
MOV AH,7
JMP SHORT SUBR2
SUBR1:STOSW
SUBR2:LODSB
OR AL,AL
JNZ SUBR1
MOV EDX,[EBP+16]
MOV ECX,8
SUBR3:ROL EDX,4
MOV AL,DL
CALL HTOASC
STOSW
LOOP SUBR3
POPAD
POP EBP
RET 8
SUBRB ENDP
HTOASC PROC
AND AL,0FH
ADD AL,90H
DAA
ADC AL,40H
DAA
RET
HTOASC ENDP
SUBRLEN = $
SUBRSEG ENDS
;-----------------------------
DemoCodeSEG SEGMENT PARA USE32
ASSUME CS:DemoCodeSEG
DemoBegin:
MOV FS:TOSUBR.DCOUNT,2
PUSH DWORD PTR GS:TEMPTASK.TREIP
PUSH OFFSET MESSAGE
CALL32 TOSUBR_SEL,0
ASSUME DS:TEMPTSSSEG
PUSH GS
POP DS
MOV AX,NORMAL_SEL
MOV TEMPTASK.TRDS,AX
MOV TEMPTASK.TRES,AX
MOV TEMPTASK.TRFS,AX
MOV TEMPTASK.TRGS,AX
MOV TEMPTASK.TRSS,AX
JUMP32 TOTEMPT_SEL,0
DemoCodeLEN = $
DemoCodeSEG ENDS
TEMPTSSSEG SEGMENT PARA USE16
TEMPTASK TASKSS <>
DB 0FFH
TEMPTSSLEN = $
TEMPTSSSEG ENDS
;-----------------------------
TempCodeSEG SEGMENT PARA USE16
ASSUME CS:TempCodeSEG
VIRTUAL:
MOV BX,TEMPTSS_SEL
LTR BX
JUMP16 DEMOTSS_SEL,0
TOREAL:
CLTS
MOV EAX,CR0
AND AX,0FFFEH
MOV CR0,EAX
JUMP16 <SEG REAL>,<OFFSET REAL>
TempCodeLEN = $
TempCodeSEG ENDS
;---------------------------
RDataSeg SEGMENT PARA USE16
VGDTR PDESC <GDTLEN-1,>
SPVAR DW ?
SSVAR DW ?
RDataSeg ENDS
;---------------------------
RCodeSEG SEGMENT PARA USE16
ASSUME CS:RCodeSEG,DS:RDataSeg
START:
MOV AX,RDataSeg
MOV DS,AX
CLD
CALL INIT_GDT
MOV AX,DemoLDTSEG
MOV FS,AX
MOV SI,OFFSET DemoLDT
MOV CX,DemoLDNUM
CALL INIT_LDT
MOV SSVAR,SS
MOV SPVAR,SP
LGDT QWORD PTR VGDTR
CLI
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JUMP16 TempCode_SEL,<OFFSET Virtual>
REAL:
4000
MOV AX,RDataSeg
MOV DS,AX
LSS SP,DWORD PTR SPVAR
STI
MOV AH,4CH
INT 21H
INIT_GDT PROC NEAR
PUSH DS
MOV AX,GDTSEG
MOV DS,AX
MOV CX,GDNUM
MOV SI,OFFSET EFFGDT
INITG:MOV AX,[SI].BASEL
MOVZX EAX,AX
SHL EAX,4
SHLD EDX,EAX,16
MOV [SI].BASEL,AX
MOV [SI].BASEM,DL
MOV [SI].BASEH,DH
ADD SI,SIZE DESCRIPTOR
LOOP INITG
POP DS
MOV BX,16
MOV AX,GDTSEG
MUL BX
MOV WORD PTR VGDTR.BASE,AX
MOV WORD PTR VGDTR.BASE+2,DX
RET
INIT_GDT ENDP
INIT_LDT PROC
ILDT: MOV AX,FS:[SI].BASEL
MOVZX EAX,AX
SHL EAX,4
SHLD EDX,EAX,16
MOV FS:[SI].BASEL,AX
MOV FS:[SI].BASEM,DL
MOV FS:[SI].BASEH,DH
ADD SI,SIZE DESCRIPTOR
LOOP ILDT
RET
INIT_LDT ENDP
RCodeSEG ENDS
END START
;链接:TLINK /32 T10-5.OBJ
INCLUDE 386SCD.asm
.386P
GDTSEG SEGMENT PARA USE16
GDT LABEL BYTE
DUMMY DESCRIPTOR <>
NORMAL DESCRIPTOR <0FFFFH,0,0,92H,>
NORMAL_SEL = NORMAL-GDT
EFFGDT LABEL BYTE
DEMOTSS DESCRIPTOR <DEMOTSSLEN-1,DEMOTSSSEG,0,89H,>
DEMOTSS_SEL = DEMOTSS-GDT
DEMOLDTD DESCRIPTOR <DEMOLDTLEN-1,DEMOLDTSEG,,82H,>
DEMOLDT_SEL = DEMOLDTD-GDT
TEMPTSS DESCRIPTOR <TEMPTSSLEN-1,TEMPTSSSEG,,89H+40H,>
TEMPTSS_SEL = TEMPTSS-GDT
TEMPCODE DESCRIPTOR <0ffffh,TEMPCODESEG,0,98H,>
TEMPCODE_SEL = TEMPCODE-GDT
SUBR DESCRIPTOR <SUBRLEN-1,SUBRSEG,,4098H,>
SUBR_SEL = SUBR-GDT+RPL3
VIDEOBUFFER DESCRIPTOR <0FFFFH,0,0,0F00H+92H+DPL3,0>
VIDEO_SEL = VIDEOBUFFER-GDT
GDNUM = ($-EFFGDT)/(SIZE DESCRIPTOR)
GDTLEN = $-GDT
GDTSEG ENDS
DemoLDTSEG SEGMENT PARA USE16
DEMOLDT LABEL BYTE
DEMOSTACK0 DESCRIPTOR <DEMOSTACK0LEN-1,DEMOSTACK0SEG,,92H+4000H,>
DEMOSTACK0_SEL = (DEMOSTACK0-DEMOLDT)+TIL
DEMOSTACK2 DESCRIPTOR <DEMOSTACK2LEN-1,DEMOSTACK2SEG,,92H+4000H+40H,>
DEMOSTACK2_SEL = (DEMOSTACK2-DEMOLDT)+TIL+RPL2
DEMOCODE DESCRIPTOR <DEMOCODELEN-1,DEMOCODESEG,,4098H+40H,>
DEMOCODE_SEL = DEMOCODE-DEMOLDT+TIL+RPL2
DEMODATA DESCRIPTOR <DEMODATALEN-1,DEMODATASEG,,92H+4000H+60H,>
DEMODATA_SEL = DEMODATA-DEMOLDT+TIL
TODLDT DESCRIPTOR <DEMOLDTLEN-1,DemoLDTSEG,,92H+40H,>
TODLDT_SEL = TODLDT-DEMOLDT+TIL
TOTTSS DESCRIPTOR <TEMPTSSLEN-1,TEMPTSSSEG,,92H+40H,>
TOTTSS_SEL = TOTTSS-DEMOLDT+TIL
DEMOLDNUM = ($-DEMOLDT)/(SIZE DESCRIPTOR)
TOSUBR GATE <SUBRB,SUBR_SEL,0,8CH+60H,0>
TOSUBR_SEL = TOSUBR-DEMOLDT+TIL+RPL2
TOTEMPT GATE <0,TEMPTSS_SEL,0,85H+60H,0>
TOTEMPT_SEL = TOTEMPT-DEMOLDT+TIL
DEMOLDTLEN = $-DEMOLDT
DemoLDTSEG ENDS
;----------------------------
DemoTSSSEG SEGMENT PARA USE16
DD 0
DD DemoStack0LEN
DW DemoStack0_SEL,0
DD 0
DW ?,0
DD DemoStack2LEN
DW DemoStack2_SEL,0
DD 0
DW DEMOBEGIN,0
DD 0
DD 0
DD 0
DD 0
DD 0
DD DEMOSTACK2LEN
DD 0
DD 0
DD 0B8000H
DW VIDEO_SEL,0
DW DEMOCODE_SEL,0
DW DemoStack2_SEL,0
DW DEMODATA_SEL,0
DW TODLDT_SEL,0
DW TOTTSS_SEL,0
DW DEMOLDT_SEL,0
DW 0
DW $+2
DB 0FFH
DemoTSSLEN = $
DemoTSSSEG ENDS
;------------------------------
DemoStack0SEG SEGMENT PARA USE32
DemoStack0LEN = 1024
DB DemoStack0LEN DUP(0)
DemoStack0SEG ENDS
DemoStack2SEG SEGMENT PARA USE32
DemoStack2LEN = 512
DB DemoStack2LEN DUP(0)
DemoStack2SEG ENDS
DEMODATASEG SEGMENT PARA USE32
MESSAGE DB 'VALUE = ',0
DEMODATALEN = $
DEMODATASEG ENDS
;-----------------------------
SUBRSEG SEGMENT PARA USE32
ASSUME CS:SUBRSEG
SUBRB PROC FAR
PUSH EBP
MOV EBP,ESP
PUSHAD
MOV EAX,[EBP+12]
MOV ESI,EAX
MOV AH,7
JMP SHORT SUBR2
SUBR1:STOSW
SUBR2:LODSB
OR AL,AL
JNZ SUBR1
MOV EDX,[EBP+16]
MOV ECX,8
SUBR3:ROL EDX,4
MOV AL,DL
CALL HTOASC
STOSW
LOOP SUBR3
POPAD
POP EBP
RET 8
SUBRB ENDP
HTOASC PROC
AND AL,0FH
ADD AL,90H
DAA
ADC AL,40H
DAA
RET
HTOASC ENDP
SUBRLEN = $
SUBRSEG ENDS
;-----------------------------
DemoCodeSEG SEGMENT PARA USE32
ASSUME CS:DemoCodeSEG
DemoBegin:
MOV FS:TOSUBR.DCOUNT,2
PUSH DWORD PTR GS:TEMPTASK.TREIP
PUSH OFFSET MESSAGE
CALL32 TOSUBR_SEL,0
ASSUME DS:TEMPTSSSEG
PUSH GS
POP DS
MOV AX,NORMAL_SEL
MOV TEMPTASK.TRDS,AX
MOV TEMPTASK.TRES,AX
MOV TEMPTASK.TRFS,AX
MOV TEMPTASK.TRGS,AX
MOV TEMPTASK.TRSS,AX
JUMP32 TOTEMPT_SEL,0
DemoCodeLEN = $
DemoCodeSEG ENDS
TEMPTSSSEG SEGMENT PARA USE16
TEMPTASK TASKSS <>
DB 0FFH
TEMPTSSLEN = $
TEMPTSSSEG ENDS
;-----------------------------
TempCodeSEG SEGMENT PARA USE16
ASSUME CS:TempCodeSEG
VIRTUAL:
MOV BX,TEMPTSS_SEL
LTR BX
JUMP16 DEMOTSS_SEL,0
TOREAL:
CLTS
MOV EAX,CR0
AND AX,0FFFEH
MOV CR0,EAX
JUMP16 <SEG REAL>,<OFFSET REAL>
TempCodeLEN = $
TempCodeSEG ENDS
;---------------------------
RDataSeg SEGMENT PARA USE16
VGDTR PDESC <GDTLEN-1,>
SPVAR DW ?
SSVAR DW ?
RDataSeg ENDS
;---------------------------
RCodeSEG SEGMENT PARA USE16
ASSUME CS:RCodeSEG,DS:RDataSeg
START:
MOV AX,RDataSeg
MOV DS,AX
CLD
CALL INIT_GDT
MOV AX,DemoLDTSEG
MOV FS,AX
MOV SI,OFFSET DemoLDT
MOV CX,DemoLDNUM
CALL INIT_LDT
MOV SSVAR,SS
MOV SPVAR,SP
LGDT QWORD PTR VGDTR
CLI
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JUMP16 TempCode_SEL,<OFFSET Virtual>
REAL:
4000
MOV AX,RDataSeg
MOV DS,AX
LSS SP,DWORD PTR SPVAR
STI
MOV AH,4CH
INT 21H
INIT_GDT PROC NEAR
PUSH DS
MOV AX,GDTSEG
MOV DS,AX
MOV CX,GDNUM
MOV SI,OFFSET EFFGDT
INITG:MOV AX,[SI].BASEL
MOVZX EAX,AX
SHL EAX,4
SHLD EDX,EAX,16
MOV [SI].BASEL,AX
MOV [SI].BASEM,DL
MOV [SI].BASEH,DH
ADD SI,SIZE DESCRIPTOR
LOOP INITG
POP DS
MOV BX,16
MOV AX,GDTSEG
MUL BX
MOV WORD PTR VGDTR.BASE,AX
MOV WORD PTR VGDTR.BASE+2,DX
RET
INIT_GDT ENDP
INIT_LDT PROC
ILDT: MOV AX,FS:[SI].BASEL
MOVZX EAX,AX
SHL EAX,4
SHLD EDX,EAX,16
MOV FS:[SI].BASEL,AX
MOV FS:[SI].BASEM,DL
MOV FS:[SI].BASEH,DH
ADD SI,SIZE DESCRIPTOR
LOOP ILDT
RET
INIT_LDT ENDP
RCodeSEG ENDS
END START
相关文章推荐
- 杨季文 80x86汇编语言程序设计 实例一
- 杨季文 80x86汇编语言程序设计 实例三
- 杨季文 80x86汇编语言程序设计 实例二
- CPU卡程序设计实例(六)ETU配置
- Windows程序设计的第一个实例
- CPU卡程序设计实例(十六)文件选择
- 深入浅出Win32多线程程序设计之(五):综合实例
- WPF程序设计指南(Applications = Code + Markup)实例源码下载
- Linux 程序设计学习笔记----终端及串口编程及实例应用
- unix网络编程各种TCP客户-服务器程序设计实例(三)
- JavaScript程序设计高级算法之动态规划实例分析
- Android学习总结————Java程序设计技巧与开发实例(朱福喜)
- Linux JNI实例及其JNI程序设计模板
- [转]smarty实例教程 ---程序设计部分
- 程序设计模式(五) C++ 单实例(Singleton)模式
- 面向对象的程序设计-学习笔记-28-虚函数的使用(实例补充)
- CPU卡程序设计实例(七)CPU卡上、下电
- Java 打印程序设计实例
- PHP面向对象程序设计之类常量用法实例
- 深入浅出Win32多线程程序设计之综合实例