相关疑难解决方法(0)

用于测试Collat​​z猜想的C++代码比手写程序集更快 - 为什么?

我为Project Euler Q14编写了这两个解决方案,在汇编和C++中.它们是用于测试Collat​​z猜想的相同蛮力方法.装配解决方案与组装

nasm -felf64 p14.asm && gcc p14.o -o p14
Run Code Online (Sandbox Code Playgroud)

C++是用.编译的

g++ p14.cpp -o p14
Run Code Online (Sandbox Code Playgroud)

部件, p14.asm

section .data
    fmt db "%d", 10, 0

global main
extern printf

section .text

main:
    mov rcx, 1000000
    xor rdi, rdi        ; max i
    xor rsi, rsi        ; i

l1:
    dec rcx
    xor r10, r10        ; count
    mov rax, rcx

l2:
    test rax, 1
    jpe even

    mov rbx, 3
    mul rbx
    inc rax
    jmp c1

even:
    mov rbx, 2 …
Run Code Online (Sandbox Code Playgroud)

c++ optimization performance x86 assembly

803
推荐指数
8
解决办法
14万
查看次数

是否存在运行时代码修改的智能案例?

你能想到运行时代码修改的任何合法(智能)用法(程序在运行时修改它自己的代码)吗?

现代操作系统似乎对执行此操作的程序不屑一顾,因为病毒已使用此技术来避免检测.

我能想到的是某种运行时优化,它可以通过在运行时知道某些在编译时无法知道的东西来删除或添加一些代码.

executable platform-agnostic cpu-architecture instructions self-modifying

119
推荐指数
10
解决办法
6266
查看次数

每个汇编指令需要多少个CPU周期?

我听说有英特尔在线书籍描述了特定汇编指令所需的CPU周期,但我无法找到它(经过努力).有人能告诉我如何找到CPU周期吗?

下面是一个例子,在下面的代码中,mov/lock是1个CPU周期,xchg是3个CPU周期.

// This part is Platform dependent!
#ifdef WIN32
inline int CPP_SpinLock::TestAndSet(int* pTargetAddress, 
                                              int nValue)
{
    __asm
    {
        mov edx, dword ptr [pTargetAddress]
        mov eax, nValue
        lock xchg eax, dword ptr [edx]
    }
    // mov = 1 CPU cycle
    // lock = 1 CPU cycle
    // xchg = 3 CPU cycles
}

#endif // WIN32
Run Code Online (Sandbox Code Playgroud)

顺便说一句:这是我发布的代码的URL:http://www.codeproject.com/KB/threads/spinlocks.aspx

cpu assembly cycle

48
推荐指数
5
解决办法
5万
查看次数

微融合和寻址模式

我使用英特尔®架构代码分析器(IACA)发现了一些意想不到的东西(对我而言).

以下指令使用[base+index]寻址

addps xmm1, xmmword ptr [rsi+rax*1]
Run Code Online (Sandbox Code Playgroud)

根据IACA没有微熔丝.但是,如果我用[base+offset]这样的

addps xmm1, xmmword ptr [rsi]
Run Code Online (Sandbox Code Playgroud)

IACA报告它确实融合了.

英特尔优化参考手册的第2-11节给出了以下"可以由所有解码器处理的微融合微操作"的示例

FADD DOUBLE PTR [RDI + RSI*8]
Run Code Online (Sandbox Code Playgroud)

Agner Fog的优化装配手册也给出了使用[base+index]寻址的微操作融合的例子.例如,请参见第12.2节"Core2上的相同示例".那么正确的答案是什么?

cpu x86 assembly intel iaca

44
推荐指数
4
解决办法
4504
查看次数

x86指令缓存是如何同步的?

我喜欢这个例子,所以我在c中写了一些自修改代码...

#include <stdio.h>
#include <sys/mman.h> // linux

int main(void) {
    unsigned char *c = mmap(NULL, 7, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|
                            MAP_ANONYMOUS, -1, 0); // get executable memory
    c[0] = 0b11000111; // mov (x86_64), immediate mode, full-sized (32 bits)
    c[1] = 0b11000000; // to register rax (000) which holds the return value
                       // according to linux x86_64 calling convention 
    c[6] = 0b11000011; // return
    for (c[2] = 0; c[2] < 30; c[2]++) { // incr immediate data after every run
        // rest of …
Run Code Online (Sandbox Code Playgroud)

c assembly instructions self-modifying cpu-cache

24
推荐指数
3
解决办法
5151
查看次数

如何使用GNU GAS汇编程序生成像nasm -f bin这样的普通二进制文件?

我有一些通常具有以下结构的NASM文件:

        [BITS 64]
        [ORG 0x0000000000200000]

start:
        ...

        ret
Run Code Online (Sandbox Code Playgroud)

我正在组装它们:

nasm -f bin abc.asm
Run Code Online (Sandbox Code Playgroud)

我想用GAS写一些这些.两个问题:

  • 我应该在GAS中使用哪些指令?我找到了'.org'指令,但GAS似乎没有'.bits'指令.

  • 我应该传递什么gccas生成一个普通的二进制文件?即-f binNASM 的选项是什么.

assembly gnu-assembler nasm

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

L2 TLB未命中后会发生什么?

我很难理解当翻译旁视缓冲区的前两个级别导致未命中时会发生什么?

我不确定特殊硬件电路中是否出现"页面行走",或者页表是否存储在L2/L3高速缓存中,或者它们是否只存在于主存储器中.

cpu performance x86 cpu-architecture tlb

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

设计代码以适应CPU缓存?

在编写模拟时,我的伙伴说他喜欢尝试编写足够小的程序以适应缓存.这有什么实际意义吗?据我所知,缓存比RAM和主内存快.是否可以指定您希望程序从缓存运行或至少将变量加载到缓存中?我们正在编写模拟,因此任何性能/优化收益都是巨大的好处.

如果您知道任何解释CPU缓存的好链接,那么请指出我的方向.

c performance caching cpu-architecture cpu-cache

15
推荐指数
4
解决办法
8329
查看次数

内联x86程序集中是否未定义整数溢出?

说我有以下C代码:

int32_t foo(int32_t x) {
    return x + 1;
}
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为时x == INT_MAX.现在说我用内联汇编代替了:

int32_t foo(int32_t x) {
    asm("incl %0" : "+g"(x));
    return x;
}
Run Code Online (Sandbox Code Playgroud)

问题:内联汇编版本何时仍会调用未定义的行为x == INT_MAX?或者未定义的行为仅适用于C代码?

c x86 gcc undefined-behavior

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

如何获取c代码来执行十六进制字节码?

我想要一个简单的C方法,以便能够在Linux 64位机器上运行十六进制字节码.这是我的C程序:

char code[] = "\x48\x31\xc0";
#include <stdio.h>
int main(int argc, char **argv)
{
        int (*func) ();
        func = (int (*)()) code;
        (int)(*func)();
        printf("%s\n","DONE");
}
Run Code Online (Sandbox Code Playgroud)

我试图运行的代码("\x48\x31\xc0")我通过编写这个简单的汇编程序获得(它不应该真的做任何事情)

.text
.globl _start
_start:
        xorq %rax, %rax
Run Code Online (Sandbox Code Playgroud)

然后编译并objdump它以获取字节码.

但是,当我运行我的C程序时,我得到了一个分段错误.有任何想法吗?

c x86 assembly x86-64 shellcode

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