-
-
[旧帖] [求助]NASM汇编,进入保护模式出错,求高手帮我看看代码哪里错了. 0.00雪花
-
发表于: 2012-6-9 16:45 1192
-
NASM汇编,进入保护模式出错,求高手帮我看看代码哪里错了.
ORG 0000H [BITS 16] JMP START;跳转到代码开头 ;============================================= ;--------------打开20根总线 OPEN20: PUSH AX ;保存AX的值 IN AL,92H ;从92H端口读取1个字节数据到AL OR AL,00000010B ;将AL第7位变成1 OUT 92H,AL ;把AL的内容放进92H端口 POP AX ;恢复AX的值 RET ;返回 ;--------------------------------------------- ;--------------关闭20根总线 CLOSE20: PUSH AX ;保存AX的值 IN AL,92H ;从92H端口读取1个字节数据到AL AND AL,11111101B ;将AL第7位变成0 OUT 92H,AL ;把AL的内容放进92H端口 POP AX ;恢复AX的值 RET ;返回 ;--------------------------------------------- ;--------------控制寄存器CR0的PE位转为1 ORCR0: PUSH EAX ;保存AX的值 MOV EAX,CR0 OR EAX,1 MOV CR0,EAX POP EAX ;恢复AX的值 RET ;返回 ;============================================= GDTSize EQU ((GDT_END)-(GDT_START));GDT长度 GDT_START: Video:;显存 DW (0FFFH) ;段界限1(低16位) DW (8000H) ;段基址1(低16位) DB (0BH) ;段基址(中8位) DB (01001111B) ;段属性 DB (00000000B) ;段界限高4位+段属性高4位 DB (00H) ;段基址高8位 GDT_END: GdtPtr: DW ((GDTSize)-(1));GDT界限 GDTAddr:DD (0);GDT基址(32位的),暂时为0,代码执行后进行自动计算填写 ;--------------[代码开始] START: MOV AX,CS MOV DS,AX XOR EAX,EAX MOV AX,DS SHL EAX,(4) ;左移4位,根据[段:偏移]算法,计算GDT的物理地址 ADD EAX,(GDT_START) MOV DWORD [GDTAddr],EAX ;GDT基址 LGDT [GdtPtr] ;加载GDT CLI ;关闭中断 CALL OPEN20 ;打开20根总线 CALL ORCR0 ;进入保护模式 [BITS 32] ;32位,这之后的代码就是32位的了. MOV EAX,((Video)-(GDT_START)) MOV GS,EAX MOV EBX,00000000H MOV AH,0CH ; 0000: background(black) 1100: foreground(red) MOV AL, 'P' MOV WORD [GS:EBX],AX JMP $ ;在此停止 TIMES 510-($-$$) DB 0;填充剩下的空间,使生成的二进制代码恰好为512字节 DW 0xAA55; 结束标志
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: