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

编程学习

我的网上家园

 
 
 

日志

 
 

14章习题 完整修改方法  

2013-04-10 20:56:15|  分类: 《x86汇编语言: |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
小备注: 在32位模式下注意 push ecx 与push cx 以及push ds的区别,这比较重要.
push ecx 压栈时 ESP=ESP-4 
push ds 压栈时,ESP=ESP-4
但 push cx压栈时,ESP=ESP-2  
push cx会生成0x66的机器码前缀,表示16位压栈操作,但push ds进行的是32位压栈操作.

第一部分: 修改子例程 read_hard_disk_0
在源代码152行添加以下代码:
push ds
push ebp
mov ebp,esp
mov ax,[ebp+6*4]
arpl [ebp+8*4],ax
mov ds,[ebp+8*4]
mov ebx,[ebp+7*4]
删掉153行
修改 160 行为   mov eax,[ebp+9*4]
在194行添加以下代码:
pop ebp
pop ds
修改199行为 retf 12
第二部分: 主例程调用子例程的相关修改
在491行与492行之间添加以下代码:
         push eax
         push ds
         push ebx
在516行与517行之间(.b1:标号后面)添加以下代码:
         push eax
         push ds
         push ebx
第三部分: 有关read_hard_disk_0的salt表与调用门相关的修改
第365行的 @PrintString 与 第370行的 @ReadDiskData 对调
第367行的 put_string 与第372行的 read_hard_disk_0 对调
(也就是把read_hard_disk_0例程定义在SALT表的第一项)
修改代码:
在812行之后添加以下代码:
         mov eax,[edi+256]
         mov bx,[edi+260]
         mov cx,1_11_0_1100_000_00011B ;特权级3的调用门(3以上的特权级才
;允许访问),3个参数
         call sys_routine_seg_sel:make_gate_descriptor
         call sys_routine_seg_sel:set_up_gdt_descriptor     
         mov [edi+260],cx    
         add edi,salt_item_len
修改813行为  mov ecx,salt_items-1
修改830行为 call far [salt_2+256]
第四部分: 用户程序 C13.ASM的修改
在代码  call far [fs:ReadDiskData]  之前添加以下代码即可:
         push eax
         push ds
         push ebx
  评论这张
 
阅读(8)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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