我正在尝试用 C 重写此 asm 代码,但我的 asm 知识非常糟糕。
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;<p></p>
inline void AsmDrawWithZ16(BYTE *zdata,BYTE *data,WORD *zbuffer,void <em>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</em>(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: } }
This is what I write, but this wrong:
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]];
}
}
}
我哪里错了? (抱歉我的英语非常非常糟糕)
最佳答案
这不是真正的答案。这只是一些想法和我所理解的函数的重写,希望以更清晰的形式出现。
我高度怀疑您的问题出在线路上:
if( ((WORD*)zdata)[i] + AsmDrawData.ShiftZ0 >= ((WORD*)zbuffer)[i] )
在此代码中,您将 zdata
指针从 byte 转换为 word 指针。这对我来说似乎很奇怪。不过, assembly 似乎确实做了同样的事情。由于您可能更了解 zdata 字段是如何填充的,因此您可能可以更好地确定它。
这个 zbuffer 算法看起来相当标准,所以即使不尝试对这个程序集进行逆向工程,你也应该能够相当容易地用 C 语言重新实现它。
我重写了这个,.我喜欢保持本地化,所以我只在顶部声明具有正确类型的本地指针(并且还使用 C99 stdint 名称,因为它们比 WORD 更便携)。
#include <stdint.h>
inline void AsmDrawWithZ16(BYTE *zdata,BYTE *data,WORD *zbuffer,void *video,int no_dot) {
uint8_t * zd = zdata; // Should this be 8 or 16 bit
uint8_t * dat = data;
uint16_t * zb = zbuffer;
uint16_t shz = AsmDrawData.ShiftZ0;
uint16_t * vid = (uint16_t *)video;
for( int i = 0; i < no_dot; i++ ) {
uint16_t X = shz + zd[i];
if( X >= zb[i] ) // Is this the correct direction of the compare
{
zb[i] = zdata[i] + X; // update the depth
vid[i] = AsmDrawData.Palette[ dat[i] ]; // update the color
}
}
}
关于汇编代码的C实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3600376/