C 到内联汇编

标签 c gcc assembly hex inline-assembly

我应该将代码从 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/

相关文章:

c++ - 如何在不执行的情况下捕获未定义的行为?

c - 如何组织头文件

c++ - 在 C++ 中构造左填充的 NULL 固定长度字符数组的最有效方法是什么?

c - 连续多次调用 sizeof()

assembly - PUSHQ POPFQ 是在 x86_64 上设置标志的最直接方式吗?

delphi - 如何在64位Delphi XE2中将方法转换为回调过程?

c - RobertSedwick 书中的哈希溢出和下溢

使用 -std=c11 标志编译部分代码

assembly - 如何在汇编中使用 ADC?

c - 如何检查是否为条件编译定义了枚举项?