C ++内联汇编程序帮助。 (错误c2400)

时间:2013-11-26 14:35:26

标签: c++ visual-studio-2010 assembly x86 inline-assembly

我正在使用Visual Studio 2010.我编写了一个执行简单二进制搜索算法的程序。我正在尝试将其转换为汇编代码。我使用反汇编程序来获取汇编代码。我正在尝试将其粘贴到_asm中。我已经尝试了很多方法而且它不起作用。

我试过

_asm(" . . . .");
_asm(  );
_asm{ }    <--- -Currently going with this way for c++. seems to work well.
在网上看到某人在每行结尾处写'\'。这对我没有用。

这是代码。我会评论错误的位置。好吧,我现在有13个。有些我不会列出,因为它们与其他错误相同。一旦我修复了一个或两个,我应该能够解决所有问题。该函数的原始c ++代码也在那里。它被注释掉了。

bool binarySearch(int searchNum,int myArray[],int size){

        _asm{ 
     push        ebp  
     mov         ebp,esp  
     sub         esp,0F0h  
     push        ebx  
     push        esi  
     push        edi  
     lea         edi,[ebp-0F0h]  
     mov         ecx,3Ch 
     mov         eax,0CCCCCCCCh 
     rep stos    dword ptr es:[edi] 
      // 217:   int first=0,last=size-1,middle;
     mov         dword ptr [first],0  
     mov         eax,dword ptr [size]       // ERROR! Error 2   error C2400: inline assembler syntax error in 'second operand'; found ']'
     sub         eax,1  
     mov         dword ptr [last],eax  
      // 218:   bool found = false;
     mov         byte ptr [found],0  

     //  220:   while (first <= last)
     mov         eax,dword ptr [first]
     cmp         eax,dword ptr [last] 
     jg          binarySearch+80h (0B51970h)        //ERROR! Error  4   error C2400: inline assembler syntax error in 'second operand'; found '('   


      // 222:       middle = (first + last)/2;
     mov         eax,dword ptr [first] ;        //  Error   5   error C2400: inline assembler syntax error in 'opcode'; found '('   

     add         eax,dword ptr [last] ;
     cdq  
     sub         eax,edx  
     sar         eax,1  
     mov         dword ptr [middle],eax  

     //  224:       if(searchNum > myArray[middle])
     mov         eax,dword ptr [middle]  
     mov         ecx,dword ptr [myArray]  
     mov         edx,dword ptr [searchNum]  
     cmp         edx,dword ptr [ecx+eax*4]  
     jle         binarySearch+61h (0B51951h)  // Error  8   error C2400: inline assembler syntax error in 'opcode'; found '('   

     //  226:           first = middle +1;
     mov         eax,dword ptr [middle]  
     add         eax,1  
     mov         dword ptr [first],eax  
     jmp         binarySearch+7Eh (0B5196Eh)  

      // 228:       else if (searchNum < myArray[middle])
     mov         eax,dword ptr [middle]  
     mov         ecx,dword ptr [myArray]  
     mov         edx,dword ptr [searchNum]  
     cmp         edx,dword ptr [ecx+eax*4]  
     jge         binarySearch+7Ah (0B5196Ah)  

      // 230:           last = middle -1;
     mov         eax,dword ptr [middle]  
     sub         eax,1  
     mov         dword ptr [last],eax  

      // 232:       else 
     jmp         binarySearch+7Eh (0B5196Eh)    // Error    18  error C2400: inline assembler syntax error in 'second operand'; found '('

      // 233:           return true;
     mov         al,1           // Error    19  error C2400: inline assembler syntax error in 'opcode'; found '('   

     jmp         binarySearch+82h (0B51972h)  

     jmp         binarySearch+32h (0B51922h)    // Error    22  error C2400: inline assembler syntax error in 'opcode'; found '('   

      // 236:   return false;
     xor         al,al  

     pop         edi  
     pop         esi  
     pop         ebx  
     mov         esp,ebp  
     pop         ebp  
     ret  

        };

        /*
        int first=0,last=size-1,middle;
        bool found = false;

        while (first <= last)
        {
            middle = (first + last)/2;

            if(searchNum > myArray[middle])
            {
                first = middle +1;
            }
            else if (searchNum < myArray[middle])
            {
                last = middle -1;
            }
            else 
                return true;
        }

        return false;

        */
    }

1 个答案:

答案 0 :(得分:2)

以下是您为独立程序集发布的(几乎1:1)工作代码。

binsearch.cpp

extern "C"
{
    bool BinSearch(int searchNum, int myArray[], int arraySize);
};

// This is the inlined version.
bool BinSearchInline(int searchNum, int myArray[], int arraySize)
{
    int middle;
    int first;
    int last;
    char found;

    _asm
    {
     push        ebx  
     push        esi  
     push        edi  

     mov         first,0  
     mov         eax, arraySize
     sub         eax,1  
     mov         last ,eax  
     mov         found,0

LocalLoop:

     mov         eax, first
     cmp         eax, last
     jg          NotFound

     mov         eax, first

     add         eax, last
     cdq  
     sub         eax,edx  
     sar         eax,1  
     mov         middle,eax  

     mov         eax,middle
     mov         ecx,myArray
     mov         edx,searchNum
     cmp         edx, dword ptr [ecx+eax*4]  
     jle         MaybeLower

     mov         eax, middle
     add         eax,1  
     mov         first, eax  
     jmp         WhileLoop

MaybeLower:
     mov         eax, middle
     mov         ecx, myArray
     mov         edx, searchNum
     cmp         edx,dword ptr [ecx+eax*4]  
     jge         Found

     mov         eax, middle
     sub         eax,1  
     mov         last, eax  

     jmp         WhileLoop

Found:
     mov         al,1
     jmp         Done

WhileLoop:
     jmp         LocalLoop

NotFound:
     xor         al,al  

Done:
     pop         edi  
     pop         esi  
     pop         ebx  
    };
}

int main(int argc, char*arg[])
{
    int testvalues[7];
    for(int i = 0; i < 7; i++)
        testvalues[i] = i;

    bool b = BinSearch(8, testvalues, 7);       // false, value not in array
    b = BinSearch(3, testvalues, 7);        // true, value is in array.

    b = BinSearchInline(8, testvalues, 7);      // false
    b = BinSearchInline(3, testvalues, 7);      // true

    return 0;
}

binsearch.asm

.486
.model flat, C
option casemap :none

.code

BinSearch PROC, searchNum:DWORD, myArray:PTR DWORD, arraySize:DWORD

    LOCAL first:DWORD
    LOCAL middle:DWORD
    LOCAL last:DWORD
    LOCAL found:BYTE

     push        ebx  
     push        esi  
     push        edi  

    ; This block is only for debugging stack errors and should be removed.
    ; lea         edi,[ebp-0F0h]  
    ; mov         ecx,3Ch 
    ; mov         eax,0CCCCCCCCh 
    ; rep stos    dword ptr es:[edi] 

     mov         dword ptr [first],0  
     mov         eax,dword ptr [arraySize]
     sub         eax,1  
     mov         dword ptr [last],eax  
     mov         byte ptr [found],0     ; not even used.

@@Loop:
     mov         eax,dword ptr [first]
     cmp         eax,dword ptr [last] 
     jg          @@NotFound

     mov         eax,dword ptr [first]

     add         eax,dword ptr [last]
     cdq  
     sub         eax,edx  
     sar         eax,1  
     mov         dword ptr [middle],eax  

     mov         eax,dword ptr [middle]  
     mov         ecx,dword ptr [myArray]  
     mov         edx,dword ptr [searchNum]  
     cmp         edx,dword ptr [ecx+eax*4]  
     jle         @@MaybeLower

     mov         eax,dword ptr [middle]  
     add         eax,1  
     mov         dword ptr [first],eax  
     jmp         @@WhileLoop

@@MaybeLower:
     mov         eax,dword ptr [middle]  
     mov         ecx,dword ptr [myArray]  
     mov         edx,dword ptr [searchNum]  
     cmp         edx,dword ptr [ecx+eax*4]  
     jge         @@Found

     mov         eax,dword ptr [middle]  
     sub         eax,1  
     mov         dword ptr [last],eax  

     jmp         @@WhileLoop

@@Found:
     mov         al,1
     jmp         @@Done

@@WhileLoop:
     jmp         @@Loop

@@NotFound:
     xor         al,al  

@@Done:
     pop         edi  
     pop         esi  
     pop         ebx  

     ret  

BinSearch ENDP

END