Подпрограмма asm, обрабатывающая int и char из файла c ++ - PullRequest
1 голос
/ 02 октября 2009

как int и char обрабатываются в подпрограмме asm после соединения с программой на c ++? например extern "C" void LCD_ byte (символьный байт, int cmd_ data); как LCD_ байт обрабатывает "байты" и "данные cmd_"? как получить доступ к «байту» и «данным cmd_» в коде сборки?

Ответы [ 3 ]

2 голосов
/ 02 октября 2009

Это очень сильно зависит от используемого вами микропроцессора. Если это x86, char будет расширен до int, и тогда оба параметра будут переданы в стек. Вы можете выяснить это, скомпилировав код C, который выполняет вызов в код сборки, и проверить код сборки.

Например, учитывая

void LCD_byte (char byte, int cmd_data);

void foo()
{
   LCD_byte('a',100);
}

gcc генерирует на x86 Linux код

foo:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        movl    $100, 4(%esp)
        movl    $97, (%esp)
        call    LCD_byte
        leave
        ret

Как видите, оба значения помещаются в стек (так что «а» вверху), затем выполняется инструкция вызова для целевой подпрограммы. Поэтому целевая подпрограмма может найти первый входящий параметр в esp + 4.

1 голос
/ 02 октября 2009

Ну, многое зависит от соглашения о вызовах, которое, в свою очередь, AFAIK, зависит от компилятора.

Но в 99,9%% случаев это одна из двух вещей. Либо они передаются в регистрах, либо помещаются в стек и возвращаются обратно в функцию.

0 голосов
/ 02 октября 2009

Посмотрите документацию для вашей платформы. Он сообщает вам, какое соглашение о вызовах используется для C.

Соглашение о вызовах определяет, как передаются параметры, какие регистры сохраняются вызывающими, а какие сохраняются вызываемые, как хранится адрес возврата и все остальное, что вам нужно для правильной реализации функции, которая может вызываться из C. ну и все что нужно для правильного вызова функции C)

...