【问题标题】:Minimal assembler program for CP/M 3.1 (z80)CP/M 3.1 (z80) 的最小汇编程序
【发布时间】:2012-09-03 09:36:14
【问题描述】:

我似乎正在与自己的愚蠢作斗争。

This site解释各种CP/M版本下的系统调用。

但是,当我尝试使用调用 2(C_WRITE,控制台输出)时,什么都没有发生。

我有以下代码。

ORG 100h
LD E,'a'
LD C,2
CALL 5
CALL 0

我在这里背诵这句话。如果有错别字,请放心,因为文件确实编译过,而且我有一个 COM 文件要启动,所以它们不在原始文件中。

我认为这些线条的含义如下:

  1. 确保它在地址 100h 加载(0h 到 FFh 是零页)。
  2. 将 ASCII 'a' 加载到系统调用 2 的 E 寄存器中。
  3. 将整数 2 加载到系统调用 2 的 C 寄存器中。
  4. 进行系统调用(到系统调用的 JMP 位于零页中的地址 5)。
  5. 结束程序(退出命令位于零页中的地址 0)。

程序启动和退出都没有问题。如果我删除最后一个命令,它会挂起计算机(我猜这也是预期的,并表明 CALL 0 有效)。

但是,它不打印 ASCII 字符。 (但它确实打印了一个额外的新行,但系统可能已经这样做了。)

如何让我的 CP/M 程序执行系统调用应该执行的操作?我做错了什么?

更新:问题是我尝试过的所有汇编程序都需要某种格式的源文件。此文件与 Microsoft 的宏汇编器一起使用:

        .Z80
START:  LD      E,'a'
        LD      C,2
        CALL    5
        JP      0

认为(我猜)asm.com(DR 的汇编程序)和 m80.com(微软的宏汇编程序)期待 Intel 8080 助记符,并且必须在他们必须期待 z80 时被告知助记符,显然是不同的。

无论如何我都会接受下面的答案,因为它也是正确的,因为它建议只需编写图像本身而不用担心 asm.com。

【问题讨论】:

  • 您是正确的,CP/M 本身会打印一个额外的新行。取出除CALL 0 之外的所有内容,亲自查看。
  • 顺便说一句 --- 我知道这有点像死神评论,但是嘿,CP/M,这是合适的 --- 你不必 JP 0 退出你的程序。如果您注意保存原始堆栈指针并且不覆盖任何 CCP 的存储,您可以直接返回到 shell。由于 CCP 不需要重新加载,因此对用户更加友好。
  • 谢谢。这是一个很好的提示。我还没有完成。

标签: z80 cpm


【解决方案1】:

明显的可能性:您的汇编程序是否将 'a' 视为十六进制而不是 ASCII 字符? 0xa 是换行的 ASCII。也许试试 'g' 或检查你的汇编输出的十六进制转储?

除此之外,您的代码看起来还不错,尽管 RST 0 会节省一些字节。

编辑:

我将您的代码手工组装到:

1e 61
0e 02 
cd 05 00
cd 00 00

我将它作为 mytest.com 保存到磁盘。然后我启动了this CP/M emulator(警告:这是一个直接的文件下载链接;仿真器的标题似乎是Joan Riff 的“Z80MU PROFESSIONAL”Z80 和 CP/M 2.2 仿真器,它本身已经有 20 多年的历史了所以似乎没有网页)用于 DOSBox 内的 DOS 并运行 mytest.com。它输出字母'a'。所以无论是你的工具链还是你的 CP/M 都有问题。

一张照片,因为它确实发生过:

【讨论】:

  • 我尝试给它一个 64 作为 at-sign。它仍然不打印任何东西。但我会研究这种可能性。是 CP/M 3.x 自带的 mac.com 汇编器。
  • 按照同样的思路,如果你打了两次电话,表面上是打印两件东西,输出会改变吗?
  • 我昨晚没看过这个,但这是个好主意。我今晚试试。塔。
  • 两次调用 5(和 E 中的一个新字符)完全相同
  • 还有一个问题——您是否尝试过直接调用 BIOS 函数 CONOUT 而不是通过 BDOS?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
相关资源
最近更新 更多