Встроенная сборка printf, интерпретирующая целые числа как адрес - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь сделать печать массива встроенной сборкой. Функция printf продолжает интерпретировать значение в стеке как адрес, который необходимо распечатать, и приводит к ошибке (снимок экрана: https://prnt.sc/r692d3). И если я передаю адрес в printf, он выводит такие значения мусора, как эти: (Снимок экрана: https://prnt.sc/r691de). Кроме того, если кто-то знает - как поместить '\n' в строку со встроенным ASM? Спасибо:)

int main()
{
    int mas[5] = { 1,2,3,4,5 };
    int32_t diff = sizeof(int);
    __asm
    {
        mov esi, 0x0

        lea ecx, [mas]
        mov eax, [ecx]
        push ecx
        call printf; Here it tries to read value '1' as an address
        pop eax

        loop_t:

        xor ebx, ebx; Clear the registers
        xor ecx, ecx;

            lea ecx, [mas]; ECX = &mas
            mov ebx, diff;
        add ebx, ecx; &mas + diff
        mov eax, [ebx]; Transfer the value
        push eax; Push it on stack
        call printf; Same thing here, interprets it as an address
            pop eax;
            add diff, 0x4;
            inc esi; Cleanup process and looping back on
            cmp esi, 0x5;
            jne loop_t;
    }
}

1 Ответ

2 голосов
/ 22 февраля 2020

Первым параметром функции printf является строка формата, то есть указатель на первый символ массива символов с нулевым символом в конце. Поэтому первый параметр всегда будет обрабатываться как адрес.

Если вы передадите значение 1 в качестве первого параметра в printf (помещая его в стек в последнюю очередь), он попытается прочитать строку формата с адреса 1 (что не получится).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...