在asm中翻转图像中的第一个像素

时间:2016-05-08 00:26:27

标签: image assembly x86

嗨我只是在练习之前我创建了一个可以水平或垂直翻转3x3图像的循环。我使用一个名为ap的变量来存储第一个像素的地址。我还想最终使用另一个名为amp的变量来存储镜像像素地址,还有一个寄存器来存储计算出的像素偏移量,但是现在我把它放在手动中。无论我做什么,程序都不会交换它们。有谁知道这是什么问题?谢谢你的阅读。

    mov ecx, dword ptr[eax + ecx * 4]
    mov ap, ecx   //temporary pixel address storage
    mov ecx, 0

    mov ecx, dword ptr[eax + ecx * 4 + 8]   //offset by 8 pixels
    mov [ap], ecx

2 个答案:

答案 0 :(得分:2)

  

我正在使用一个名为ap的变量来存储第一个像素的地址

如果 ap 变量被假定包含的地址超过了您需要使用lea指令(而不是mov指令)的地址。

; For the 1st line EAX is address of image = address of 1st pixel
mov ecx, 0                          ;Index to 1st pixel
lea ecx, dword ptr[eax + ecx * 4]   ;Address of 1st pixel
mov [ap], ecx
mov ecx, 2                          ;Index to 3rd pixel
lea ecx, dword ptr[eax + ecx * 4]   ;Address of 3rd pixel
mov [amp], ecx

现在交换这些像素,从而翻转你可以写的图像:

mov ecx, [ap]
mov edx, [amp]
mov [ap], edx
mov [amp], ecx

要处理图像的下一行,您可以每次将每个扫描行的字节数添加到EAX寄存器。对于3x3图像,可能是12。

答案 1 :(得分:0)

我不明白这个想做的事情:

 mov ecx, dword ptr[eax + ecx * 4]

ecx中有什么问题?它是抵消的计数器吗?但是你每次都凌驾于...... 如果您试图保存原始位,我认为您需要确保在ecx中获得正确的值。试试

mov ecx, 0

首先(你也可以xor ecx, ecx完成工作并且更容易阅读)