来自x86_64程序集的OS X视频内存

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)

Fra*_*kH. 5

这不是一个真正的答案,但评论位太短,无法发布.

您的内联汇编有多种方式存在问题:

  • 它假设编译器到达内联块时,函数参数仍在arg寄存器中.这不保证.
  • 它使用MS-VC++风格的内联汇编; 我不确定OSX Clang,但gcc本身拒绝编译它.

拥有一个完整的(可编译的)源片段也是一件好事.像(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)工作原理.