在转换后的c文件中使用C语言中的汇编程序

时间:2017-12-05 18:56:56

标签: c visual-studio assembly embedded

我很高兴将asm用于C代码,很抱歉,如果我的问题太愚蠢了。 问题是我在C中编写了一个基于代码规则文件编写文本文件的程序。但是我试图在asm中创建一些方法。所以我让编译器(Visual编译器)创建了我的代码的asm文件。事情是,当我看到一个方法的asm代码时,有这样的事情。如果我尝试将其粘贴到我的方法添加,在__asm {}内部,即使与输出相同,我也会收到错误。 如何将这个asm代码放在我的函数中? 感谢...

_movement$ = -20                                        ; size = 4
_leftBits$ = -16                                        ; size = 4
_hexa$ = -12                                            ; size = 4
_actualByte$ = -8                                 ; size = 4
_character$ = -2                                        ; size = 1
_temp$ = -1                                   ; size = 1
_data$ = 8                                          ; size = 4
_code$ = 12                                   ; size = 1
_longg$ = 16                                            ; size = 4
_positionBit$ = 20                                  ; size = 4
add PROC
        push     ebp
        mov      ebp, esp
        sub      esp, 20              ; 00000014H
        mov      eax, DWORD PTR _positionBit$[ebp]
        cdq
        and      edx, 7
        add      eax, edx
        sar      eax, 3
        mov      DWORD PTR _actualByte$[ebp], eax
        mov      eax, DWORD PTR _positionBit$[ebp]
        and      eax, -2147483641 ; 80000007H
        jns      SHORT $LN4@add
        dec      eax
        or       eax, -8                    ; fffffff8H
        inc      eax
$LN4@add:
        mov      DWORD PTR _leftBits$[ebp], eax
        mov      ecx, DWORD PTR _data$[ebp]
        add      ecx, DWORD PTR _actualByte$[ebp]
        mov      dl, BYTE PTR [ecx]
        mov      BYTE PTR _character$[ebp], dl
        mov      DWORD PTR _hexa$[ebp], 255 ; 000000ffH
        mov      eax, 8
        sub      eax, DWORD PTR _longg$[ebp]
        mov      DWORD PTR _movement$[ebp], eax
        mov      edx, DWORD PTR _hexa$[ebp]
        mov      ecx, DWORD PTR _movement$[ebp]
        sar      edx, cl
        mov      DWORD PTR _hexa$[ebp], edx
        movzx    eax, BYTE PTR _code$[ebp]
        and      eax, DWORD PTR _hexa$[ebp]
        mov      BYTE PTR _code$[ebp], al
        mov      cl, BYTE PTR _code$[ebp]
        mov      BYTE PTR _temp$[ebp], cl
        mov      edx, 8
        sub      edx, DWORD PTR _longg$[ebp]
        add      edx, 1
        cmp      DWORD PTR _leftBits$[ebp], edx
        jge      SHORT $LN1@add
        mov      ecx, 8
        sub      ecx, DWORD PTR _leftBits$[ebp]
        mov      eax, 255   ; 000000ffH
        shl      eax, cl
        mov      ecx, DWORD PTR _data$[ebp]
        add      ecx, DWORD PTR _actualByte$[ebp]
        movzx    edx, BYTE PTR [ecx]
        and      edx, eax
        mov      eax, DWORD PTR _data$[ebp]
        add      eax, DWORD PTR _actualByte$[ebp]
        mov      BYTE PTR [eax], dl
        movzx    edx, BYTE PTR _temp$[ebp]
        mov      ecx, 8
        sub      ecx, DWORD PTR _longg$[ebp]
        sub      ecx, DWORD PTR _leftBits$[ebp]
        shl      edx, cl
        mov      eax, DWORD PTR _data$[ebp]
        add      eax, DWORD PTR _actualByte$[ebp]
        movzx    ecx, BYTE PTR [eax]
        or       ecx, edx
        mov      edx, DWORD PTR _data$[ebp]
        add      edx, DWORD PTR _actualByte$[ebp]
        mov      BYTE PTR [edx], cl
$LN1@add:
        mov      esp, ebp
        pop      ebp
        ret      0
add ENDP

这是尝试编译时的错误日志。

simple.c(185): error C2059: syntax error: '__asm'
simple.c(201): error C2059: syntax error: 'bad suffix on number'
simple.c(209): error C2059: syntax error: 'bad suffix on number'
simple.c(210): error C2018: unknown character '0x40'
simple.c(214): error C2018: unknown character '0x40'
simple.c(220): error C2059: syntax error: 'bad suffix on number'
simple.c(237): error C2018: unknown character '0x40'
simple.c(240): error C2059: syntax error: 'bad suffix on number'
simple.c(261): error C2018: unknown character '0x40'

1 个答案:

答案 0 :(得分:0)

我对汇编知之甚少(我知道它来自C / Linux)所以我会尝试提出一些有用的建议。

您的函数是否需要传递给它的任何参数?是否需要向呼叫者返回一些内容?你可以编写一个简短的C源文件,它只定义一个像这样的小函数。

void butts(void) {
    printf("butts\n");
}

然后按照您的方式将该单个文件转换为汇编。把它命名为你想要的,但要记住它。这应该为您提供一个函数名为butts的汇编源文件。然后,您可以将您在问题中发布的代码放入该汇编文件中。确保可以使用您设置的名称调用它。我认为__asm{}不会按您希望的方式运作。

然后,我相信,您可以将该汇编文件编译为对象,并将其与C源编译对象链接,以便您可以将整个事件编译在一起。确保在C(或标题)文件中定义此函数的任何内容,而无需编写函数体。像这样使用原型:

void butts(void);

对不起,如果这是hogwash或根本没有帮助。只是头脑风暴和类似的事情可能适合你。