CP / M 3.1(z80)的最小汇编程序

时间:2012-09-03 09:36:14

标签: z80 cpm

我似乎正在失去与我的愚蠢斗争。

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”加载到E寄存器中以进行系统调用2.
  3. 将整数2加载到C寄存器中以进行系统调用2.
  4. 进行系统调用(系统调用的JMP位于零页面中的地址5)。
  5. 结束程序(退出命令位于零页面中的地址0)。
  6. 程序启动和退出没有问题。如果我删除了最后一个命令,它会挂起计算机(我猜这也是预期的,并显示CALL 0有效)。

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

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

    更新:问题是我试过的所有汇编程序都期望源文件的某种格式。此文件适用于Microsoft的宏汇编程序:

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

    认为(我猜)asm.com(DR的汇编程序)和m80.com(微软的宏汇编程序员)期待英特尔8080助记符,必须告诉他们什么时候需要z80助记符,显然是不同的。

    我会接受下面的答案,因为它也是正确的,因为它建议只是自己编写图像而不用担心asm.com。

1 个答案:

答案 0 :(得分:3)

明显的可能性:你的汇编程序是'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个岁,所以似乎没有一个网页)DOS DOS内的DOS和运行mytest.com。它输出字母'a'。所以你的工具链或你的CP / M都有问题。

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

enter image description here