gpt4 book ai didi

比较内联 c 汇编中的数字

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:58 25 4
gpt4 key购买 nike

我正在尝试感受一下 C 语言中的内联汇编,而我之前从未进行过任何汇编编程,因此我正在尝试将必须进行汇编的随机代码段转换。我在下面的代码中遇到了问题,我想让它做的是如果 a 在下方则返回 0x20 (32)0x20 (32) 或高于 0x7e (126)。 (那是不可打印的字符)但是它也会转换字符这些数字之间变成 0x20 (32)

#include <stdio.h>
int foo(int a) {
asm (
"mov $0x20, %%ebx;"
"cmp %%eax, %%ebx;"
"jl l1;"
"mov $0x7e, %%ebx;"
"cmp %%eax, %%ebx;"
"jg l1;"
"jmp l2;"
"l1: movl $0x20, %%eax;"
"l2:;"

: "=a" (a)
: "a" (a)
: "%ebx"
);
return a;
}
int main(void) {
int i;
for (i = 0; i <= 255; i++) {
printf("%i: %i\n", i, foo(i));
}
}

这个输出
0: 32
1: 32
2: 32
...
31: 32
32: 32
33: 32
34: 32
35: 32
...
125: 32
126: 32
127: 32
128: 32
...

最佳答案

代码将返回 32,因为您没有指定 else:

  ...
asm (
"mov $0x20, %%ebx;"
"cmp %%eax, %%ebx;" // the order should be ebx, eax
"jl l1;"
"mov $0x7e, %%ebx;"
"cmp %%eax, %%ebx;" // the order should be ebx, eax
"jg l1;"
// missing step here
"jmp l2;"
"l1: movl $0x20, %%eax;"
"l2:;"
...

您无法告诉编译器变量a 将存储在哪里,您只是将a 传递给asm。您可以将其修复为:

#include <stdio.h>
int foo(int a) {
asm (
"cmp $0x20, %%eax;"
"jl l1;"
"cmp $0x7e, %%eax;"
"jg l1;"
"movl $0, %%eax;" // what should a be otherwise? 0?
"jmp l2;"
"l1: movl $0x20, %%eax;"
"l2:;"

: "=a" (a)
: "a" (a)
: "%ebx"
);
return a;
}
int main(void) {
int i;
for (i = 0; i <= 255; i++) {
printf("%i: %i\n", i, foo(i));
}
return 0;
}

或:

#include <stdio.h>
int foo(int a) {
asm (
"cmp $0x20, %0;" // %0 => a
"jl l1;"
"cmp $0x7e, %0;" // %0 => a
"jg l1;"
"movl $0, %1;" // what should a be otherwise? 0?
"jmp l2;"
"l1:"
"movl $0x20, %0;" // %0 = a = 0x20
"l2:;"
: "=r" (a) // use r(egister)
: "r" (a)
:
);
return a;
}
int main(void) {
int i;
for (i = 0; i <= 255; i++) {
printf("%i: %i\n", i, foo(i));
}
return 0;
}

关于比较内联 c 汇编中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20012692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com