【问题标题】:C to inline assemblyC 到内联汇编
【发布时间】:2017-11-01 12:18:31
【问题描述】:

我应该将代码从 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”:%-letter 后缺少操作数。

知道我有什么问题吗?任何建议将不胜感激。

【问题讨论】:

  • 可能是一个好主意,说明哪一行给出了错误。
  • 对不起.. 它在第一行给出错误.. 错误:无效的'asm':%-字母 asm volatile (
  • 你为什么把它写成内联汇编?这很容易出现各种错误,就像您遇到的错误一样。
  • 相反,创建一个程序集文件 (.s) 并将整个代码写入程序集。

标签: c gcc assembly hex inline-assembly


【解决方案1】:

在 gcc 内联汇编中,寄存器名称需要以 两个 百分号为前缀,这实际上是在第二条和第三条指令中执行的,但在其他任何地方都忘记了。只需将 %bx 替换为 %%bx 即可解决您的错误。

【讨论】:

  • 谢谢!我现在成功编译它,但它给了我分段错误(核心转储)作为输出。知道为什么吗?
  • @a.vele 我建议你自己做一些调试工作(即使用调试标志编译并使用调试器单步执行程序),一旦你确定了发生段错误的行(甚至更好,它的原因),看看你是否可以自己解决它,如果不能,打开一个新问题,因为这个问题所涉及的问题现在已经解决了。如果您遇到困难,我很乐意为您提供帮助:)
猜你喜欢
  • 2013-07-23
  • 2012-10-20
  • 2021-09-05
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多