繁体   English   中英

从转换后的C文件在C中使用汇编器

[英]Using assembler inside C from converted c file

我对使用asm进入C代码还是陌生的,如果我的问题太笨了,抱歉。 事情是我用C语言编写了一个程序,该程序基于代码规则文件对文本文件进行编码,但是我试图在asm中创建一些方法,因此我使编译器(Visual编译器)为我的代码创建了一个asm文件。问题是,当我看到一种方法的asm代码时,就会出现类似这样的情况。 如果我尝试将其粘贴到__asm {}内部的方法add上,即使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'

我对Assembly知之甚少(我确实知道它来自C / Linux),所以我将尝试提出一些有用的建议。

您的函数是否需要传递给它的任何参数? 它需要返回一些东西给调用者吗? 您可以编写一个简短的C源文件,该文件仅定义了一个像这样的小功能。

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

然后将单个文件转换为组装文件。 随便命名,但要记住。 这应该给您一个带有函数名称butts的汇编源文件。 然后,您可以将问题中发布的代码放入该程序集文件中。 确保可以使用您设置的名称来调用它。 我认为__asm{}不会按您希望的方式工作。

然后,我相信,您可以将该程序集文件编译为一个对象,并将其与C语言源的编译对象链接,以便可以将整个程序一起编译。 确保在不编写函数主体的情况下定义C(或头)文件中此函数的内容。 使用这样的原型:

void butts(void);

抱歉,这很麻烦,还是根本没有帮助。 头脑风暴,这样的事情可能对您有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM