Моя сборка ржавая, но, вероятно, это должны быть побайтовые шаги.Вам нужен байтовый массив в памяти, так как это то, что printf
ожидает для %s
.Строка в памяти, вероятно, имеет вид "\0\0\0h\0\0\0e\0\0\0l\0\0\0l\0\0\0o\0\0\0"\0\0\0\0\0\0\0
.
mov dword[ebx + 0], '"' ; moves the 32-bit value 0x22000000 to EBX
mov dword[ebx + 4], 'h' ; moves the 32-bit value 0x68000000 to EBX + 4
...
Итак, если ebx
содержит адрес 0x123456, то в памяти будет что-то вроде следующего:
0123456 | 22 00 00 00 68 00 00 00 65 00 00 00 6c 00 00 00 | "...h...e...l... |
0123466 | 6c 00 00 00 6f 00 00 00 22 00 00 00 00 00 00 00 | l...o..."....... |
Даже если вы передаете 0x123456 в printf
в качестве адреса, он видит только один символ, прежде чем он достигнет первого байта NUL.Должно работать следующее:
mov dword[ebx + 0], 577267052 ; 0x2268656c = "hel
mov dword[ebx + 4], 1819222528 ; 0x6c6f2200 = lo"\0
push ebx
push formatString
call printf
add esp, 8
Вероятно, есть гораздо лучший способ загрузки байтов в косвенный адрес на основе ebx
, но я не смотрел на сборку больше лет, чем могу сосчитать.