通过 x86 程序集更改位图

Change the bitmap via x86 assembly

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

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

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

这个评论太长了,所以我把它写成一个答案。
您正在使用以下指令将 EAX 中的地址替换为其地址处的值:

mov eax, [eax]           ;load address 

在这里,您可以覆盖write-back 更新值所需的地址。所以将您的代码更改为

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,你将要修改(至少)两个像素的值(除非有某种 header问题没有告诉我们)。重新考虑这一方面,以便您只能修改 正好一个像素

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