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

编程学习

我的网上家园

 
 
 
 
 
 

VC++ 内联汇编的几点小经验

2013-11-8 16:58:35 阅读222 评论0 82013/11 Nov8

使用的是VC++6.0的版本,有以下几点小经验:

一:
VC++中局部变量,都是用ebp寄存器进行引用的,如果从其它程序中扣出来的汇编代码中使用了ebp寄存器,想要内联到自己的程序中,这真是一件很悲催的事情,但也有解决方法,虽然有些曲折.
函数的参数一般是用 ebp+4 ebp+8 引用的,而函数内定义的局部变量一般是用 ebp-4 ebp-8 引用的,如果内联一段汇编代码,并且这段代码使用了ebp寄存器,那么不仅仅是局部变量跟函数参数无法再用ebp引用,更严重的是如果处理不好,会导致栈不平衡,程序都不能运行.原因是什么呢?  请看以下代码:

push ebp
mov ebp,esp
sub esp,40h

作者  | 2013-11-8 16:58:35 | 阅读(222) |评论(0) | 阅读全文>>

VC++ 6.0 内联汇编练习备忘

2013-8-19 13:24:54 阅读253 评论4 192013/08 Aug19


内联汇编单条汇编语句:     __asm mov eax,0   //示例  两条下划线加asm 关键字,注意是小写,后面跟汇编语句.
多条汇编语句可以用如下形式:

__asm{
mov eax,0
mov ebx,eax
... ...
}

eax用作函数(子程序)返回值,在内联汇编中尽量不要用eax. 函数中内联汇编如果夹杂调用C函数,中间变量要保存在内存中,不要放到寄存器.

作者  | 2013-8-19 13:24:54 | 阅读(253) |评论(4) | 阅读全文>>

在实模式下开启保护模式以后,当前特权级被自动初始化为0特权级,此时的 "当前特权级" 与CS的值无关. CS的值在没有刷新之前,仍然是"段值",而不是段选择子.
下面是测试代码:

video_ram_seg_sel equ 0x20

section mbr
xor ax,ax
mov ss,ax
mov sp,0x7c00
mov ds,ax
mov si,0x7c00
mov ax,0x7f3
mov es,ax
xor di,di
mov cx,0x200
repz movsb                                  ;

作者  | 2013-6-5 14:33:25 | 阅读(72) |评论(0) | 阅读全文>>

分析:
实模式转向保护模式,在刚开启保护模式时,当前特权级被初始化为0,要转到3特权级的代码执行,只能是通过 "假装从高特权级的代码返回" 的方法来达到目的.

以下是全部源代码:

video_ram_seg_sel equ 0x23 ;0x23--> 10_0011B-> 100_0_11B  索引项4,位于GDT中,特权级3

section mbr vstart=0x7c00
xor ax,ax
mov ss,ax
mov sp,0x7c00
mov eax,[cs:pgdt+2]
xor edx,edx

作者  | 2013-6-4 16:28:15 | 阅读(55) |评论(0) | 阅读全文>>

16章分页学习的小测试

2013-6-1 15:28:48 阅读62 评论0 12013/06 June1

开启分页模式,首先要进入保护模式.
进入保护模式以后,先要找一块4KB的内存做为页目录表使用,首先清空这块4KB的内存,然后在最后的一个4字节中写入当前页目录表的物理地址,再找一块4KB内存作为页表使用,在页目录表的开始4字节,写入页表的物理地址,填写页表的前256项与物理地址一 一 对应,因为我们的内核已经在运行中,而且我们的内核很小,1MB内存足够用了. 
填写好页目录表与页表以后,接下来把页目录表的地址传送到CR3寄存器,再设置CR0寄存器,开启分页模式,这样内核就工作在分页模式下了.

作者  | 2013-6-1 15:28:48 | 阅读(62) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 
 
 
 
博友列表加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

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

注册 登录  
 加关注