Вызов функции C из ассемблера x86 - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь написать функцию, которая преобразует десятичные числа в двоичные в ассемблере. Поскольку там очень сложно печатать, я решил создать в С отдельную функцию, которая просто печатает цифры. Но когда я запускаю код, он всегда печатает «0110101110110100»

Вот функция C (и печать, и преобразование):

void printBin(int x) {
  printf("%d", x);
}

void DecToBin(int n)
{
    // Size of an integer is assumed to be 16 bits
    for (int i = 15; i >= 0; i--) {
        int k = n >> i;
        printBin(k & 1);
}

вот код в asm:

.globl _DecToBin
.extern _printBin

_DecToBin:
  pushl %ebp
  movl %esp, %ebp

  movl 8(%ebp),%eax
  movl $15, %ebx
  cmpl $0, %ebx
  jl end

  start:
  movl %ebx, %ecx
  movl %eax, %edx
  shrl %cl, %eax
  andl $1, %eax
  pushl %eax
  call _printBin
  movl %edx, %eax
  dec %ebx
  cmpl $0, %ebx
  jge start

  end:

  movl %ebp, %esp
  popl %ebp
  ret

Не могу понять, где ошибка. Любая помощь будет оценена

дизассемблированный код с помощью онлайн-программы

1 Ответ

0 голосов
/ 04 мая 2018

Ваша принципиальная проблема в том, что очень маловероятно, что% edx сохраняется при вызове функции printBin. Кроме того:

% ebx не является энергозависимым регистром в большинстве (любых?) Правил соглашения о вызовах C. Вам необходимо проверить документацию компилятора и соответствовать ей. Если вы собираетесь использовать ebx, вам нужно сохранить и восстановить его.

Указатель стека должен быть выровнен до 16 байтов. На моей машине (macos) это SEGVs в printBin, если вы этого не сделаете.

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