[英]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.