相关疑难解决方法(0)

使用 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
查看次数

了解x86-64汇编代码中的指针赋值

我想了解汇编代码.我被困在指定指针的部分和leaq命令后的代码中

这是我的C代码:

#include <stdio.h>
#include<stdlib.h>

int main(){
    int x=50;
    int *y=&x;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我相应的ASSEMBLY代码:

.file   "AssemlyCode.c"
    .def    __main; .scl    2;  .type   32; .endef
    .text
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    pushq   %rbp
    .seh_pushreg    %rbp
    movq    %rsp, %rbp
    .seh_setframe   %rbp, 0
    subq    $48, %rsp
    .seh_stackalloc 48
    .seh_endprologue
    call    __main
    movl    $50, -12(%rbp)
    leaq    -12(%rbp), %rax
    movq    %rax, -8(%rbp)
    movl    $0, %eax
    addq    $48, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .ident  "GCC: (GNU) 5.4.0"
Run Code Online (Sandbox Code Playgroud)

c assembly x86-64 att

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

为什么使用 leal 而不是 incq?

我在鬼混,发现以下

#include <stdio.h>

void f(int& x){
    x+=1;
}

int main(){
    int a = 12;
    f(a);
    printf("%d\n",a);
}
Run Code Online (Sandbox Code Playgroud)

当由g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4with翻译g++ main.cpp -S生成此组件时(仅显示相关部件)

_Z1fRi:
    pushq   %rbp
    movq    %rsp, %rbp
    movq    %rdi, -8(%rbp)
    movq    -8(%rbp), %rax
    movl    (%rax), %eax
    leal    1(%rax), %edx
    movq    -8(%rbp), %rax
    movl    %edx, (%rax)
    popq    %rbp
    ret
main:
    pushq   %rbp
    movq    %rsp, %rbp
    subq    $16, %rsp
    movl    $12, -4(%rbp)
    leaq    -4(%rbp), %rax
    movq    %rax, %rdi
    call    _Z1fRi
    movl    -4(%rbp), %eax
    movl    %eax, %esi …
Run Code Online (Sandbox Code Playgroud)

c++ assembly g++ x86-64

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

x86乘法3:3:IMUL vs SHL + ADD

我在x86-64汇编中开发了一个程序,该程序需要通过相同的操作进行多次迭代:

IMUL rdx, 3   # rdx is always different
Run Code Online (Sandbox Code Playgroud)

但是,我需要使运行时更快,因此我从上面想到了对该特定行的优化:

MOV rcx, rdx
SHL rdx, 1
ADD rdx, rcx
Run Code Online (Sandbox Code Playgroud)

现在我问你们:这种修改会改善程序的运行时间(减少时钟),还是我应该坚持使用该IMUL命令?

x86 assembly x86-64 intel micro-optimization

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

标签 统计

assembly ×4

x86-64 ×3

c ×2

x86 ×2

att ×1

c++ ×1

g++ ×1

intel ×1

micro-optimization ×1