菜鸟,我想向传两个内存地址到一段汇编代码。不知怎么实现

SAM2002 2021-01-23 12:46:31
这段代码是 MMX解码 YV12到RGB32的。我想一次传两行地址进去不知怎么实现。下面是代码。

__asm {
pushad
finit
xor eax, eax
mov ebx, height
mov ecx, width
mov edx, y
mov edi, v
mov esi, u
mov ebp, rgb //想在这里加一个外部指针传一个地址进来,不知怎么实现,恳请请大神帮忙。
hloop :
push ebx
mov ebx, ecx
wloop :
push ebx
xor ebx, ebx
mov al, [edi]
mov bl, [esi]
movq mm0, [CoefficientsRGBU + 8 * eax]
paddw mm0, [CoefficientsRGBV + 8 * ebx]
mov al, [edx]
mov bl, [edx + 1]
movq mm1, [CoefficientsRGBY + 8 * eax]
movq mm2, [CoefficientsRGBY + 8 * ebx]
mov al, [edx + ecx]
mov bl, [edx + ecx + 1]
movq mm3, [CoefficientsRGBY + 8 * eax]
movq mm4, [CoefficientsRGBY + 8 * ebx]
paddw mm1, mm0
paddw mm2, mm0
paddw mm3, mm0
paddw mm4, mm0
psraw mm1, 6
psraw mm2, 6
psraw mm3, 6
psraw mm4, 6
packuswb mm1, mm2
packuswb mm3, mm4
movq[ebp], mm1
movq[ebp + 4 * ecx], mm3
add ebp, 8
add edx, 2
add edi, 1
add esi, 1
pop ebx
sub ebx, 2
jnz wloop
lea ebp, [ebp + 4 * ecx]
add edx, ecx
pop ebx
sub ebx, 2
jnz hloop
emms
popad
}
...全文
194 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你的方法是可以的,只是需要略加修改:
mov ebp,[esp+8] //这是取堆栈中第三个数据
movq [ebp], mm3 //mm3是64位数据
add dword ptr [esp+8], 8 // 这个是指后向后移动8字节

mov ebp,[esp + 12] //这是取堆栈中第四个数据
movq [ebp], mm1
add dword ptr [esp+8], 8
SAM2002 2021-01-24
  • 打赏
  • 举报
回复
引用 2 楼 早打大打打核战争 的回复:
mov ebp, rgb //在这里加入一句传另一个指针进入 movq[ebp + 4 * ecx], mm3 //将这句改成向新地址 付值。 =================================== 这里的rgb显然是指向接收转换后的RGB32数据的缓冲区,你要传另一个指针只需要“mov ebp, 另一个指针”,但是你传入另一个指针做什么用是一个问题
=================================== 只需要“mov ebp, 另一个指针”,那我前一个指针数据不是初冲掉了吗?我要同时用两个指针,必需要把前一个指针缓存起来才行。 我是这样的。(存储两个指针并压入堆栈) mov ebp, rgb1 push ebp mov ebp, rgb2 push ebp 在用的地方加入 从堆栈通过 esp 指针偏移取出堆栈对应的数据 然后在付值, lea ebp,[esp+8] //这是取堆栈中第三个数据 movq[ebp], mm3 //mm3是64位数据 add ebp, 8 // 这个是指后向后移动8字节 lea ebp,[esp + 12] //这是取堆栈中第四个数据 movq[ebp], mm1 add ebp, 8 程序编译通过了程序能运行,但显示有问题。感觉没有写进去。我菜鸟第一次改写汇编程序。
SAM2002 2021-01-24
  • 打赏
  • 举报
回复
第二个指针也是接收转换后的数据。因为我想减少内存copy次数,直接用纹理空间来接收转换后的数据(传纹理指针给它),而纹理空间并不连续所以需要一次两行的启始地址给程序。 你知道怎么实现吗? 我想了一个方法。就是把两个指针压入堆栈,每次用的时候通过 esp 的偏移访问堆栈中存储的地址。程序编译通过了,但输出有问题。你能不能帮我修改一下。 mov ebp, rgb1 push ebp mov ebp, rgb2 push ebp 在用的地方加入 lea ebp,[esp+8] movq[ebp], mm3 add ebp, 8 lea ebp,[esp + 12] movq[ebp], mm1 add ebp, 8 ebp 继存器在系统中、不知还有没有、其它与它功能一样的。我菜鸟第一次改写汇编程序。【上面那个帖子输入法总是输错不好意思】
SAM2002 2021-01-24
  • 打赏
  • 举报
回复
第二个指针也是接收转换后的数据。因为我想减少内存copy次数,直接用纹理空间来接收转换后的数据(传纹理指针给它),而纹理空间并不连续所以需要一次两行的启如地址给程序。 你知道怎么实现吗? 我想了一个方法。就是把两个指针压入堆栈,每次用的时候通过 esp 的偏移不防问堆栈中存储的地址。程序编译通过了,但输出有问题。你能不能帮我修改一下。 mov ebp, rgb1 push ebp mov ebp, rgb2 push ebp 在用的地方加入 lea ebp,[esp+8] movq[ebp], mm3 add ebp, 8 lea ebp,[esp + 12] movq[ebp], mm1 add ebp, 8 ebp 继存器在系统中不知还有没有其它与它功能的样的。我菜鸟第一次改写汇编程序。
SAM2002 2021-01-23
  • 打赏
  • 举报
回复
mov ebp, rgb //在这里加入一句传另一个指针进入 movq[ebp + 4 * ecx], mm3 //将这句改成向新地址 付值。 我从没用过汇编。请各位帮忙,谢谢。
  • 打赏
  • 举报
回复
mov ebp, rgb //在这里加入一句传另一个指针进入
movq[ebp + 4 * ecx], mm3 //将这句改成向新地址 付值。
===================================

这里的rgb显然是指向接收转换后的RGB32数据的缓冲区,你要传另一个指针只需要“mov ebp, 另一个指针”,但是你传入另一个指针做什么用是一个问题

21,497

社区成员

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

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