Joh*_*lis 1 opengl macos video assembly x86-64
我正在使用Intel Mac OS X 10.6.x上的C++应用程序.我有一个变量,它包含使用OpenGL调用glReadPixels获得的像素数据.我想使用x86_64汇编指令直接对像素数据执行一些操作.汇编程序在测试程序中运行良好,但是当我尝试在像素数据上使用它时,它只在像素数据变量指向的内存位置中得到零.我猜这是因为我试图直接从x86_64程序集访问视频内存.有没有办法直接从程序集访问x86_64视频内存?否则我该如何解决这种情况?
感谢任何指针.提前致谢.
请参阅下面的代码示例以翻转最后n个和前n个字节.相同的代码在测试程序中运行良好.
void Flip(void *b, unsigned int w, unsigned int h)
{
__asm {
mov r8, rdi //rdi b
mov r9, rsi //W
mov r10,rdx //H
mov r11, 0 // h <- 0
mov r12, 0 // w<- 0
outloop:
------------
.............
.............
}
Run Code Online (Sandbox Code Playgroud)
这不是一个真正的答案,但评论位太短,无法发布.
您的内联汇编有多种方式存在问题:
拥有一个完整的(可编译的)源片段也是一件好事.像(32位代码)的东西:
int mogrifyFramebufferContents(unsigned char *fb, int width, int height)
{
int i, sum;
glReadPixels(1, 1, width, height, GL_RGBA, GL_UNSIGNED_BYTE, fb);
for (i = 0, sum = 0; i < 4 * width * height; i++)
sum += fb[i];
printf("sum over fb via C: %d\n", sum);
asm("xorl %0, %0\n"
"xorl %1, %1\n"
"0:\n"
"movsbl (%2, %1), %ebx\n"
"addl %ebx, %0\n"
"incl %1\n"
"cmpl %1, %3\n"
"jl 0b"
: "=r"(sum)
: "r"(i), "r"(fb), "r"(4 * width * height)
: "cc", "%ebx");
printf("sum over fb via inline asm: %d\n", sum);
return (sum);
}
Run Code Online (Sandbox Code Playgroud)
如果我没有发生一次性错误,则此代码应为C和汇编产生相同的输出.尝试类似的东西,就在你在C中访问读取数据的地方,并比较汇编结果 - 甚至通过调试器生成的程序集单步执行.
对"gcc内联汇编语法"的stackoverflow搜索将为您提供%0
... %2
占位符含义的起点,和/或上述寄存器赋值约束的"=r"(sum)
工作原理.
归档时间: |
|
查看次数: |
1062 次 |
最近记录: |