我很高兴将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'
答案 0 :(得分:0)
我对汇编知之甚少(我知道它来自C / Linux)所以我会尝试提出一些有用的建议。
您的函数是否需要传递给它的任何参数?是否需要向呼叫者返回一些内容?你可以编写一个简短的C源文件,它只定义一个像这样的小函数。
void butts(void) {
printf("butts\n");
}
然后按照您的方式将该单个文件转换为汇编。把它命名为你想要的,但要记住它。这应该为您提供一个函数名为butts
的汇编源文件。然后,您可以将您在问题中发布的代码放入该汇编文件中。确保可以使用您设置的名称调用它。我认为__asm{}
不会按您希望的方式运作。
然后,我相信,您可以将该汇编文件编译为对象,并将其与C源编译对象链接,以便您可以将整个事件编译在一起。确保在C(或标题)文件中定义此函数的任何内容,而无需编写函数体。像这样使用原型:
void butts(void);
对不起,如果这是hogwash或根本没有帮助。只是头脑风暴和类似的事情可能适合你。