Есть ли способ вызвать код сборки 6502 из файла C?

Я использую симулятор cc65 6502, который компилирует код для 6502. Я хочу связать код 6502 и код C и создать двоичный файл, который я могу выполнить.

Мой код C "main.c":

 #include<stdio.h>
 extern void foo(void);

 int main() {
    foo();
    return 0;
 }

Мой код 6502 "foo.s":

 foo:
      LDA #$00
      STA $0200

Код может показаться очень простым, но я просто пытаюсь добиться успешного связывания. Но я не могу избавиться от следующей ошибки:

Unresolved external '_foo' referenced in: main.s(27) ld65: Error: 1 unresolved external(s) found - cannot create output file

просто оформленное имя в c должно точно соответствовать названному имени из как м. и наоборот. если вы используете __cdecl в качестве соглашения о вызовах по умолчанию - оформленное (полное) имя foo будет _foo - а в файле asm вам нужно использовать имя _foo вместо foo. также имя должно быть публичным (видимым). ярлыка обычно нет. вам нужно объявить _foo как публичный символ. или как функция (функции обычных публичных символов). однако это зависит от конкретного компилятора asm. теперь, когда вы строите - вы получили ошибку - неразрешенный внешний символ (я думаю, _foo) - именно это имя вы должны реализовать в asm

RbMm 03.09.2018 03:22

Я попытался назвать asm-файл _foo.s, а в main.c изменил имя функции на _fib, но до сих пор не могу избавиться от этой ошибки.

Milap Jhumkhawala 03.09.2018 03:44

Ваш файл .s не объявляет функцию. foo: это просто ярлык. Чтобы он отображался как связываемый символ, вам нужно будет добавить в файл некоторые дополнительные (специфичные для ассемблера) директивы.

Mark Bessey 03.09.2018 03:55
cl65 -t sim6502 main.c _fib.s -o fib да, это компилирует C для 6502, github.com/cc65/cc65
Milap Jhumkhawala 03.09.2018 04:59

В foo.s вам просто нужно заменить foo: на _foo:, потому что функция foo на языке C конвертируется компилятором в символ _foo.

Laurent H. 03.09.2018 21:40

Это даже часть вступления cc65.github.io/doc/intro.html#ss1.2

Polluks 26.11.2018 10:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
6
740
1

Ответы 1

Вам нужно экспортировать его из модуля сборки - с тем же оформлением, что и компилятор C:

_foo:
.export _foo
      LDA #$00
      STA $0200

Это связано с:

cl65 -t sim6502 main.c foo.s -o foo

Вам также может потребоваться изучить соглашения о вызовах.

Другие вопросы по теме