【发布时间】:2013-11-15 23:52:04
【问题描述】:
我正在尝试在 c 中感受内联汇编,而我之前从未做过任何汇编编程,所以我试图将我必须的随机代码片段转换为汇编。 我对下面的代码有问题,我想要它做的是返回 0x20 (32) 如果 a 低于 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
...
【问题讨论】:
-
函数开始时 %%eax 的内容是什么
-
当然应该是 42 而不是 32 :-)
-
@amdixon 是
a,如: "a" (a)中所说。
标签: c gcc assembly x86 inline-assembly