内联汇编转成 C++ 代码

zhouguangcai1 2020-03-18 10:59:56
最近在搞 工程由 32 位转为 64 位,编译时 vs 64 位无法编译通过 内联汇编。个人对于汇编纯小白。
百度了主流方法,将 汇编单独便以为 asm 文件,但是将汇编代码拷贝至 asm 文件中编译时,竟然有些指令不认识。
有哪位大神能将这个函数中汇编翻译为 C++ 语言,谢谢!


void BlendWithMask_Normal_MMX(BYTE *pBuffer,
BYTE *pBaseBuffer,
BYTE *pMask,
VDWORD dwMaskAlignWidth,
DWORD dwMaskWidth,
VDWORD dwMaskHeight)
{
__int64 nMask = 0x00FF00FF00FF;
__int32 nColorKey = 0xFFFFFFFE;
VINT32 nMaskPitch = dwMaskAlignWidth - dwMaskWidth;
VINT32 nWidth = dwMaskWidth;
VINT32 nHeight = dwMaskHeight;

//BlendWithMask_Normal_MMX_ASM(pBuffer, pBaseBuffer, pMask, nWidth, nHeight, nMaskPitch)
__asm
{
mov ebx, nWidth
mov ecx, nHeight
pxor mm4, mm4

mov esi, pBuffer
mov edi, pBaseBuffer
mov eax, pMask
jmp line
next_line:
mov ebx, nWidth
add eax, nMaskPitch
line:
xor edx, edx
movd mm0, [esi]
movd mm1, [edi]
mov dl, [eax]
movd mm2, edx

movd edx, mm0 // 判断是否为255,255,254
cmp edx, nColorKey
je normal
movd edx, mm2
cmp edx, 0x0
je normal

punpcklbw mm0, mm4
punpcklbw mm1, mm4
movq mm5, mm2
psllq mm2, 16
por mm5, mm2
psllq mm2, 16
por mm5, mm2

movq mm3, mm5
pandn mm3, nMask // 1-alpha

pmullw mm0, mm5
pmullw mm1, mm3
paddusw mm0, mm1
psrlw mm0, 8
packuswb mm0, mm4
movd [esi], mm0
jmp continue_loop
normal:
movd [esi], mm1
continue_loop:
add esi, 4
add edi, 4
add eax, 1

dec ebx
jnz line
dec ecx
jnz next_line
emms
}
}

转为纯汇编时 pxor,movd,pmullw,paddusw 等这些指令都不识别。


坐等大神帮忙。
...全文
364 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复 1
你换用支持64位下嵌入汇编的编译器,诸如intel C++、GCC、C++Builder,就可以继续用他的上述代码,把基于32位的寻址esi、edi、eax改成64位寄存器rsi、rdi、rax,其他不用变
不过他这代码很老了,基于MMX,十几年以来都很少有程序使用了,而且写得也不是很优化,比如:
xor edx, edx
movd mm0, [esi]
movd mm1, [edi]
mov dl, [eax]
movd mm2, edx
这段,不但浪费了一条指令,而且在某些架构上会导致称之为partial register stall的问题,增加额外的延迟,可以改成:
movzx edx, byte ptr [eax]
movd mm0, [esi]
movd mm1, [edi]
movd mm2, edx
zhouguangcai1 2020-03-23
  • 打赏
  • 举报
回复
引用 1 楼 早打大打打核战争 的回复:
VC++64位不支持内嵌汇编,请用intel C++、GCC、C++Builder


是的不支持内联,我要做的就是把内联 汇编替换掉,或者拿出来做单独的 汇编文件编译,
  • 打赏
  • 举报
回复
VC++64位不支持内嵌汇编,请用intel C++、GCC、C++Builder

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧