lea指令

mov,lea指令的区别

偶尔善良 提交于 2020-02-09 06:30:06
一,关于有没有加上[]的问题 1,对于mov指令来说: 有没有[]对于变量是无所谓的,其结果都是取值 如: num dw 2 mov bx,num mov cx,[num];bx=cx=2 对于寄存器而言,有[]表示取地址,没[]表示取值 如: num dw 2 mov ax,num mov bx,ax;bx=2 mov bx,[ax];mov bx;DS:[ax],这里可能存在报错的情况,总之大体意思能理解就行 2,对于lea指令来说 Load Effective Address 它的操作数就是地址 : 有没有[]对于变量是无所谓的,其结果都是取变量的地址,相当于指针(与mov相反) 如:num dw 2 lea ebx,num; lea eax,[num];ebx=eax 对于寄存器而言,有[]表示取值,没[]表示取地址 lea eax,[edx-02]         就是把 edx 中的值减去2再送入eax, 而不是把由[edx-02]指明的内存地址上的值放到eax. 其结果是[eax]和[ebx-02]都表示同一个地址.         其实这句就相当于mov eax,edx-2 来源: https://www.cnblogs.com/xiangtingshen/p/11337236.html

MOV与LEA

偶尔善良 提交于 2020-02-09 06:26:40
MOV 格式: MOV dest, src 作用:赋值,且不改变标记位的值 特点:可以从寄存器到寄存器、从立即数到寄存器、从存储单元到寄存器、从立即数到储存单元、从寄存器到存储单元、从寄存器或存储单元到段寄存器(除CS寄存器); 立即数不能值接送段寄存器 [ ] 作用: 对于变量:有无 [ ] 都表示取值 对于寄存器:有 [ ] 表示取地址,无 [ ] 表示取值 LEA (Load Effective Address) 格式: LEA dest, src 作用:将源操作数的偏移地址给目的操作数,即返回的是src的地址;另外,LEA指令具有单时钟周期,执行效率很高。 [ ] 作用: 对于变量:有无 [ ] 都表示取地址 对于寄存器:有 [ ] 表示取值,无 [ ] 表示取地址( 正好与MOV相反 ) 举例 对于计算EAX*4+EBX+3,结果放入EDX MOV MOV EDX, EAX SHL EDX, 4 ADD EDX, EBX ADD EDX, 3 LEA LEA EDX, [EBX + EAX * 4 + 3] 参考: https://blog.csdn.net/fengyuanye/article/details/85715565 来源: https://www.cnblogs.com/libbin/p/11625690.html

汇编总结:lea指令

两盒软妹~` 提交于 2019-12-30 19:01:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> lea指令变种(按大小分类): leaw #2个字节 leal #4个字节 leaq #8个字节 lea的用法: leaq a(b, c, d), %rax 首先lea指令是mov指令的变种,据说,lea指令是x86体系结构中,是一条最古老但是从某个方面来讲又是最神奇的指令。 表面上看,它做的事情非常简单,根据括号里的源操作数来计算地址,然后把地址加载到目标寄存器中。 例如:leaq a(b, c, d), %rax 先计算地址a + b + c * d,然后把最终地址载到寄存器rax中。 最逗的是leaq不引用源操作数里的寄存器,只是单纯的计算。那这样的完全可以把它当作乘法指令使用。 例如: rbx * 2 movq $8, %rbx leaq (, %rbx, 2), %rax rbx * 3 movq $8, %rbx leaq (%rbx, %rbx, 2), %rax rbx * 3 - 1 movq $8, %rbx leaq -1(%rbx, %rbx, 2), %rax 什么时候用lea指令: 在打算用五六条指令来完成某个乘法运算之前,看看能否通过两三条lea指令来代替它。 注意事项: d的取值范围是1,2,4,8(64位cpu) 来源: oschina 链接: https://my

LEA指令的目的是什么?

江枫思渺然 提交于 2019-12-30 18:54:22
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 对我来说,这就像一部时髦的MOV。 它的目的是什么?何时使用? #1楼 8086具有大量的指令集,它们接受寄存器操作数和有效地址,执行一些计算以计算该有效地址的偏移量部分,并执行一些涉及寄存器和所计算地址所指向的存储器的操作。 让该系列中的指令之一按上述方式操作非常简单,只是跳过了实际的内存操作。 这个,说明: mov ax,[bx+si+5] lea ax,[bx+si+5] 在内部几乎完全相同。 区别是跳过的步骤。 两种指令的工作方式如下: temp = fetched immediate operand (5) temp += bx temp += si address_out = temp (skipped for LEA) trigger 16-bit read (skipped for LEA) temp = data_in (skipped for LEA) ax = temp 至于为什么英特尔认为该指令值得包括在内,我不确定,但是实施起来便宜的事实将是一个很大的因素。 另一个因素可能是英特尔的汇编器允许相对于BP寄存器定义符号的事实。 如果将 fnord 定义为BP相对符号(例如BP + 8),则可以说: mov ax,fnord ; Equivalent to "mov ax,[BP+8]"