我试图用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;
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:
}
}
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]];
}
}
}
Where I could be wrong? (sorry for my very very bad english)发布于 2010-08-30 15:30:29
这不是真正的答案。正如我所理解的,这只是一些想法和对函数的重写,希望是一种更清晰的形式。
我非常怀疑你的问题在于这句话:
if( ((WORD*)zdata)[i] + AsmDrawData.ShiftZ0 >= ((WORD*)zbuffer)[i] )在这段代码中,您将zdata指针从一个字节转换为一个单词指针。我觉得很奇怪。不过,这个程序集似乎也做了同样的事情。因为您可能更了解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
}
}
}https://stackoverflow.com/questions/3600376
复制相似问题