2017-05-31 244 views
0

我应该重写代码从C到内联汇编。代码将十进制数转换为十六进制。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后数编号缺失。

任何想法我有什么错误?任何意见,将不胜感激。

+2

可能是一个好主意,提及哪一行会给出错误。 –

+0

对不起..它给第一行上的错误..错误:无效'asm':操作数编号在%-letter asm volatile后丢失( –

+0

)为什么你把它写成内联程序集呢?这很容易出现类似的错误你的经验 – fuz

回答

2

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

+0

谢谢!我现在编译成功了,但它给了我Segmentation fault(核心转储)作为输出。 –

+1

@ a.vele我建议你自己做一些调试工作(例如,用调试标志进行编译并用调试器遍历你的程序),并且一旦你确定了段错误发生的地方(或者更好的原因),看看如果你可以自己修复它,如果没有,请打开一个新的问题,因为这个问题所涉及的问题已经修复,如果你被卡住了,我会很乐意帮助你:) –