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

编程学习

我的网上家园

 
 
 

日志

 
 

第8章练习: 尝试从用户程序返回到加载器.  

2013-01-24 17:17:38|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
思路: 把源代码 加载器部分   jmp far [0x04] 的远跳修改为 call far [0x04],这样在调用用户程序之前,会把当前的CS IP压栈保护.
在用户程序的开始,先用两个寄存器把加载器的SS SP保存,切换到用户自己的栈以后,把加载器的SS SP值放到栈中保存.在用户程序全部结束以后,再恢复SS SP的值为加载器的值,然后使用 retf 指令返回加载器执行.

代码修改如下:
加载器修改:  c08_mbr.asm 
76行, jmp far [0x04] 修改为 call far [0x04],然后在下面添加以下代码:

; 以下代码主要用来在屏幕上显示信息,以确定成功返回了加载器
mov ax,0xb800
mov es,ax
mov di,3200
mov bx,main_message
mov cx,17
main_show:      mov al,[cs:bx]
  mov [es:di],al
inc di
mov byte [es:di],0xa
inc bx
inc di
loop main_show
 jmp $
main_message db 'main prog return!'
 
用户程序修改: c08.asm
135行, start: 后面添加以下代码:
mov bx,ss
mov dx,sp 把加载器的SS SP保存到BX DX
在 mov sp,stack_end 后添加以下代码:
push bx
push dx ;保存主程序的栈寄存器与栈指针的值.
把 167 行 jmp $ 修改为以下代码:
pop dx
pop bx
mov ss,bx
mov sp,dx
retf

  评论这张
 
阅读(44)| 评论(1)
推荐 转载

历史上的今天

评论

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

页脚

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