无法让 .define 与 sdasz80(sdcc 汇编器)一起工作
Can't get .define working with sdasz80 (sdcc assembler)
SDCC 的汇编程序源自 ASxxxx,其中手册在此处描述了 .define 命令:http://shop-pdp.net/ashtml/asxs02.htm#define
由于这是一个推导,所以可能并非所有事情都以相同的方式工作,但由于命令行参数帮助讨论了 .define(“-b 在列表中显示 .define 替换”),我假设它们在那里。
然而,当我这样做时:
.define ay /-1/
我收到错误:
g.s:1: Error: <o> .org in REL area or directive / mnemonic error
我尝试过的其他形式包括:
.define ay ^/-1/
.define ay "-1"
.define kword /foo/
所有这些都会导致相同的错误。如果我尝试
.define
错误变为:
g.s:1: Error: <q> missing or improper operators, terminators, or delimiters
虽然我在 .blarg
中遇到了同样的错误,所以关键字可能已被删除(为什么?)
是我做错了什么,还是 sdasz80 坏了?
糟糕,他们似乎出于某种原因删除了一项功能。
通过 SDCC 源的 github 镜像搜索(此处为 sdas 源:https://github.com/svn2github/sdcc/tree/master/sdcc/sdas)SDCC 的 asxxxx.h(最后编辑于 6 年前)有这个块:
/*
* The def structure is used by the .define assembler
* directive to define a substitution string for a
* single word. The def structure contains the
* string being defined, the string to substitute
* for the defined string, and a link to the next
* def structure. The defined string is a sequence
* of characters not containing any white space
* (i.e. NO SPACEs or TABs). The substitution string
* may contain SPACES and/or TABs.
*/
struct def
{
struct def *d_dp; /* link to next define */
char *d_id; /* defined string */
char *d_define; /* string to substitute for defined string */
int d_dflag; /* (1) .defined / (0) .undefined */
};
但据我所知,该结构并未在任何地方使用。
还要考虑到 SDCC 附带的 sdasz80 是旧版本的 ASxxxx。事实上,他们随 sdasz80 一起提供的文档是针对较新版本的 ASxxxx 的,有些功能实际上不存在于所提供的版本中。
如果您需要这些功能和更新的功能,您可以从其网站下载 ASxxxx 的更新版本。已经有许多更新的版本,包括新的有趣功能的文档。最新版本来自 2019 年 1 月:http://shop-pdp.net/ashtml/asxxxx.php
出于多种目的,您可以使用变量。这将适用于 sdasz80(SDCC 修订版)
SOME_IO_ADDRESS = 0x32
[...]
LD A, #0xAA
OUT (#SOME_IO_ADDRESS), A
SDCC 的汇编程序源自 ASxxxx,其中手册在此处描述了 .define 命令:http://shop-pdp.net/ashtml/asxs02.htm#define
由于这是一个推导,所以可能并非所有事情都以相同的方式工作,但由于命令行参数帮助讨论了 .define(“-b 在列表中显示 .define 替换”),我假设它们在那里。
然而,当我这样做时:
.define ay /-1/
我收到错误:
g.s:1: Error: <o> .org in REL area or directive / mnemonic error
我尝试过的其他形式包括:
.define ay ^/-1/
.define ay "-1"
.define kword /foo/
所有这些都会导致相同的错误。如果我尝试
.define
错误变为:
g.s:1: Error: <q> missing or improper operators, terminators, or delimiters
虽然我在 .blarg
中遇到了同样的错误,所以关键字可能已被删除(为什么?)
是我做错了什么,还是 sdasz80 坏了?
糟糕,他们似乎出于某种原因删除了一项功能。 通过 SDCC 源的 github 镜像搜索(此处为 sdas 源:https://github.com/svn2github/sdcc/tree/master/sdcc/sdas)SDCC 的 asxxxx.h(最后编辑于 6 年前)有这个块:
/*
* The def structure is used by the .define assembler
* directive to define a substitution string for a
* single word. The def structure contains the
* string being defined, the string to substitute
* for the defined string, and a link to the next
* def structure. The defined string is a sequence
* of characters not containing any white space
* (i.e. NO SPACEs or TABs). The substitution string
* may contain SPACES and/or TABs.
*/
struct def
{
struct def *d_dp; /* link to next define */
char *d_id; /* defined string */
char *d_define; /* string to substitute for defined string */
int d_dflag; /* (1) .defined / (0) .undefined */
};
但据我所知,该结构并未在任何地方使用。
还要考虑到 SDCC 附带的 sdasz80 是旧版本的 ASxxxx。事实上,他们随 sdasz80 一起提供的文档是针对较新版本的 ASxxxx 的,有些功能实际上不存在于所提供的版本中。
如果您需要这些功能和更新的功能,您可以从其网站下载 ASxxxx 的更新版本。已经有许多更新的版本,包括新的有趣功能的文档。最新版本来自 2019 年 1 月:http://shop-pdp.net/ashtml/asxxxx.php
出于多种目的,您可以使用变量。这将适用于 sdasz80(SDCC 修订版)
SOME_IO_ADDRESS = 0x32
[...]
LD A, #0xAA
OUT (#SOME_IO_ADDRESS), A