这个评论太长了,所以我把它写下来作为答案。
您正在替换中的地址
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字节的情况,你将修改(至少)两个像素的值(除非有一种标题问题没有告诉我们)。重新考虑这一方面,以便您只能修改
正好一个像素
.
编辑:
我整合了@michael petch的评论,并在框架创建之前设置了条目标签,以获得完整的样本。谢谢。