能力值:
( LV4,RANK:140 )
|
-
-
2 楼
CPU刚进入32位模式,还没有执行JMP 刷新指令?刷新后再看一下,应该就没问题了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
Lnairan
CPU刚进入32位模式,还没有执行JMP 刷新指令?刷新后再看一下,应该就没问题了
非常感谢,我在执行完JMP后,能看到正常的反汇编代码了。但是在执行代码 mov byte [0xb8000],0x66 时会出现错误,执行后下一句代码会回到 jmpf 0xf000:e05b ,而不是我期望的下一步。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
Lnairan
CPU刚进入32位模式,还没有执行JMP 刷新指令?刷新后再看一下,应该就没问题了
段的情况如下: Global Descriptor Table (base=0x0000000000000000, limit=24): GDT[0x00]=??? descriptor hi=0x00000000, lo=0x00000000 GDT[0x01]=Code segment, base=0x00000000, limit=0x000fffff, Execute/Read, Non-Conforming, 32-bit GDT[0x02]=Data segment, base=0x00000000, limit=0x000fffff, Read/Write, Expand-down
|
能力值:
( LV4,RANK:140 )
|
-
-
5 楼
xinxinddx
段的情况如下:
Global Descriptor Table (base=0x0000000000000000, limit=24):
GDT[0x00]=??? descriptor hi=0 ...
DS段寄存器的内容正确吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
Lnairan
DS段寄存器的内容正确吗?
DS段寄存器我使用的是0x10,索引是第二个没有问题的
|
能力值:
( LV4,RANK:140 )
|
-
-
7 楼
xinxinddx
DS段寄存器我使用的是0x10,索引是第二个没有问题的
你代码怎么写的?能发一下吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
Lnairan
你代码怎么写的?能发一下吗?
谢谢你的回复,错误的原因我已经找到了。是我把数据段的扩展方向搞反了,代码如下: mov ax,message
mov bp,ax
mov cx,0x14 ;20个字符
mov ax,0x1301 ;0x13号子功能,01表示显示字符串后,光标跟随到新位置
mov bx,0x2 ;bl 中是字符属性,属性黑底绿字( bl = 02h)
int 0x10
jmp label_init_enter
label_gdt:
dq 0x0
dw 0ffffh ;第一部分段限长
dw 0x0000;第一部分基址
db 0x00;第二部分基址
db 1_00_1_1010b
db 0_1_0_0_1111b
db 0x00
;数据段
dw 0ffffh ;第一部分段限长
dw 0x0000;第一部分基址
db 0x00;第二部分基址
db 1_00_1_0010b;
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
完整代码: mov ax,message mov bp,ax mov cx,0x14 ;20个字符 mov ax,0x1301 ;0x13号子功能,01表示显示字符串后,光标跟随到新位置 mov bx,0x2 ;bl 中是字符属性,属性黑底绿字( bl = 02h) int 0x10 jmp label_init_enter
label_gdt: dq 0x0
dw 0ffffh ;第一部分段限长 dw 0x0000;第一部分基址 db 0x00;第二部分基址 db 1_00_1_1010b db 0_1_0_0_1111b db 0x00
;数据段 dw 0ffffh ;第一部分段限长 dw 0x0000;第一部分基址 db 0x00;第二部分基址 db 1_00_1_0010b;错误出在这里,原来是1_00_1_0110b ,应该设置为向上扩展 db 0_1_0_0_1111b db 0x00 end_gdt: gdtr_addr: dw end_gdt-label_gdt dd 0 label_init_enter: ;把GDT放到内存0处 mov ax,0x1000 mov ds,ax mov si,label_gdt mov ax,0 mov es,ax mov di,0 mov cx,0x18 rep movsb ;关闭中断 cli ;打开A20地址线 in al, 92h or al, 00000010b out 92h, al ;设置cr0的PE位 mov eax,cr0 or eax,1 mov cr0,eax ;设置GDTR lgdt [gdtr_addr] ;跳转刷新CS xor ax,ax add ax,0x10000+entered;计算entered在代码段中的位置 jmp dword 8:entered+0x10000 [BITS 32] ;指定下面的代码是32位模式下的,除非有其他的BITS指定其他模式 entered: [bits 32] mov ax,0000_0000_0001_0000b mov ds,ax mov cl,byte [cs:0x100] mov byte [0xb8000],'M' mov byte [0xb8001],0xa4 jmp $
message db "before Enter protect"
|