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