嗨我只是在练习之前我创建了一个可以水平或垂直翻转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
答案 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
完成工作并且更容易阅读)