首页 > 解决方案 > 通过 x86 程序集更改位图

问题描述

我尝试修改位图 - 在其上添加一个像素。

push    ebp
mov ebp, esp

put_pixel:
mov eax, DWORD [ebp+8]  ;address of bitmap
add eax, 130            ;take address i wanna change
mov eax, [eax]          ;load address
not eax                 ;this adders is ff(white) change to (00) black
mov ecx, eax    ;return value
mov eax, ecx        ;return ecx
pop ebp
ret

但它没有做任何事情。这是更改位图上像素颜色的正确方法吗?也许我应该以某种方式保存它?

标签: assemblyx86nasm

解决方案


这对于评论来说太长了,所以我写它作为答案。
您正在EAX使用以下指令将地址替换为其地址处的值:

mov eax, [eax]           ;load address 

在这里,您覆盖了您需要写回更新值的地址。因此,将您的代码更改为

put_pixel:               ;moved before the frame creation
push ebp                 ;create the frame
mov  ebp, esp            ;...
mov  edx, DWORD [ebp+8]  ;address of bitmap
add  edx, 130            ;calculate address of pixel you want to change
mov  eax, DWORD [edx]    ;load value at address
not  eax                 ;this adders is ff(white) change to (00) black
mov  DWORD [edx], eax    ;write-back updated pixel value
                         ;pixel value is still in EAX as return value
pop ebp                  ;restore frame
ret

一个问题仍然存在:
130 不是 4 的倍数。因此,如果您有一个 4-bytes-per-Pixel-Situation,您将要修改(至少)两个像素的值(除非有某种标题问题没有告诉我们)。重新考虑这个方面,这样您就可以只修改一个像素

编辑:
我结合了@Michael Petch 的评论,并在创建框架之前设置了条目标签以获得完整的样本。谢谢。


推荐阅读