繁体   English   中英

C 编程如何在没有头文件的情况下工作?

[英]How does C programming work with no headers?

我熟悉 C 编程语言和 z80 程序集,我制作了一个简单的 z80“计算机”,只有带有 32k ram、32k rom 和 8255 pia 的 cpu 用于 io 控制。 我已经让 8255 通过汇编语言子程序在我的系统上点亮 LED。

所以问题是:如果有可以将 C 程序编译成包括 z80 在内的各种小型 CPU 的程序集的 SDCC(小型设备 C 编译器),如果没有 stdio 库或任何库,您如何创建 C 程序?因为这个系统是如何定制的。 我是否被迫先使用汇编,然后将函数作为 ASM 例程进行调用? 我是否误解了某种关键思想? 我很困惑这是如何工作的。 我不能在没有输出的系统上只使用 printf()。 更不用说 printf() 是在假设终端以某种方式连接的情况下进行的。

您将编写一个特定于平台的 I/O 库,该库利用您的平台可用的任何 I/O 功能。 在许多嵌入式系统上,在 UART 串​​行端口上实现了最小的标准 I/O,因此您的“控制台”可以是主机 PC 上的终端仿真器。

您的 I/O API 不需要像标准库的 stdio 那样复杂。 它也不需要用汇编程序编写,内存映射外设的寄存器级访问在 C 中是可能的(实际上是正常的) - 毕竟它是一种系统级语言。

尽管如此,SDCC 已经包含一个标准库子集,其中包含一个子集 stdio。 因此,您认为自己缺乏这种支持的原因尚不清楚。 您必须提供低级平台特定支持,但要支持printf您只需要实现putchar()在您选择的 stdout 设备上发出一个字符。 对于无缓冲的串行输出,这是相当微不足道的。 更复杂的实现可能使用中断驱动的缓冲串行输出。 SDCC 手册中描述了库的移植。

你是对的。 汇编例程包含实际的入口点,在那里完成内存初始化,然后该例程调用main()

sdcc/device/lib/z80/crt0.s包含 SDCC 提供的默认启动代码。

如果您的系统需要做的事情比所提供的要多,请参阅 SDCC 手册的第 3.12.3 节,了解如何提供您自己的内容。

至于printf() ,你只需要以某种方式提供putchar() 如果它只是某个设备的out指令,您也可以将其放入crt0.s中,如下所示:

    .area   _CODE
init:
    call    0x01B0 ; ROM_CLEAR_SCREEN    
    ;; Initialise global variables
    call    gsinit
    call    _main
_exit:
    call    0x0200 ; ROM_GET_KEY
    jr      z, _exit
    call    0x01B0 ; ROM_CLEAR_SCREEN
    ret
_putchar:
    ld      hl, #2
    add     hl, sp
    ld      a, (hl)
    out     (0xBC), a
    ld      hl, #0
    ret

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM