首页
社区
课程
招聘
[求助]nasm编译,设置了[bits 32] 但是在bochs中调试时出现异常的结果
发表于: 2017-8-23 19:00 3122

[求助]nasm编译,设置了[bits 32] 但是在bochs中调试时出现异常的结果

2017-8-23 19:00
3122

代码如下:


[bits 32]

mov eax,0xb8000


在Bochs中调试时,看到的内容如下:

 mov ax, 0x8000            ; b80080

我感觉是编译的不正确,但是又不知道错在哪里。



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

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 5954
活跃值: (46)
能力值: ( LV4,RANK:140 )
在线值:
发帖
回帖
粉丝
2
CPU刚进入32位模式,还没有执行JMP  刷新指令?刷新后再看一下,应该就没问题了
2017-8-23 20:31
0
雪    币: 10
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
Lnairan CPU刚进入32位模式,还没有执行JMP 刷新指令?刷新后再看一下,应该就没问题了
非常感谢,我在执行完JMP后,能看到正常的反汇编代码了。但是在执行代码  mov  byte  [0xb8000],0x66  时会出现错误,执行后下一句代码会回到  jmpf  0xf000:e05b  ,而不是我期望的下一步。
2017-8-23 21:18
0
雪    币: 10
活跃值: (12)
能力值: ( 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
2017-8-23 21:20
0
雪    币: 5954
活跃值: (46)
能力值: ( LV4,RANK:140 )
在线值:
发帖
回帖
粉丝
5
xinxinddx 段的情况如下: Global Descriptor Table (base=0x0000000000000000, limit=24): GDT[0x00]=??? descriptor hi=0 ...
DS段寄存器的内容正确吗?
2017-8-23 21:50
0
雪    币: 10
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Lnairan DS段寄存器的内容正确吗?
DS段寄存器我使用的是0x10,索引是第二个没有问题的
2017-8-23 22:31
0
雪    币: 5954
活跃值: (46)
能力值: ( LV4,RANK:140 )
在线值:
发帖
回帖
粉丝
7
xinxinddx DS段寄存器我使用的是0x10,索引是第二个没有问题的
你代码怎么写的?能发一下吗?
2017-8-23 23:31
0
雪    币: 10
活跃值: (12)
能力值: ( 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;
2017-8-24 14:50
0
雪    币: 10
活跃值: (12)
能力值: ( 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" 
2017-8-24 14:51
0
游客
登录 | 注册 方可回帖
返回
//