lea指令!「建议收藏」

lea指令!「建议收藏」
最近在看linux-0.11内核,看到lea这个指令,google搜索了一下,转给大家,一起学习@!
 
先看这个这个语法格式吧:
对AT&T来说,寻址方式比较怪异,但又非常简洁,语法格式如下:segreg:base_address(offset_address,index,size) ;例子movl%eax,label1(,$2,$4)movl%ebx,(label2,$2,)movl%ecx,(%esp)
其效果为

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

最近在看linux-0.11内核,看到lea这个指令,google搜索了一下,转给大家,一起学习@!

 

先看这个这个语法格式吧:

对AT&T来说,寻址方式比较怪异,但又非常简洁,语法格式如下:

segreg:base_address(offset_address, index, size)
 
;例子
movl %eax, label1(, $2, $4)
movl %ebx, (label2, $2,)
movl %ecx, (%esp)

Jetbrains全家桶1年46,售后保障稳定

其效果为 segreg:base_address + offset_address + index * size
segreg为分段模式下段寄存器,base_address为基址,offset_address 为偏移,index * size决定了第几个元素,其中size为元素长度,只能为1,2,4,8等等,这些元素都是可选的,index默认为0,size默认为1。

 

常见1:

http://www.adam8157.info/blog/2011/01/interesting-opcode-lea/原文:

最近恶补汇编时发现lea指令很有意思, 但大部分书都把它一笔带过, 同时网上的资料又很少, 所以记一下.

lea, load effective address, 加载有效地址. 指令形式是从存储器读数据到寄存器, 效果是将存储器的有效地址写入到目的操作数, 简单说, 就是C语言中的”&”.

例如在32位环境下, 有内存位置标签foo, 则下面两行效果相同:

movl $foo, %edi
leal foo, %edi

同时, lea还有个很有用但同时又很难理解的用法, 例如这样:

leal 5(%edx, %edx, 2), %eax

假设%edx的值为x, 上面这行会将%eax的值设置为”3x+5″.

奇怪吧, 一个取址的指令怎么用来做简单算术操作了? 其实理解起来也不难, 5(%edx, %edx, 2)是存储器”3x+5″这个地址中的值, 这个值作为leal的源操作数会被取地址, 地址是什么? 自然就是”3x+5″!

值得注意的是, 不管是AT&T还是Intel语法, lea都是加载有效地址, 所以运算结果需得在地址空间能表示的大小范围内.

PS: 可能有人会问为什么不把源操作数写成5(, %edx, 3), 这个嘛, 因为这种寻址模式的比例因子只能是1, 2, 4或者8.

 

 

常见2:

寻址方式:
0x4(%esp)的操作是把寄存器esp中的值取出,然后加上4,得到的值作为地址,间接寻址得到需要的数据
例如:
pushl -0x4(%ecx)
该指令的含义是取出寄存器ecx的值,减去4,将得到的值作为地址,在内存找到该地址对应的值,将其压入栈中。
这是执行后的结果:
ecx            0xbff01450
esp            0xbff0143c    0xbff0143c
ebp            0xbff01498    0xbff01498

(gdb) x/x $esp
0xbff0143c:    0x0804840a    
(gdb) x/x 0xbff0144c
0xbff0144c:    0x0804840a
其中,内存0xbff0144c即为%ecx-4后得到的值

指令LEA的作用和80×86汇编有些类似,即地址传递,下面举例说明:
LEA 0x4(%esp), %ecx
该指令的作用是,取出esp寄存器里的值,加上4,不再继续寻址,而是将得到值直接传递给ecx;如果是其他指令,则还需进行间接寻址,再传值。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210142.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • web前端 | 如何选择撸码神器

    web前端 | 如何选择撸码神器进来,不少小伙子、小妹子来问一个家常便饭,但又逃不脱的问题:小北哥哥,现在这么多编辑器,我该用哪一个好啊,看着都不孬啊(孬字用得好!)此篇文章,纯客观分析顺便吹逼,老鸟和大神直接略过吧!省的你们看到我写这个问题,再说我烦不烦啊,这问题都讨论了多少年了,甚至好多群里,一看到谁在讨论编辑器,就要送飞机票。但很多转入前端的孩子还是很迷茫,能力和悟性也分三六九等,人不同,自然适合自己…

    2022年8月22日
    16
  • Maven压缩插件YUI Compressor使用介绍

    Maven压缩插件YUI Compressor使用介绍简介这篇文章主要介绍了Maven压缩插件YUICompressor使用介绍以及相关的经验技巧,文章约18810字,浏览量165,点赞数5,值得参考!使用这个插件主要有两个作用:减少资源文件体积,提高移动端页面加载速度。对关键的前端代码进行一定的代码混淆,保护知识产权。使用说明:使用YUICompressor压缩JS和CSS。需要Maven2.0及以上工程。默认情…

    2022年7月18日
    35
  • gtest初识_tests strength

    gtest初识_tests strengthgtest初识总结本文以结合gtestgithub内容进行学习gtest。gtestgithub地址gtest编译g++xx.cppxx.h-lgtest-lpthread-omaingtest编写创建测试的一个简易的步骤:1.使用TEST()宏来定义和命名测试函数,这些是不返回值的普通C++函数。2.在此函数中,与要包含的任何有效C++语句一起使用各种g…

    2022年9月29日
    4
  • oracle11g安装图解「建议收藏」

    oracle11g安装图解「建议收藏」Oracle11g安装:**一、软件需求安装CentOS6.5的服务器一台Oracle11g安装介质:linux.x64_11gR2_database_1of2.ziplinux.x64_11gR2_database_2of2.zip命令行客户端工具xshell、crt或者putty图形界面客户端工具Xming二、系统配置检查1.内存检查SSHSecureShell的命令行窗口,执行[root@localhost~]#grepMemTotal/proc/meminfoM

    2022年9月21日
    4
  • 较完整的 bean生命周期[通俗易懂]

    较完整的 bean生命周期[通俗易懂]首先需要说明的是,Bean的生命周期主要指的是singletonbean,标签的scope默认就是singleton。对prototypebean来说,当用户getBean获得prototypebean的实例后,IOC容器就不再对当前实例进行管理,而是把管理权交由用户,此后再getBean生成的是新的实例。普通JavaBean和SpringBean普通java对象就是new出来,然后不再使用的时候通过垃圾回收机制进行回收; 而springBean是由spring容器来控制的,并且..

    2025年12月6日
    3
  • 腾讯云SSL证书_nginx反向代理配置证书

    腾讯云SSL证书_nginx反向代理配置证书申请SSL证书下载证书下载完证书之后解压,因为腾讯云选择的是nginx服务器,所以我们只需要下载nginx并解压。配置Nginx服务器我们需要把刚才解压的nginx证书文件拷贝到nginx的conf路径下面—也就是服务器中/etc/nginx/conf路径下面的。ssl_certificate1_bundle.crt;//如果文件不在conf路径下,就需要写绝对路径ssl_certificate_key1_mykey.key;重启nginx访问systemctlresta

    2025年10月10日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号