作者king19880326 (OK的啦~我都可以接受)
看板ASM
标题[问题] c code 直接转换
时间Sun Dec 30 18:02:45 2007
以下是一段c code,是用来计算crc32
unsigned int crc32(const char* data, size_t length)
{
const unsigned int POLY = 0xEDB88320; // standard polynomial in CRC32
unsigned int reminder = 0xFFFFFFFF; // standard initial value in CRC32
for(size_t i = 0; i < length; i++)
{
reminder ^= (unsigned char)data[i]; // must be zero extended
for(size_t bit = 0; bit < 8; bit++)
if(reminder & 0x01)
reminder = (reminder >> 1) ^ POLY;
else
reminder >>= 1;
}
return reminder ^ 0xFFFFFFFF;
}
我将它直接转成了intel的组语如下
.386
.model flat
option casemap :none
.data
count DWORD ? ;用来存第一层回圈的计数器
.code
_crc32 PROC PUBLIC
push ebp ;
mov ebp, esp ; build stack frame
; variables in stack
; [ebp+12] data length (the second argument)
; [ebp+8] pointer to string data (the first argument)
; [ebp+4] return address
; [ebp] previous ebp
; begin CRC32 calculation
; WRITE YOUR OWN CODE HERE
mov eax, 0FFFFFFFFh ; 用来存reminder
mov esi, [ebp+8] ; 指向一串资料的开头
mov ecx, [ebp+12] ; 第一层回圈的初始化
L1: ;第一层回圈
xor eax, [esi] ;
inc esi ; 指向下一个阵列元素
mov count, ecx ; 将目前的回圈次数存起来
mov ecx, 8 ; 第二层回圈的初始化
L2:
test eax, 1 ; 与1作&
jz B1 ; 若为零则跳至B1
shr eax, 1 ; remainder >>= 1
xor eax, 0EDB88320h; reminder ^= POLY
jmp B2:
B1:
shr eax, 1; remainder >>= 1
B2:
loopd L2 ; 检验是否跳回L2重做
mov ecx, count ; 取回第一圈回圈的计数器
loopd L1 ; 检验是否跳回L1重做
xor eax, 0FFFFFFFFh ; return reminder ^ 0xFFFFFFFF
; end CRC32 calculation
leave
ret
_crc32 ENDP
END ; file ends here
可是上传的结果的结果却是错的
而且放进VC 2005 组译的时候 会产生
LINK : error LNK2001: 无法解析的外部符号 _mainCRTStartup
C:\Documents and Settings\123\My Documents\Visual Studio 2005\Projects\hw4\
Debug\hw4.exe : fatal error LNK1120: 1 个无法解析的外部符号 这两个错误讯息
不知道哪个地方有问题 找很久也找不出来 希望哪位大大能帮我一把OTZ
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.243.43
※ 编辑: king19880326 来自: 140.112.243.43 (12/30 19:38)
※ 编辑: king19880326 来自: 140.112.243.43 (12/30 20:36)
1F:推 cutemens:VC跟组语有关系?? 01/07 09:14
2F:→ ccbruce:大概是嵌入式组语,你程式少了main function啊~ 01/14 00:30
3F:→ ccbruce:加个main就能解决了,不然就编成.lib 01/14 00:30