通过 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 的评论,并在创建框架之前设置了条目标签以获得完整样本。谢谢
我尝试修改位图 - 在其上添加一个像素。
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 的评论,并在创建框架之前设置了条目标签以获得完整样本。谢谢