我想使用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) 我有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)