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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ISP举例_low input lag

    ISP举例_low input lag  从2000年9月底摄像头首次出现在手机上算起,到如今成为诸多智能设备不可或缺的一部分,便携式手机摄像头已经走过了18年的发展历程。随着手机智能化、轻薄化的发展进程,其搭载的摄像头也随之发生了变化,但基本结构并未有太大的改变。通常而言,一个摄像头硬件应包含以下五个部分:外壳(Housing)或者镜头固定物(LensHolder)、镜头(Lens)、红外截止滤波片(IR-cutfilter…

    2025年8月14日
    2
  • 1190. 反转每对括号间的子串(栈|splay)[通俗易懂]

    1190. 反转每对括号间的子串(栈|splay)[通俗易懂]给出一个字符串 s(仅含有小写英文字母和括号)。请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。注意,您的结果中 不应 包含任何括号。示例 1:输入:s = “(abcd)”输出:”dcba”示例 2:输入:s = “(u(love)i)”输出:”iloveu”示例 3:输入:s = “(ed(et(oc))el)”输出:”leetcode”示例 4:输入:s = “a(bcdefghijkl(mno)p)q”输出:”apmnolkjihgf

    2022年8月11日
    4
  • 快速排序quicksort_快速排序的原理

    快速排序quicksort_快速排序的原理一、简介快速排序是(Quicksort)是对冒泡排序的一种改进,是非常重要且应用比较广泛的一种高效率排序算法。二、算法思路快速排序是通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据比另一部分都要小,然后继续递归排序这两部分,最终实现所有数据有序。大致步骤如下:首先设置一个分界值也就是基准值又是也称为监视哨,通过该分界值将数据分割成两部分。将大于或等于分界值的数据集中到右边,小于分界值的数据集中到左边。一趟排序过后,左边部

    2022年8月12日
    5
  • kernel: TCP: time wait bucket table overflow的问题剖析及解决方法

    kernel: TCP: time wait bucket table overflow的问题剖析及解决方法随着访问量的增大,系统默认的承受能力达到上限,这个时候就会报一些异常。比如/var/log/messages中常见的“kernel:TCP:timewaitbuckettableoverflow”这个信息,本文介绍问题的来源及解决办法。

    2022年6月10日
    32
  • wondows中的cmd中切换盘符和目录的命令「建议收藏」

    wondows中的cmd中切换盘符和目录的命令「建议收藏」一般介绍DOS命令,切换工作目录都是用CD命令,但是我在win7下的DOS中使用CDD:\却一直无法转到D盘。后来在网上查找,发现切换盘符直接输入盘符和冒号,如D: 回车便可进入D盘的根目录。切换工作盘之后,再使用CD命令切换工作目录。****************************************************************************

    2022年10月3日
    5
  • .gitkeep常用写法

    .gitkeep常用写法

    2021年10月20日
    54

发表回复

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

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