麻烦给测试一下这段程序

masmaster 2010-10-01 11:14:05
刚开始学保护模式下汇编,我用masm汇编此程序的时候,出现满屏的错误信息。我怀疑是汇编器的问题。
.386p
assume: cs:code,ds:data
;------------------------------------------------;
jump macro selector,offsetv
db 0eah
dw offsetv
dw selector
endm
;
descriptor struc
limitl dw 0
basel dw 0
basem db 0
attrib dw 0
baseh db 0
descriptor ends
;
pdesc struc
limit dw 0
base dd 0
pdesc ends
;
atdw = 92h
atce = 98h
;------------------------------------------------;
data segment use16
gdt lable byte
dummy descriptor <>
code descriptor <0ffffh,,,atce,>
code_sel = code - gdt
datas descriptor <0ffffh,0,11h,atdw,>
datas_sel = datas - gdt
datad descriptor <0ffffh,,,atdw,>
datad_sel = datad - gdt
gdtlen = $ - gdt
;
vgdtr pdesc<gdtlen-1,>
;
bufferlen = 256
buffer db bufferlen dup (0)
data ends
;------------------------------------------------;
code segment use16
start:
mov ax,data
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,cs
mul bx
mov code.basel,ax
mov code.basem,dl
mov code.baseh,dh
;
mov ax,ds
mul bx
add ax,offset buffer
adc dx,0
mov datad.basel,ax
mov datad.basem,dl
mov datad.baseh,dh
;
lgdt qword ptr vgdtr
;
cli
call ea20
;
mov eax,cr0
or eax,1
mov cr0,eax
;
jump <code_sel>,<offset virtual>
;
virtual:
mov ax,datas_sel
mov ds,ax
mov ax,datad_sel
mov es,ax
cld
xor si,si
xor di,di
mov cx,bufferlen/4
repz movsd
;
mov eax,cr0
and eax,0fffffffeh
mov cr0,eax
;
jump <seg real>,<offset real>
;
real:
call da20
sti
;
mov ax,data
mov ds,ax
mov bx,offset buffer

mov ah,4ch
int 21h
;------------------------------------------------;
;Enable A20
ea20 proc
push ax
in al,92h
or al,2
out 92h,al
pop ax
ret
ea20 endp
;
;Disable A20
da20 proc
push ax
in al,92h
and al,0fdh
out 92h,al
pop ax
ret
da20 endp
;
code ends
end start
...全文
119 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
masmaster 2010-10-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fox4664 的回复:]
进纯DOS了吗。
[/Quote]
我在XP下,用全屏模式,应该没问题吧
fox4664 2010-10-02
  • 打赏
  • 举报
回复
进纯DOS了吗。
fox4664 2010-10-02
  • 打赏
  • 举报
回复
XP不是纯DOS,是虚拟机啊
masmaster 2010-10-01
  • 打赏
  • 举报
回复
我又仔仔细细检查一遍,现在只有两处错误,见代码!
.386p
assume cs:codeseg,ds:dataseg
;------------------------------------------------;
jump macro selector,offsetv
db 0eah
dw offsetv
dw selector
endm
;
descriptor struc
limitl dw 0
basel dw 0
basem db 0
attrib dw 0
baseh db 0
descriptor ends
;
pdesc struc
limit dw 0
base dd 0
pdesc ends
;
atdw = 92h
atce = 98h
;------------------------------------------------;
dataseg segment use16
gdt label byte
dummy descriptor <>
code descriptor <0ffffh,,,atce,>
code_sel = code - gdt
datas descriptor <0ffffh,0,11h,atdw,>
datas_sel = datas - gdt
datad descriptor <0ffffh,,,atdw,>
datad_sel = datad - gdt
gdtlen = $ - gdt
;
vgdtr pdesc<gdtlen-1,>
;
buffer db 256 dup (0)
dataseg ends
;------------------------------------------------;
codeseg segment use16
start:
mov ax,dataseg
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,cs
mul bx
mov code.basel,ax
mov code.basem,dl
mov code.baseh,dh
;
mov ax,ds
mul bx
add ax,offset buffer
adc dx,0
mov datad.basel,ax
mov datad.basem,dl
mov datad.baseh,dh
;
lgdt qword ptr vgdtr ;Error!!!错误1
;
cli
call ea20
;
mov eax,cr0
or eax,1
mov cr0,eax
;
jump <code_sel>,<offset virtual>
;
virtual:
mov ax,datas_sel
mov ds,ax
mov ax,datad_sel
mov es,ax
cld
xor si,si
xor di,di
mov cx,256/4
repz movsd ;Error!!!错误2
;
mov eax,cr0
and eax,0fffffffeh
mov cr0,eax
;
jump <seg real>,<offset real>
;
real:
call da20
sti
;
mov ax,dataseg
mov ds,ax
mov bx,offset buffer

mov ah,4ch
int 21h
;------------------------------------------------;
;Enable A20
ea20 proc
push ax
in al,92h
or al,2
out 92h,al
pop ax
ret
ea20 endp
;
;Disable A20
da20 proc
push ax
in al,92h
and al,0fdh
out 92h,al
pop ax
ret
da20 endp
;
codeseg ends
end start

哪位大侠有空,帮我! 多谢。
masmaster 2010-10-01
  • 打赏
  • 举报
回复
lgdt qword ptr vgdtr ;Error!!!错误1
这句我改成
lgdt fword ptr vgdtr ;设成48位整数指针就没事啦

现在的问题是, 汇编没问题, 如何调试他呢? 用debug调试走到
lgdt fword ptr vgdtr
的时候, 就退出啦。。。郁闷
masmaster 2010-10-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 baynpu 的回复:]
.386p
assume cs:CSEG,ds:data
;------------------------------------------------;
jump macro selector,offsetv
db 0eah
dw offsetv
dw selector
endm
;
descriptor struc
lim……
[/Quote]
老大, 没看懂您的意思, 麻烦给解释一下啊,du啦o多谢
masmaster 2010-10-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lizi5803 的回复:]
把repz和movsd分开写两行看行不行!
没用过masm!只用过tasm!而且是新手
[/Quote]
多谢~~,我没用过tasm,我用的是masm ,呵呵
BAYNPU 2010-10-01
  • 打赏
  • 举报
回复
.386p
assume cs:CSEG,ds:data
;------------------------------------------------;
jump macro selector,offsetv
db 0eah
dw offsetv
dw selector
endm
;
descriptor struc
limitl dw 0
basel dw 0
basem db 0
attrib dw 0
baseh db 0
descriptor ends
;
pdesc struc
limit dw 0
base dd 0
pdesc ends
;
atdw = 92h
atce = 98h
;------------------------------------------------;
data segment use16
GDT LABEL BYTE
dummy descriptor <>
code descriptor <0FFFF,,,atce,>
code_sel = code - gdt
datas descriptor <0ffffh,0H,11h,atdw,>
datas_sel = datas - gdt
datad descriptor <0ffffh,,,atdw,>
datad_sel = datad - gdt
gdtlen = $ - gdt
;
VGDTR PDESC<GDTLEN-1,>
;
bufferlen = 256
buffer db bufferlen dup (0)
data ends
;------------------------------------------------;
CSEG segment use16
start:
mov ax,data
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,cs
mul bx
mov code.basel,ax
mov code.basem,dl
mov code.baseh,dh
;
mov ax,ds
mul bx
add ax,offset buffer
adc dx,0
mov datad.basel,ax
mov datad.basem,dl
mov datad.baseh,dh
;
;LGDT QWORD PTR VGDTR ;只有一处错误
;
cli
call ea20
;
mov eax,cr0
or eax,1
mov cr0,eax
;
jump <code_sel>,<offset virtual>
;
virtual:
mov ax,datas_sel
mov ds,ax
mov ax,datad_sel
mov es,ax
cld
xor si,si
xor di,di
mov cx,bufferlen/4
repz movsd
;
mov eax,cr0
and eax,0fffffffeh
mov cr0,eax
;
jump <seg real>,<offset real>
;
real:
call da20
sti
;
mov ax,data
mov ds,ax
mov bx,offset buffer

mov ah,4ch
int 21h
;------------------------------------------------;
;Enable A20
ea20 proc
push ax
in al,92h
or al,2
out 92h,al
pop ax
ret
ea20 endp
;
;Disable A20
da20 proc
push ax
in al,92h
and al,0fdh
out 92h,al
pop ax
ret
da20 endp
;
CSEG ends
end start
难得糊涂ha 2010-10-01
  • 打赏
  • 举报
回复
把repz和movsd分开写两行看行不行!
没用过masm!只用过tasm!而且是新手

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧