assembly - 通过 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
但它没有做任何事情。这是更改位图上像素颜色的正确方法吗?也许我应该以某种方式保存它?
解决方案
这对于评论来说太长了,所以我写它作为答案。
您正在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 的评论,并在创建框架之前设置了条目标签以获得完整的样本。谢谢。
推荐阅读
- optimization - SummingMergeTree 按元组分区
- php - Vue.js Axios.post 将变量发送到 php,但我无法访问这些变量
- android - 是否有一个简单的活动示例可以在 Android Studio 项目中集成 Play Services 排行榜和成就?
- swift - 在 xib 文件中对自定义 tableviewcell 进行单元测试
- java - 如何在 Spring Cloud DataFlow 中注册应用程序?
- vb.net - 检测树视图何时加载节点?
- php - Mysql Trigger:更新一行并影响另一行
- php - 如何使用 php referer 获取 youtube 视频 ID?
- c++ - 如何在matlab mex文件中输出整数向量?
- c - 如何在引导加载程序中跳转到我的应用程序地址