[問題] c code 直接轉換
以下是一段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)
推
01/07 09:14, , 1F
01/07 09:14, 1F
→
01/14 00:30, , 2F
01/14 00:30, 2F
→
01/14 00:30, , 3F
01/14 00:30, 3F
ASM 近期熱門文章
PTT數位生活區 即時熱門文章