首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >汇编程序代码的实现

汇编程序代码的实现
EN

Stack Overflow用户
提问于 2010-08-30 12:40:32
回答 1查看 865关注 0票数 1

我试图用C重写这个asm代码,但是我的asm知识非常糟糕。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-30 15:30:29

这不是真正的答案。正如我所理解的,这只是一些想法和对函数的重写,希望是一种更清晰的形式。

我非常怀疑你的问题在于这句话:

代码语言:javascript
复制
 if( ((WORD*)zdata)[i] + AsmDrawData.ShiftZ0 >= ((WORD*)zbuffer)[i] )

在这段代码中,您将zdata指针从一个字节转换为一个单词指针。我觉得很奇怪。不过,这个程序集似乎也做了同样的事情。因为您可能更了解zdata字段是如何填充的,所以您可能会对它做出更好的决定。

这个zbuffer算法似乎是相当标准的,所以即使不试图反向工程这个程序集,您也应该能够相当容易地在C中重新实现它。

我重写了这个。我喜欢保持这种本地化,所以我只在顶部声明具有正确类型的本地指针(并且使用C99 stdint名称,因为它们比WORD更可移植)。

代码语言:javascript
复制
#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
     }
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3600376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档