首页
社区
课程
招聘
[旧帖] [求助]实模式切换保护模式出问题 0.00雪花
发表于: 2008-1-8 16:34 3610

[旧帖] [求助]实模式切换保护模式出问题 0.00雪花

2008-1-8 16:34
3610
80x86汇编语言程序设计教程
上的一段代码。
把代码编译成exe后。在DOS下运行   结果重起机器了。DOS崩溃了。
其中一段代码
JUMP16   CODE32_SEL, <offset   SPM32>
估计在这里程序崩溃的。
这个弘定义为
JUMP16 MACRO selector,offsetv
db 0eah
dw offsetv
dw   selector
ENDM
首先编译没通过。然后我把dw   offsetv这个换成了dd   offsetv就通过编译了。
全代码如下。.把上面我说的那句换掉就可以通过ml.exe编译器   然后我有的MASM50的link.exe连接的obj文件。应该不是编译器的问题我想。因为这个例子前还有一个例子,但是与这个例子不同的是   前一个例子用的全是16位的代码段。我用同样的方法编译然后运行成功。
但是这个例子出问题了。.麻烦帮我看看。.代码是

JUMP16 MACRO selector,offsetv
db 0eah
dw offsetv   ;;这里要换才可以通过ml.exe
dw   selector
ENDM
JUMP32 MACRO   selector,offsetv
db 0eah
dw   offsetv
dw   0
dw selector
ENDM

DESCRIPTOR STRUCT
LIMITL dw 0
BASEL dw 0
BASEM db 0
ATTRIBUTES dw 0
BASEH db 0
DESCRIPTOR ENDS

PDESC STRUCT
LIMIT DW 0
BASE DD 0
PDESC ENDS

ATDR   =   90H
ATDW   =   92H
ATDWA   =   93H
ATCE   =   98H
ATCE32   =   4098H
DATALEN   =   16
.386P
DSEG SEGMENT USE16
GDT LABEL BYTE
DUMMY DESCRIPTOR <>
CODE32_SEL   =   08H
CODE32 DESCRIPTOR <CODE32LEN-1,,,ATCE32,>
CODE16_SEL   =   10H
CODE16 DESCRIPTOR <0FFFFH,,,ATCE>
DATAS_SEL   =   18H
DATAS DESCRIPTOR <DATALEN-1,0FFF0H,0FH,ATDR,0>
DATAD_SEL   =   20H
DATAD DESCRIPTOR <DATALEN*8-1,80A0H,0BH,ATDW,0>
STACKS_SEL   =   28H
STACKS DESCRIPTOR <0FFFFH,,,ATDWA,>
NORMAL_SEL =   30H
NORMAL DESCRIPTOR <0FFFFH,,,ATDW,>
GDTLEN   =   $-GDT

VGDTR PDESC <GDTLEN-1,>
VARSS DW ?
DSEG ENDS

CSEG1 SEGMENT USE16 'REAL'
ASSUME CS:CSEG1,DS:DSEG
START:
mov   ax,DSEG
mov   ds,ax
;
mov   bx,16
mul   bx
add   ax,offset   GDT
adc   dx,0
mov   WORD   PTR   VGDTR.BASE,ax
mov   WORD   PTR   VGDTR.BASE+2,dx
;
mov   ax,CSEG2 ;设置32位代码段基址
mul   bx
mov   CODE32.BASEL,ax
mov   CODE32.BASEM,dl
mov   CODE32.BASEH,dh
;
mov   ax,CSEG3 ;设置16位代码段基址
mul   bx
mov   CODE16.BASEL,ax
mov   CODE16.BASEM,dl
mov   CODE16.BASEH,dh
;
mov   ax,ss ;设置堆栈段基址
mul   bx
mov   STACKS.BASEL,ax
mov   STACKS.BASEM,dl
mov   STACKS.BASEH,dh
;
mov   VARSS,ss
lgdt   VGDTR
cli
push   ax
in   al,92H
or   al,10B
out   92H,al
pop   ax

mov   eax,cr0
or   eax,1
mov   cr0,eax
JUMP16   CODE32_SEL, <offset   SPM32>
TOREAL:
mov   ax,DSEG
mov   ds,ax
mov   ss,VARSS
push   ax
in   al,92H
and   al,0FDH
out   92H,al
pop   ax
sti
mov   ah,4CH
int   21H
CSEG1 ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CSEG2 SEGMENT USE32 'PM32'
ASSUME CS:CSEG2
SPM32:
mov   ax,STACKS_SEL
mov   ss,ax
mov   ax,DATAS_SEL
mov   ds,ax
mov   ax,DATAD_SEL
mov   es,ax
;
xor   esi,esi
xor   edi,edi
mov   ecx,DATALEN
cld
NEXT:
lodsb
push   ax
call   TOASCII
mov   ah,7
shl   eax,16
pop   ax
shr   al,4
call   TOASCII
MOV   AH,7
stosd
mov   al,'   '
stosw
loop   NEXT
JUMP32   CODE16_SEL, <offset   SPM16>
TOASCII proc
cmp   al,09H
ja   TMP
add   al,30H
ret
TMP:
add   al,37H
ret

TOASCII endp
CODE32LEN   =   $-OFFSET   SPM32
CSEG2 ENDS

CSEG3 SEGMENT USE16   'PM16'
assume cs:CSEG3
SPM16:
xor   si,si
mov   di,DATALEN*3*2
mov   ah,7
mov   cx,DATALEN
AGAIN:
lodsb
stosw
loop   AGAIN

mov   ax,NORMAL_SEL
MOV   ds,ax
mov   es,ax
mov   eax,cr0
and   eax,0FFFFFFFEH
mov   cr0,eax
jmp   FAR   PTR   TOREAL
CSEG3 ENDS
END START

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
还有。.CODE32 DESCRIPTOR <CODE32LEN-1,,,ATCE32,>
这里编译器也要抱错。.CODE32LEN =$ 是这样定义的。
2008-1-8 16:35
0
雪    币: 18
活跃值: (2079)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
谁来帮帮忙吧 郁闷了好久了。
2008-1-9 00:47
0
雪    币: 306
活跃值: (385)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
....
....
mov   eax,cr0
or   eax,1
mov   cr0,eax
JUMP16   CODE32_SEL,  0
TOREAL:
mov   ax,DSEG
.....
.....
2008-1-16 14:08
0
游客
登录 | 注册 方可回帖
返回
//