CDECL呼叫公约导致奇怪的警告组装X86

时间:2014-04-02 22:34:46

标签: c++ assembly x86 cdecl

嗨,大家好我是汇编语言x86的新学习者,我试图从一组加密指令中产生一个CDECL呼叫约定。我相信我会在执行公约的路线上走错路。以下是作为问题给出的原始指令集和功能。还包括我的尝试(请原谅我,如果它完全错误的非常新的汇编语言)。我在C ++开发设置中使用visual studio 2013。

几行中给出的警告是 - 警告C4409:非法指令大小(在标记适用的行的指令之前使用' @'符号)

此外,我还收到2个警告 - 警告C4731:' encrypt_chars' :'帧指针寄存器' ebp'由内联汇编代码修改(在其应用的行之前使用' $'符号)

void encrypt_chars (int length, char EKey)
{   char temp_char;                         // char temporary store

for (int i = 0; i < length; i++)            // encrypt characters one at a time
{   temp_char = OChars [i];         

__asm {                          

        //------------------------ORIGINAL CODE-------------------------------------------//
        //--------------------------------------------------------------------------------//
        //push   eax                    // save register values on stack to be safe
        //push   ecx                    //
        //movzx  ecx,temp_char          // 
        //lea    eax,EKey               // 
        //call   encrypt4               // encrypt the character
        //mov    temp_char,al           // 
        //pop    ecx                    // restore original register values from stack
        //pop    eax                    //
        //--------------------------------------------------------------------------------//


        //---------------------------------CDECL VERSION----------------------------------//
        push eax                        //save register values on stack
        push ecx
        @push EKey                      //save orginal values of parameters
        @push temp_char

        call encrypt4                   //call function
        add esp, 8                      //clean parameters of stack

        mov temp_char, al               //move the temporay character into a 8bit register
        @pop temp_char                  //recover register values
        @pop EKey
        pop ecx
        pop eax
        //--------------------------------------------------------------------------------//

    }
    EChars [i] = temp_char;         // Store encrypted char in the encrypted chars array
}
return;

这是子程序:

 encrypt4:     
    //-------------------------ORGINAL CODE----------------------------------------------//
    //push edi
    //push ecx
    //not byte ptr[eax]
    //add byte ptr[eax], 0x04
    //movzx edi, byte ptr[eax]
    //pop eax
    //xor eax, edi
    //pop edi
    //rol al, 1
    //rol al, 1
    //add al, 0x04
    //ret
    //-----------------------------------------------------------------------------------//



    //-------------------------CDECL VERSION---------------------------------------------//
    push ebp                        //save old base pointer value
    $mov ebp, esp                   //set new base pointer value
    push edi                        //destination index register used for string, memory array copying, setting and for far pointer addressing with ES (push EDI onto stack)
    push ecx                        //counter register, used as a loop counter (push 'Char' onto stack)
    mov eax, [ebp +8]               //move value of parameter 1 into eax
    mov ecx, [ebp +12]              //move valye of parameter 2 into ecx
    not byte ptr[eax]               //ones complement negation byte pointer used with the 'EKey' single byte location address
    add byte ptr[eax], 0x04         //byte pointer used to add 4 in hexidecimal to the 'EKey' single byte location address
    movzx edi, byte ptr[eax]        //moves the value of 'EKey' address to EDI using zeros instead of a sign bit
    pop eax                         //pop value of 'character to be encrypted' from stack
    xor eax, edi                    //XOR 'character to be encrypted' with EDI value, this give the 'encrypted value of the source character'(stage 1)
    pop ecx                         //recover register value
    pop edi                         //pop orginal address of EDI from stack
    rol al, 1                       //rotates the 'encrypted value of the source character' register(stage 2) left by 1 bit, leaves a carry for my test string 'manutd$'
    rol al, 1                       //rotates the 'encrypted value of the source character' register(stage 3) left by 1 bit, leaves a carry for my test string 'manutd$'
    add al, 0x04                    //adds 4 in hexidecimal to 'encrypted value of the source character'(final stage)
    mov esp, ebp                    //deallocate values
    $pop ebp                    //restore callers base pointer value
    ret                             //return from procedure
    //-----------------------------------------------------------------------------------//

任何人都将不胜感激。感谢

2 个答案:

答案 0 :(得分:0)

要修复第二个警告,您应该对纯组件的函数使用__declspec(naked)

答案 1 :(得分:0)

pushpop无法处理字节。最小大小为16位。