我应该将代码从 C 重写为内联汇编。代码正在将十进制数转换为十六进制数。
我应该传输的代码是:
#include <stdio.h>
static int a;
int main() {
char str[]="XX je hex\n";
if (scanf("%i", &a)==1) {
/* This part of code i am supposed to transfer */
int tmp = (a>>4)&0x0f;
if (tmp <= 9) {
tmp+='0';
} else {
tmp+='A'-10;
}
str[0]=tmp;
tmp = a&0x0f;
if (tmp <= 9) {
tmp+='0';
} else {
tmp+='A'-10;
}
str[1]=tmp;
/* Ends here */
write(1, str, 10);
}
return 0;
}
到目前为止我得到了这个
asm volatile (
"mov %a,%bx;"
"shrw $4,%%bx;"
"and $0x0f, %%bx;"
"cmp $9,%bx;"
"jle lessOrEq;"
"jg greater;"
"mov %bx,%str[0];"
"mov %a,%bx;"
"and $0x0f, %%bx;"
"cmp $9,%bx;"
"jle lessOrEq;"
"jg greater;"
"mov %bx,%str[1];"
"lessOrEq: add '0',%bx; ret;"
"greater: add 'A',%bx; sub 10,%bx; ret;"
:"=c"(str[0]), "=d" (str[1])
:"a"(a),"c"(str[0]),"d"(str[1])
:
);
我收到此错误:无效的“asm”:%-字母后缺少操作数。
知道我做错了什么吗?任何建议将不胜感激。
最佳答案
在 gcc 内联汇编中,寄存器名称需要以两个 百分号为前缀,您实际上在第二条和第三条指令中这样做,但忘记了其他地方。只需将 %bx
替换为 %%bx
即可修复您的错误。
关于C 到内联汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44289079/