首页
社区
课程
招聘
[旧帖] [求助]NASM汇编,进入保护模式出错,求高手帮我看看代码哪里错了. 0.00雪花
发表于: 2012-6-9 16:45 1192

[旧帖] [求助]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; 结束标志

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//