В вашем 0x0F4240
есть несколько не-ASCII символов;это то, что давит MSVC.
Встроенный ассемблер MSVC принимает числовые литералы в шестнадцатеричном формате 0xDEADBEEF
в стиле C (в отличие от MASM), поэтому ваш ассм выглядит так, как будто он должен компилироваться / собираться.(Полезно это или нет - другое дело.)
Сообщения об ошибках:
<source>(9): error C2059: syntax error: 'bad suffix on number'
<source>(9): error C2153: integer literals must have at least one digit
<source>(9): error C3872: '0xac': this character is not allowed in an identifier
<source>(9): error C2400: inline assembler syntax error in 'second operand'; found 'bad token'
Я включил вашу функцию в проводник компилятора Godbolt , чтобы получить фактическийсообщения об ошибках, с typedef для DWORD
, потому что у Godbolt нет Windows.h для его определения.
typedef unsigned long DWORD;
#define _TOJUMP 0xCDFA43
DWORD return_address = _TOJUMP + 0x6;
static __declspec(naked) void NewInitDamageBuff() {
_asm {
mov [edx + 0x29D0], 0x0F4240; // original
mov [edx + 0x29D0], 0x0F4240; // retyped compiles fine if you comment out the original
jmp return_address;
}
}
Эти сообщения об ошибках заставили меня думать, что там был не-ASCII символвключите и скопируйте / вставьте в hexdump -C
на моем рабочем столе Linux, чтобы подтвердить это:
00000000 6d 6f 76 20 5b 65 64 78 20 2b 20 30 78 32 39 44 |mov [edx + 0x29D|
00000010 30 5d 2c 20 30 78 e2 80 ad 30 46 34 32 34 30 e2 |0], 0x...0F4240.|
00000020 80 ac 3b 0a |..;.|
(.
на стороне вывода ASCII означает непечатный байт).
Итак, сразу после 0x
в операнде-источнике mov
, есть последовательность 80 ad 30
3-байтового UTF-8, которая, очевидно, не печатается как что-либо.