对标号地址的另一种相对寻址方式

汇编程序中, 对数据访问时, 通常是这样的:

_asm{
...
DATA_LABLE:
   _emit 0x87
   _emit 0xa0
   _emit 0x49
   _emit 0x90
...
   mov ebx, dword ptr [DATA_LABLE]
...
}

其中, 当程序编译之后, mov指令中的DATA_LABLE标号地址会被转成一个绝对地址. 而有时绝对地址这一点可能会对这样一种需求带来障碍: 我们希望自己写的汇编代码不管被放在哪块地址空间中都是能正常运行的, 就象我们写高级语言中的那些函数一样, 函数位置可以被随意放置, 丝毫不会影响函数本身的功能使用. 当然, 不得不指出的是, 尽管要求的是同样功能, 但汇编与高级语言之间在这方面的实现却相去甚远. 高级语言的函数在最终被编译之后, 其函数地址也是固定的绝对地址, 而我们所想要用汇编实现的才是真正的"可被任意放置"的二进制执行块.

借用call指令, 可以实现运行期标号地址的相对寻址, 大致的思路如下:

_asm{
...
   call FUNC_START
FUNC_START:
   pop ebx
   sub ebx, offset FUNC_START
   mov [ebp-xx], ebx
...
DATA_LABLE:
   _emit 0x87
   _emit 0xa0
   _emit 0x49
   _emit 0x90
...
   mov eax, [ebp-xx]
   mov ebx, dword ptr [DATA_LABLE+eax]
...
}

步骤是这样的:

1.首先, 在汇编功能块或函数首部, 使用以下语句取得运行期地址与编译地址的修正差值.

  call FUNC_START
FUNC_START:
   pop ebx
   sub ebx, offset FUNC_START
   mov [ebp-xx], ebx

略作解释: call 函数会将eip寄存器压入堆栈, 之后用"pop ebp"是将eip值赋给ebp, 而eip表示的是"下一条语句的地址", 在这里, 当程序运行到"call FUNC_START"时, 它表示的是以标号"FUNC_START:"开始的"pop ebx"指令起始地址. 而另一方面, sub指令中的"offset FUNC_START", 在编译时, offset会被转成一个绝对地址. 这样,通过sub操作, 就获得了此段代码在编译期和运行期关于指令地址的修正值. 下面的这句: "mov [ebp-xx], ebx", 实际上只是锦上添花, 它把这个值保存在了某一个自定义的函数局部变量空间内, 以备后续语句方便引用.

2.相应的, 对标号数据的引用就变成这样的两句:

  mov eax, [ebp-xx]
   mov ebx, dword ptr [DATA_LABLE+eax]

对于汇编函数中的此类代码进行这样的处理后, 此段二进制执行块就可以被放置在任意地方而不致因为对DATA_LABLE数据地址的错误引用造成程序错误.

时间: 2024-09-08 12:37:27

对标号地址的另一种相对寻址方式的相关文章

更改IE收藏夹地址位置的三种方法

更改IE收藏夹地址位置的三种方法: 方法一:收藏夹默认的路径是"C:WindowsFavorites".大家在重装系统时都要事先备份,方法是把这个文件夹拷贝出来,重装系统后再覆盖回去就可以.但很多朋友经常会忘记,结果辛辛苦苦所收藏的精选网址全都没了,真是痛苦万分. 现在如果把收藏夹的路径设到别的盘,如"E:Favorites",就再也不用担心重装系统时而忘了备份的烦恼了.你也想试试吗?步骤如下: 1.把收藏夹"C:WindowsFavorites"

Linux 禁止某个IP地址访问的几种方法

一.概述 这两个文件是tcpd服务器的配置文件,tcpd服务器可以控制外部IP对本机服务的访问.这两个配置文件的格式如下: #服务进程名:主机列表:当规则匹配时可选的命令操作 server_name:hosts-list[:command] /etc/hosts.allow控制可以访问本机的IP地址,/etc/hosts.deny控制禁止访问本机的IP.如果两个文件的配置有冲突,以/etc/hosts.deny为准. /etc/hosts.allow和/etc/hosts.deny两个文件是控制

U-boot mkimage指定Linux内核地址时的两种方式

uImage的制作是使用的u-boot工具mkimage,build完u-boot后也会将mkimage build出來到/tools目录下,可以直接拿來用,它的作用就是在zImage的前面加上64个字节的头,让u-boot能够识别要加载内核的类型.加载地址等. 基本格式:mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image -A 指定CPU的体系结构:(u-bo

wordpress后台地址路径修改几种方法

WordPress 博客默认的登陆链接地址为(http://example.com/wp-login.php),为保证安全,可以修改WordPress登陆文件名wp-login.php后缀,防密码被暴力破解. 方法: 一.修改在网站根目录下的wp-login.php文件名为wp-denglu.php(或者其他名字,以下以此为例),并将该文件wp-denglu.php中出现的字符wp-login.php全部改为wp-denglu.php; 二.查找根目录下的wp-includes/general-

《C++ 黑客编程揭秘与防范(第2版)》—第6章6.3节PE结构的3种地址

6.3 PE结构的3种地址 C++ 黑客编程揭秘与防范(第2版) 在上一章中用OD调试器调试程序时看到的地址与本章使用C32Asm以十六进制形式查看程序时的地址形式有所差异.程序在内存中与在文件中有着不同的地址形式,而且PE相关的地址不只有这两种形式.与PE结构相关的地址形式有3种,且这3种地址形式可以进行转换. 6.3.1 与PE结构相关的3种地址 与PE结构相关的3种地址是VA(虚拟地址).RVA(相对虚拟地址)和FileOffset(文件偏移地址). VA(虚拟地址):PE文件映射到内存后

《C++ 黑客编程揭秘与防范(第2版)》——6.3 PE结构的3种地址

6.3 PE结构的3种地址 C++ 黑客编程揭秘与防范(第2版) 在上一章中用OD调试器调试程序时看到的地址与本章使用C32Asm以十六进制形式查看程序时的地址形式有所差异.程序在内存中与在文件中有着不同的地址形式,而且PE相关的地址不只有这两种形式.与PE结构相关的地址形式有3种,且这3种地址形式可以进行转换. 6.3.1 与PE结构相关的3种地址 与PE结构相关的3种地址是VA(虚拟地址).RVA(相对虚拟地址)和FileOffset(文件偏移地址). VA(虚拟地址):PE文件映射到内存后

如何解决局域网内IP地址冲突故障

在Windows操作系统环境下,普通工作站用户常常可以根据自己的意愿随意修改本地工作站的IP地址参数,那样一来局域网网络就容易频繁发生IP地址冲突的故障现象,这种现象会"干扰"局域网的稳定运行,甚至会给日常的办公效率带来严重的影响.那么作为网络管理员来说,我们究竟该采取什么措施,不让IP地址冲突"干扰"局域网网络的正常.高效运行呢?现在本文就为各位朋友提出一些有效的应对办法,以帮助各位巧妙地管理好自己单位的局域网,确保局域网网络的运行效率不会受到IP地址冲突现象的&

检查Email地址的比较完善的正则表达式函数

比较|函数|正则 下面的函数可以对Email地址格式进行检查,只有形如:abc@abc.abc,abc@abc.abc.abc和abc@abc.abc.abc.abc状的串才能通过检查,如下面这些非法地址都通不过:@abc@163.net,abc@163..net,abc@163.net.,abc@163@net等等都能剔除出来. 邮件地址就这几种格式吧?比如:swuse@yeah.net,liaojiayuan@btamail.net.cn,abc@public.yj.gd.cn还有没有更长的

实例分析URL结构规划中常见的三种错误

我们的站点结构是有一系列的URL地址组成的.站点的URL结构关系到整个站点的优化命脉.或许很多seoer都会遇到内容质量已经够高,外链也不输人,但是偏偏就是页面不收录,或者收录得很少.其实很多的原因还是出在站点的URL结果上,本文中笔者将根据自身遇到的情况,分析三种常见的URL结构错误. 一:URL地址长度问题 我们的URL地址是否对搜索引擎优化,会直接影响到站点的收录量.URL地址可以分为动态.静态以及伪静态地址.除去动态页面,我们可以说静态和伪静态页面还是对搜索引擎相对友好的.而在这三种地址