Я использую симулятор 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
Я попытался назвать asm-файл _foo.s, а в main.c изменил имя функции на _fib, но до сих пор не могу избавиться от этой ошибки.
Ваш файл .s не объявляет функцию. foo: это просто ярлык. Чтобы он отображался как связываемый символ, вам нужно будет добавить в файл некоторые дополнительные (специфичные для ассемблера) директивы.
cl65 -t sim6502 main.c _fib.s -o fib да, это компилирует C для 6502, github.com/cc65/cc65В foo.s вам просто нужно заменить foo: на _foo:, потому что функция foo на языке C конвертируется компилятором в символ _foo.
Это даже часть вступления cc65.github.io/doc/intro.html#ss1.2





Вам нужно экспортировать его из модуля сборки - с тем же оформлением, что и компилятор C:
_foo:
.export _foo
LDA #$00
STA $0200
Это связано с:
cl65 -t sim6502 main.c foo.s -o foo
Вам также может потребоваться изучить соглашения о вызовах.
просто оформленное имя в c должно точно соответствовать названному имени из как м. и наоборот. если вы используете
__cdeclв качестве соглашения о вызовах по умолчанию - оформленное (полное) имяfooбудет_foo- а в файле asm вам нужно использовать имя_fooвместоfoo. также имя должно быть публичным (видимым). ярлыка обычно нет. вам нужно объявить_fooкак публичный символ. или как функция (функции обычных публичных символов). однако это зависит от конкретного компилятора asm. теперь, когда вы строите - вы получили ошибку - неразрешенный внешний символ (я думаю,_foo) - именно это имя вы должны реализовать в asm