[英]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.