注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

编程学习

我的网上家园

 
 
 

日志

 
 

14章 调用门学习与练习  

2013-04-02 17:31:42|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
下面是练习过程中,犯的各种错误:
;=======================================================================================================
这次练习过程中,犯了几个错误,写出来,以备忘.
通过 mov 指令在内存中安装段描述符时,把高32位与低32位全部写反了. 这属于潜意识的错误,习惯性的把高位部分写在上面,低位部分写在下面了,以后要注意.
进入保护模式,初始化栈时,用了SP寄存器,应该是ESP,汗一个.
修改GDT的界限时,计算错误. GDT的界限应该是描述符的个数*8-1,在计算时从0开始计算的,糊涂了.
;=======================================================================================================
;通过调用门调用程序时,指令中的偏移会被忽略
; 请求特权级RPL可以不等于CPL. CPL=0 RPL>=门描述符的DPL 是可以的.

video_ram_seg_sel equ 0x20

xor ax,ax
mov ss,ax
mov sp,0x7c00
mov ax,[cs:pgdt+0x7c00+0x2]
mov dx,[cs:pgdt+0x7c00+0x4]
mov bx,16
div bx
mov ds,ax
mov bx,dx
mov dword [bx+0x00],0
mov dword [bx+0x04],0
;#4GB内存段
mov dword [bx+0x08],0x0000ffff 
mov dword [bx+0x0c],0x00cf9200
;#MBR
mov dword [bx+0x10],0x7c0001ff 
mov dword [bx+0x14],0x00409800
;#堆栈
mov dword [bx+0x18],0x7c00fffe 
mov dword [bx+0x1c],0x00cf9600
;#显示缓冲区
mov dword [bx+0x20],0x80007fff
mov dword [bx+0x24],0x0040920b


;生成putstring调用门描述符
mov edx,0x0000cc00
mov eax,0x10 ;MBR代码段选择子
shl eax,16
or eax,putstring
;#调用门描述符
mov [bx+0x28],eax
mov [bx+0x2c],edx

mov word [cs:pgdt+0x7c00],47
lgdt [cs:pgdt+0x7c00]

in al,0x92
or al,2
out 0x92,al

cli 

mov eax,cr0
or eax,1
mov cr0,eax

jmp 0x10:flush

[bits 32]
flush:
mov eax,0x18
mov ss,eax
mov esp,0
mov eax,0x8
mov ds,eax
mov ebx,message+0x7c00

;=======================================================
; call 0x28:0x0 ;通过调用门显示字符串. 此处指令中的偏移地址任意,通过调用门调用程序时,指令中的偏移会被忽略.
call 0x2a:0x0 ; [0x28->101000B 请求RPL=0] [101010B->0x2a 请求特权级RPL=2]

;请求特权级RPL可以不等于CPL.
;=======================================================

hlt 




;入口参数 DS:EBX 指向字符串所在位置
putstring:
push ecx
.show:
mov cl,[ebx]
or cl,cl
jz .exit
call putchar
inc ebx
jmp .show
.exit:
pop ecx
ret

putchar:
pushad
mov dx,0x3d4
mov al,0xe
out dx,al
inc dx
in al,dx
mov ah,al
dec dx
mov al,0xf
out dx,al
inc dx
in al,dx ;AX=当前光标位置
cmp cl,0xd
jnz .0xa
xor dx,dx
mov bx,80
div bx
mul bx
jmp .setcursor
.0xa:
cmp cl,0xa
jnz .ch
add ax,80
cmp ax,25*80
jb .setcursor
sub ax,80
jmp .rollscreen
.ch:
push es
mov ebx,video_ram_seg_sel
mov es,ebx
movzx ebx,ax
shl ebx,1
mov [es:ebx],cl
pop es
inc ax
cmp ax,25*80
jb .setcursor
mov ax,24*80


.rollscreen:
push ds
push es
mov ebx,video_ram_seg_sel
mov ds,ebx
mov es,ebx
mov esi,1*80*2
xor edi,edi
mov ecx,24*80*2/4
cld
rep movsd
mov esi,80*24*2
mov ecx,80*2/4
.clr:
mov dword [esi],0x07200720
add esi,4
loop .clr
pop es
pop ds

.setcursor:
mov bx,ax
mov dx,0x3d4
mov al,0xe
out dx,al
inc dx
mov al,bh
out dx,al
dec dx
mov al,0xf
out dx,al
inc dx
mov al,bl
out dx,al

popad
ret









message: db 0xd,0xa,' hello,world!',0

pgdt dw 0
dd 0x7e00



times 510-($-$$) db 0
db 0x55,0xaa



  评论这张
 
阅读(29)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017