+ -
当前位置:首页 → 问答吧 → 谁有杨季文的T10-3.asm代码,要能编译通过的并能运行

谁有杨季文的T10-3.asm代码,要能编译通过的并能运行

时间:2010-12-27

来源:互联网

我下载的t10-3.asm和386scd.asm,并放在同一个目录,然后分别用masm5.1和tasm3.0编译,发现大量的错误,可是
我把源代码和书上去对,好像没有发现和书上写的有什么不同,不在哪位有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


作者: 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 

作者: 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

作者: leetow2003   发布时间: 2010-12-27

热门下载

更多