我正试图改变这一行
0041DE91 | 8B 46 64                 | mov eax,dword ptr ds:[esi+64]  
0041DE94 | 83 C4 0C                 | add esp,C                                   
0041DE97 | 83 F8 01                 | cmp eax,1                                   
至
0041DE91 |  mov eax, 10
但是3个字节的指令占用5个字节并溢出到它下面的两个地址:
0041DE91 | B8 0A 00 00 00           | mov eax,10                                    
0041DE96 | 0C 83                    | or al,83                                    
0041DE98 | F8                       | clc                                    
是否可以在调试器中对预编译的程序执行此操作?
在32位代码中(没有红区到clobber)你可以用3个字节将imm8常量移动到寄存器(效率低下):
push   10       ; 2B
pop    eax      ; 1B
你也可以1进入3B的注册
xor    eax, eax  ; 2B
inc    eax       ; 1B
或者,给定已知内容的任何其他注册:
lea    eax, [ecx+/-imm8]   ; 3B
其他代码 - 高尔夫/代码大小优化技巧:
xor    eax,eax   ; 2B
cdq              ; 1B to zero edx as well
xchg   eax, ecx  ; 1B.  Shorter than MOV if you want ecx=eax and can trash eax (or both parts are actually useful)
其中许多也适用于16位和64位代码.例如,请参阅3286 x86-64机器代码中的adler32和x86-16版本.