一种在 C 中转换为 ASCII的扩展,我想知道在 PIC18X 上究竟是如何处理除法的。
如果我执行 DIV 操作,编译器会将其解释为多少条指令?操作完成需要多少个时钟周期?时钟周期数是否取决于我的被除数、除数或两者?
作为一个不太重要的附带问题:第一个包含专用划分硬件的 CPU 是什么?
一种在 C 中转换为 ASCII的扩展,我想知道在 PIC18X 上究竟是如何处理除法的。
如果我执行 DIV 操作,编译器会将其解释为多少条指令?操作完成需要多少个时钟周期?时钟周期数是否取决于我的被除数、除数或两者?
作为一个不太重要的附带问题:第一个包含专用划分硬件的 CPU 是什么?
通常,DIV 操作的周期数会有所不同(数据表通常会提供最大周期数)。体面的编译器并不真正关心指令需要多少个周期,而是进行各种优化(即,除以 2 的幂作为移位处理)。
您可能想查看此网站以了解 PIC 的各种例程。
取决于可变长度。查看 Microchip 网页:AN614
从 AN614...
Clocks
FXD3232S 630 32 bit/32 bit -> 32.32 signed fixed point divide
FXD3232U 683 32 bit/32 bit -> 32.32 unsigned fixed point divide
FXD3231U 588 32 bit/31 bit -> 32.31 unsigned fixed point divide
FXD3131U 579 31 bit/31 bit -> 31.31 unsigned fixed point divide
FXD3224S 529 32 bit/24 bit -> 32.24 signed fixed point divide
FXD3224U 584 32 bit/24 bit -> 32.24 unsigned fixed point divide
FXD3223U 489 32 bit/23 bit -> 32.23 unsigned fixed point divide
FXD3123U 481 31 bit/23 bit -> 31.23 unsigned fixed point divide
所以对于 32bit/32bit 需要 630 个 CPU 周期。
这些天来,编程中的分歧是松散的,但我仍然对他们做很多微控制器项目很敏感。从一张照片开始,您已经将一只手和一条腿绑在背后,做一个分割是可怕的。我试图在 PIC16 上做同样的事情(二进制到 ascii 十进制),这很痛苦。所以我的自制车速表要么是十六进制的,要么我做了一个丑陋的 if-then-else 树。这张图片的免费 C 编译器当时不可用。
无论如何,8086有一个分歧。8085似乎没有。但是 ENIAC 做到了,并且出现了平方根。现在,该 alu 是否算作 CPU 以满足您的“第一个带有除法的 CPU”的要求?早于 ENIAC 的机械机器也可以分裂。PDP-11 似乎没有。在 z80/8080 上没有看到,在 6502 上没有。6800 没有,但 68000 是的。8051 是的,令人惊讶的是 8031。一些较旧的,特别是我知道的 6502、8088/86,有 BCD 数学。因此,与其用二进制进行数学运算,然后尝试将一堆除以 10 以输入人类十进制 ascii 格式,不如从一开始就用 bcd 进行数学运算,然后更多的是转换为没有大写的十六进制字母,右移 4 和 0xF 加 0x30,用 0xF 加 0x30,重复。