代码之家  ›  专栏  ›  技术社区  ›  roffensive

通过x86程序集更改位图

  •  2
  • roffensive  · 技术社区  · 6 年前

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

    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
    

    但它不起作用。是否是更改位图上像素颜色的正确方法?也许我应该以某种方式保存它?

    1 回复  |  直到 6 年前
        1
  •  4
  •   zx485 potemkin    6 年前

    这个评论太长了,所以我把它写下来作为答案。
    您正在替换中的地址 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的评论,并在框架创建之前设置了条目标签,以获得完整的样本。谢谢。