2025年4月27日 星期日 乙巳(蛇)年 正月廿八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 汇编

汇编语言LEA指令:返回间接操作数的地址

时间:03-05来源:作者:点击数:81

LEA 指令返回间接操作数的地址。由于间接操作数中包含一个或多个寄存器,因此会在运行时计算这些操作数的偏移量。为了演示如何使用 LEA,现在来看下面的 C++ 程序,该程序声明了一个局部数组 myString,并引用它来分配数组值:

  • void makeArray()
  • {
  • char myString[30];
  • for ( int i = 0; i < 30; i++ )
  • myString[i] = '*';
  • }

与之等效的汇编代码在堆栈中为 myString 分配空间,并将地址(间接操作数)赋给 ESI。虽然数组只有 30 个字节,但是 ESP 还是递减了 32 以对齐双字边界。注意如何使用 LEA 把数组地址分配给 ESI:

  • makeArray PROC
  • push ebp
  • mov ebp,esp
  • sub esp, 32 ;myString 位于 EBP-30 的位置
  • lea esi, [ebp-30] ;加载 myString 的地址
  • mov ecx, 30 ;循环计数器
  • LI: mov BYTE PTR [esi] ;填充一个位置
  • inc esi ;指向下一个元素
  • loop LI ;循环,直到 ECX=0
  • add esp, 32 ;删除数组(恢复ESP)
  • pop ebp
  • ret
  • makeArray ENDP

不能用 OFFSET 获得堆栈参数的地址,因为 OFFSET 只适用于编译时已知的地址。下面的语句无法汇编:

mov esi,OFFSET [ebp-30 ]    ;错误
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门