我想在C中重寫這個asm代碼,但是我的asm知識非常糟糕。 彙編代碼的C實現
struct { union { struct{ WORD ShiftZ0; WORD ShiftZ1; WORD ShiftZ2; WORD ShiftZ3; }; struct{ DWORD ShiftZ01; DWORD ShiftZ23; }; }; short ShiftZ0Align; short ShiftZ1Align; short ShiftZ2Align; short ShiftZ3Align; int deltaZ0ToNextLine; int deltaZ1ToNextLine; void *Palette; } AsmDrawData;
inline void AsmDrawWithZ16(BYTE *zdata,BYTE *data,WORD *zbuffer,void video,int no_dot) { __asm { cmp no_dot,0 je end mov esi,zdata mov edi,video mov ebx,zbuffer mov ecx,AsmDrawData.Palette lp: mov eax,AsmDrawData.ShiftZ01 add ax,[esi] cmp ax,[ebx] jle end_out_byte mov [ebx],ax mov edx,data movzx edx,byte ptr [edx] mov DX_REG,[ecx+edx(COLOR_DEPTH/8)] mov [edi],DX_REG end_out_byte: add edi,(COLOR_DEPTH/8) add ebx,2 add esi,2 inc data dec no_dot jg lp end: } }
這是我寫的,但這個錯誤:
inline void AsmDrawWithZ16(BYTE *zdata,BYTE *data,WORD *zbuffer,void *video,int no_dot) {
for(int i = 0; i < no_dot; i++) {
if(((WORD*)zdata)[i] + AsmDrawData.ShiftZ0 >= ((WORD*)zbuffer)[i])
{
((WORD*)zbuffer)[i] = ((WORD*)zdata)[i] + AsmDrawData.ShiftZ0;
((WORD*)video)[i] = ((WORD*)AsmDrawData.Palette)[((BYTE*)data)[i]];
}
}
}
在哪裏我可能是錯的? (對不起,我的英語很不好)
如果您還需要粘貼一些示例數據來查看它的錯誤,它將幫助我們幫助您。 asm代碼在循環內有一個'if',它不會出現在你的代碼中。 – Dummy00001 2010-08-30 12:45:54
嗯。很奇怪,IF語句不存在於我的問題中 - 在我的問題的代碼中。我添加IF,現在有我所有的功能。 – XRazont 2010-08-30 12:58:25
我很抱歉,但我無法顯示一些示例數據 - 此代碼用於軟件渲染。在屏幕上看到一些錯誤是很容易的,但確切的是 - 很難。我認爲Z比較有問題,但我不明白究竟是什麼。 – XRazont 2010-08-30 13:02:48