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

原创 2006年05月25日 23:18:00
汇编程序中, 对数据访问时, 通常是这样的:

_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数据地址的错误引用造成程序错误.

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

汇编程序中, 对数据访问时, 通常是这样的:_asm{...DATA_LABLE:    _emit 0x87    _emit 0xa0    _emit 0x49    _emit 0x90....
  • hejishan
  • hejishan
  • 2008年04月01日 17:06
  • 172

寄存器与七种寻址方式

一、寄存器 总共有14个16位寄存器,8个8位寄存器   通用寄存器:   数据寄存器:   AH(8位)  AL(8位)  AX(16位)   (AX和AL又称累加器)   BH(8位)...
  • bytxl
  • bytxl
  • 2015年09月15日 09:16
  • 3089

操作数的寻址方式(非常重要)

形成操作数的有效地址的方法叫操作数的寻址方式。       指令中的操作数字段的地址码由形式地址和寻址方式特征位等组合形成。一般的指令中所给出的地址码并不是操作数的有效地址。       形式地址也叫...
  • lotluck
  • lotluck
  • 2015年05月16日 07:27
  • 1587

与转移地址有关的寻址方式

1.如何确定当前要执行指令在内存中的位置    IP:instruction pointer.指令指针寄存器。IP寄存器是CPU内部的一个寄存器,用来存储将要执行的下一条指令的偏移量。     CS:...
  • sunyonggao
  • sunyonggao
  • 2007年05月18日 12:59
  • 2303

【寻址】寻址方式

寻址方式
  • sds15732622190
  • sds15732622190
  • 2016年11月05日 20:09
  • 452

七种寻址方式(寄存器相对寻址方式)

操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、D I)的内容和指令中的8位/16位偏移量之和。其有效地址的计算公式如公式所示。 在不使用段超越前缀的情况下,...
  • swartz_lubel
  • swartz_lubel
  • 2018年01月22日 19:12
  • 43

指令格式和数据的寻址方式

一:指令格式 ①三地址指令:一般地址域中A1、A2分别确定第一、第二操作数地址,A3确定结果地址。下一条指令的地址通常由程序计数器按顺序给出。 ②二地址指令:地址域中A1确定第一操作数地址,A...
  • tengjian6107
  • tengjian6107
  • 2016年12月28日 19:31
  • 1469

相对基址加变址寻址方式

操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的计算公式如公式所示。 在不使用段超越前缀的情况下...
  • judyge
  • judyge
  • 2016年08月27日 10:38
  • 508

相对寻址问题求解总结

在指令寻址方式这个知识点上,个人觉得其他的都很直接。有点趣味的要有两个点: 基址寻址和变址寻址的用途辨析 相对寻址的PC自增问题 其他的,现在看来都很直接。虽然曾经学习嵌入式时,很不能理解立即数是什么...
  • u011240016
  • u011240016
  • 2016年10月02日 14:54
  • 2016

汇编中标号的使用

其实标号就代表一个地址,在这个地址上存储着数据,可以是指令或是其他的地址。 比如说_start:b reset,就是在_start这个地址上存储着b reset这条指令。而这个地址是由编译器指定的。...
  • bingchentiao
  • bingchentiao
  • 2013年08月21日 12:00
  • 735
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对标号地址的另一种相对寻址方式
举报原因:
原因补充:

(最多只允许输入30个字)