小编Jas*_*son的帖子

循环中的C asm linux syscall永远继续

我想使用C语言中的扩展asm来处理syscall(写)。一切都很好,我正在使用

#define write(RESULT, FD, BUFF, SIZE)   \
    asm volatile ("syscall" :           \
        "=a" (RESULT) :                 \
        "D" (FD), "S" (BUFF), "d" (SIZE), "a" (1))
Run Code Online (Sandbox Code Playgroud)

这没有任何问题...例如

#define write(RESULT, FD, BUFF, SIZE)   \
    asm volatile ("syscall" :           \
        "=a" (RESULT) :                 \
        "D" (FD), "S" (BUFF), "d" (SIZE), "a" (1))

int
main() {

    int res;
    write(res, 1, "Hello\n", 6);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我对此代码没有问题,但是我的问题是当我拨打此电话时

write(res, 1, "Hello\n", 6);
Run Code Online (Sandbox Code Playgroud)

循环使用100次

#define write(RESULT, FD, BUFF, SIZE)   \
    asm volatile ("syscall" :           \
        "=a" (RESULT) : …
Run Code Online (Sandbox Code Playgroud)

c assembly inline-assembly

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

C字符串使用索引或指针复制字符

我有2个(strcpy)函数的源代码,我想知道哪一个更快,性能更高...

unsigned
strcpy(const char * str, char * des) {
    register const char * ptr = str;

    while ((*des = *str)) {
        str++;
        des++;
    }

    return (str - ptr);
}

unsigned
strcpy2(const char * str, char * des) {
    register unsigned i = 0;

    while ((des[i] = str[i])) i++;

    return i;
}
Run Code Online (Sandbox Code Playgroud)

第一个使用str和des地址,第二个使用索引...第一个使用多余的(++),因此在第一眼看来,由于执行了额外的操作(++),第一个功能的性能低于第二个)中的每个字符,但是当我在GCC中使用(-O3)优化时,结果(汇编代码)告诉我其他信息(第一个strcpy具有更高的性能和更少的动作)

strcpy:
        movzbl  (%rdi), %eax
        movb    %al, (%rsi)
        testb   %al, %al
        je      .L4
        movq    %rdi, %rax
.L3:
        movzbl  1(%rax), %edx
        addq    $1, %rax
        addq    $1, %rsi
        movb    %dl, …
Run Code Online (Sandbox Code Playgroud)

c performance gcc x86-64 micro-optimization

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