Сборка printf - печатает только первый символ строки - PullRequest
0 голосов
/ 16 декабря 2011

Я пытаюсь напечатать строку в сборке, вызвав printf.

Мой код сборки:

mov dword[ebx + 0], '"'
mov dword[ebx + 4], 'h'
mov dword[ebx + 8], 'e'
mov dword[ebx + 12], 'l'
mov dword[ebx + 16], 'l'
mov dword[ebx + 20], 'o'
mov dword[ebx + 24], '"'
mov dword[ebx + 28], 0
push ebx
push formatString
call printf
add esp, 8
...
formatString    db    '%s', 10, 0

Однако, когда я запускаю это, он печатает только первый символ - «», а не все слово («привет»).

Большое спасибо

1 Ответ

5 голосов
/ 16 декабря 2011

Моя сборка ржавая, но, вероятно, это должны быть побайтовые шаги.Вам нужен байтовый массив в памяти, так как это то, что 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, но я не смотрел на сборку больше лет, чем могу сосчитать.

...