2013-01-04 163 views
1

这是我试图转换为gcc样式asm内联汇编代码的实际代码。错误编译用gcc内联汇编,“shl”

#include<iostream> 
using namespace std; 

int reverse(int num); 

int main(){ 
    int num; 
    cout << "enter number: "; 
    cin >> num; 
    cout << endl; 
    cout << reverse(num); 
    return 0; 
} 

int reverse(int num){ 
    if(num == 0 || num == 1){ 
     return num; 
    } 
    __asm 
    { 
     xor eax, eax 
     xor ecx, ecx  
     mov ebx, num  
     clc    ; clear carry 
not_found: 
     inc ecx 
     shl ebx, 1 
     jnc not_found 


     rcr eax, 1 
     mov edx, ecx 
again: 
     shl ebx, 1 
     rcr eax, 1 
     inc ecx 
     cmp ecx, 32 
     jne again 

     dec edx  
again2:  
     shr eax, 1 
     dec edx 
     cmp edx, 0 
     jne again2 
    } 

} 

正如我无法编译GCC上面的代码中,我试图将其转换为一些事情可能成功一个gcc编译器编译,但到目前为止,我无法管理产生任何有意义的结果。

+0

你可以给这个片段更多的上下文(temp,num声明)。它编译罚款给我,。 – cmh

+0

不是一个程序集向导,但我在'shll'中看到两个'l',这可能意味着这是'long int'版本,'num' **完全**的类型是什么? –

+0

也给你的架构可能会有所帮助。 – cmh

回答

0

基于在OP的注释中的代码,这里是一个修改的例子,一个位内联汇编转移:

#include<iostream> 
using namespace std; 
int reverse(int num); 
int main() 
{ 
    int num; 
    cout << "enter number: "; 
    cin >> num; 
    cout << endl; 
    cout << reverse(num) << endl; 
    return 0; 
} 

int reverse(int num) 
{ 
    if (num == 0 || num == 1) 
    { 
     return num; 
    } 
    int temp = 0; 
    asm("shll $1, %0 \n\t" : "=r"(temp) : "0"(num)); 
    return temp; 
} 

注意gcc把操作数到寄存器,如果您使用的是自讨苦吃r约束,所以真的没有理由mov他们自己(至少在这个小样本)。 此外,我在输入约束中使用0来表示它应该与输出相同的寄存器,因为这就是shl的工作原理。

仍然不确定num == 1条件,但可能是因为我们不知道完整函数的实际功能。