相关疑难解决方法(0)

装配leal和movl的区别

leal(%eax,%ecx,4), %edx
Run Code Online (Sandbox Code Playgroud)

当我从我的计算机系统书中读到时,如果$ eax包含x值并且%ecx包含y,那么上面的意思是x + 4y放入%edx.

如果是的话

movl(%eax,%ecx,4), %edx
Run Code Online (Sandbox Code Playgroud)

那么上面的leal表达是不是同一个?

据我所知,leal创建了可以引用的地址,而不是像movl那样自己引用,但是

当我看到leal(%eax,%ecx,4), %edxequals x+4y进入edx注册时,那么t it mean that it 'referenced'%eax and%ecx`和提取值x和y用于计算?

  • 不是吗"()"的意思是'引用'??

x86 assembly att

3
推荐指数
1
解决办法
1万
查看次数

lea指令如何获取操作数的地址?

这是如何工作的?我知道lea与使用add/mov指令相比是有效的,因为它不通过ALU或设置任何标志.那么lea如何得到它的地址呢?是什么让它比添加/ mov更好?

x86 assembly

3
推荐指数
1
解决办法
403
查看次数

MUL/DIV指令与MOV和SHL/SHR(Pentium Pro)

你为什么要用:

MOV EAX, 22 
SHL EAX, 2
Run Code Online (Sandbox Code Playgroud)

...乘以4而不是仅仅使用MUL指令?
我知道这也可以用SHR而不是DIV.

这样做有什么好处?
你也可以用奇数做这个或者它只能是偶数吗?

x86 assembly opcodes

3
推荐指数
1
解决办法
1569
查看次数

在32位保护模式/ MSVC内联asm中获取FS:[0]的线性地址

我在Visual C++内联汇编中使用了这个指令

lea eax, FS:[0]
Run Code Online (Sandbox Code Playgroud)

为什么eax得到零?

我如何获得线性地址FS:[0]

x86 assembly inline-assembly visual-c++

3
推荐指数
1
解决办法
338
查看次数

使用LEA进行gcc优化

我正在摆弄gcc的优化选项,发现这些行:

int bla(int moo) {
  return moo * 384;
}
Run Code Online (Sandbox Code Playgroud)

被翻译成这些:

0:   8d 04 7f                lea    (%rdi,%rdi,2),%eax
3:   c1 e0 07                shl    $0x7,%eax
6:   c3                      retq
Run Code Online (Sandbox Code Playgroud)

我理解移位代表乘以2 ^ 7.并且第一行必须乘以3.

所以我对"lea"系列完全感到困惑.是不是应该加载一个地址?

optimization assembly gcc

2
推荐指数
1
解决办法
712
查看次数

使用leal的线路是什么?

我给了一些C代码和它的汇编对应物,我将用它来计算声明的两个常量的值#define.我的问题是这条线是什么

leal 0(,%eax,8),%edx
Run Code Online (Sandbox Code Playgroud)

做?

x86 assembly

2
推荐指数
1
解决办法
783
查看次数

x86装配 - 夹紧rax优化到[0 ..极限)

我正在编写一个简单的汇编程序,当然,它的目的是尽可能快.但是,位于最嵌套循环中的某个部分看起来并不"正确",我相信有可能提出更聪明,更快速的实现,甚至可能不使用条件跳转.代码实现了一个简单的事情:

if rax < 0 then rax := 0 else if rax >= r12 then rax := r12 - 1

这是我天真的实施:

cmp rax, 0
jge offsetXGE
   mov rax, 0
   jmp offsetXReady
offsetXGE:
   cmp rax, r12
   jl offsetXReady
   mov rax, r12
   dec rax
offsetXReady:
Run Code Online (Sandbox Code Playgroud)

任何想法都是受欢迎的,即使是那些使用MMX和一些掩盖技巧的想法.

编辑:回答评论中的一些问题 - 是的,我们可以假设r12> 0但rax可能是负数.

optimization x86 assembly nasm

2
推荐指数
1
解决办法
535
查看次数

LEA在内部做什么?

这个问题说LEA指令可以用来做算术.

据我了解,而不是:

inc eax
mov ecx, 5
mul ecx
mov ebx, eax
Run Code Online (Sandbox Code Playgroud)

我可以简单地写

lea ebx, [(eax + 1) * 5]
Run Code Online (Sandbox Code Playgroud)

LEA版本只是一条指令,而不是4.但是,我不明白LEA如何在没有inc和的情况下进行算术运算mul.

LEA版本在任何方面都更快,或者LEA是否只是在后台运行原始指令?

编辑:这个问题不是关于LEA的目的,而是它如何在内部工作.

x86 assembly

2
推荐指数
1
解决办法
164
查看次数

分段寄存器的mov是否比通用寄存器的mov慢?

具体是:

mov %eax, %ds
Run Code Online (Sandbox Code Playgroud)

慢于

mov %eax, %ebx
Run Code Online (Sandbox Code Playgroud)

或者他们是相同的速度.我在网上研究过,但一直无法找到明确的答案.

我不确定这是否是一个愚蠢的问题,但我认为修改分段寄存器可以使处理器做额外的工作.

NB我关注旧的x86 linux cpus,而不是现代的x86_64 cpus,其中分段的工作方式不同.

x86 assembly intel cpu-cycles mov

2
推荐指数
1
解决办法
99
查看次数

使用 lea 进行加法

以下C代码:

int sum(int x, int y) {
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

编译为:

add:
        leal    (%rdi,%rsi), %eax
        ret
Run Code Online (Sandbox Code Playgroud)

我只见过lea用于将内存地址从一个地方移动到另一个地方,但这里似乎正在将值总和移动到eax. 这是如何运作的?

c x86 assembly

2
推荐指数
1
解决办法
147
查看次数

标签 统计

assembly ×10

x86 ×9

optimization ×2

att ×1

c ×1

cpu-cycles ×1

gcc ×1

inline-assembly ×1

intel ×1

mov ×1

nasm ×1

opcodes ×1

visual-c++ ×1