Я работаю с xv6, который реализует оригинальную UNIX на компьютерах x86. Я написал очень простой ассемблерные в программе C:x86 add и addl операнды добавляются неправильно?
register int ecx asm ("%ecx");
printf(1, "%d\n", ecx);
__asm__("movl 16(%esp), %ecx\t\n");
printf(1, "%d\n", ecx);
__asm__("add $0, %ecx\t\n");
printf(1, "%d\n", ecx);
__asm__("movl %ecx, 16(%esp)\t\n");
Я обычно получаю значение, как 434, напечатанной вторым оператором печати. Однако после команды добавления он печатает 2. Если вместо этого я использую команду addl, он также печатает 2. Я использую последнюю стабильную версию xv6. Поэтому я действительно не подозреваю, что это проблема. Есть ли другой способ добавить два числа в встроенную сборку?
По сути мне нужно прирастить 16 (% ЭСП) на 4.
Отредактированный код:
__asm__("addl $8, 16(%esp)\t\n");
Помните, что 'printf' скорее всего изменяет регистр' esp'. Помните, что в C очистка стека выполняется вызывающим. Вы должны пройти через эту программу с помощью отладчика. –
Gdb не очень хорошо работает с xv6, поскольку gdb может только отлаживать ядро. Но это программа уровня пользователя. Таким образом, я не могу отличить от операторов печати отладки. – 1729
@MichaelWalz, который специально означает 'printf' делает ** не ** изменять' esp'. Но это может очень хорошо изменить 'ecx'. – Jester