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直播授课