问题标签 [metalc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 在 Metal C 中使用 WTO 进行打印
我正在尝试使用 Metal C 中的 WTO 指令将“Hello World”打印到我的工作日志中。这是基于 z/OS V1R10.0 Metal C Programming Guide and Reference 的第 1.2.3.5 节中的示例当我使用 WTO 时出现的问题是我的缓冲区包含 0 或 ASCII 到 EBCDIC 转换。我在下面粘贴了我的工作日志的相关部分,然后是我的代码,然后是我无法编译的 IBM 示例中的代码。作业日志
我的代码
IBM 代码
c - Metal C中的memset问题
我正在尝试使用以下代码初始化 Metal C 环境,但在 memset 行上出现以下错误。ERROR CCN3275 IMIJWS0.METAL.SAMPLIB(MEM):6 遇到意外的文本')'。错误 CCN3045 IMIJWS0.METAL.SAMPLIB(MEM):6 未声明的标识符 ___MEMSET。ERROR CCN3277 IMIJWS0.METAL.SAMPLIB(MEM):6 语法错误:可能缺少 ')' 或 ','?CCN0793(I) 文件编译失败 //'IMIJWS0.METAL.SAMPLIB(MEM)'。未创建目标文件。下面是我的代码
c-preprocessor - 如何在 C 预处理器中参数化包含 # 的单个字符串?
我想为 IBM Metal C Prolog 创建参数化预处理器宏。
最初的未参数化形式是
#pragma prolog(Foo, " #MCPROLG MAIN=(YES,16,132)")
真正的序言更复杂,但为了这个问题,重要的部分是字符串中有值。
#pragma
指令本身不能成为宏的一部分,因此我将其替换为_Pragma
:
_Pragma("prolog(Foo, \" #MCPROLG MAIN=(YES,16,132)\")")
我可以像这样参数化 Foo :
如何创建参数化值 16 的宏?
看来我需要在预处理器中连接字符串,我尝试了以下方法。都使用这个字符串化宏:
替换为 16 的标记(让我们命名它
size
)不能在字符串本身内,因此它会被替换。#define PROLOG(function, size) _Pragma(STR(prolog( function , "#MCPROLG MAIN=(YES, size ,132)")))
_Pragma 只接受一个字符串,所以我不能像这样细读 C 字符串连接:
#define PROLOG(function, size) _Pragma(STR(prolog( function , " #MCPROLG MAIN=(YES," #size ",132)")))
我不能像这样对 prolog 的整个第二个参数进行字符串化:
#define PROLOG(function, size) _Pragma(STR(prolog( function , STR( #MCPROLG MAIN=(YES, size ,132)))))
因为#MCPROLG
需要保留在字符串中,以便其 # 不被视为字符串化标记。
zos - 参数传递——非标准联动
我是一名长期的汇编程序员,正在进入 Metal C 的世界。我是一个 C 新手,所以我的术语可能反映了我所知道的东西与我正在学习的东西。它肯定会影响我对事物的理解。
我正在尝试将新的 Metal C 代码插入到一些不一定遵循标准条目链接约定的旧组件中。
例如,服务例程将要处理的控制块的地址作为 R1 中的输入。我在关于参数传递的讨论和语言参考中的#pragma 链接讨论中查看了 Metal C 用户指南,似乎没有办法让编译器这样做。
本质上,我想声明一个由以下汇编程序调用的例程:
我意识到我可以采用上述方法,对其进行参数化并将其放入 __asm() 块中,但我希望程序尽可能“干净”。
谢谢,斯科特
附录 - 2019 年 9 月 26 日
为了回应 Mark Hiscock 在下面的回答,这样的 __asm() 块看起来像:
并且处理起来会简单得多(指令更少,没有绑定时间问题)。我真的在寻找能让编译器“做正确的事”的东西。
斯科特
xlc - 我该如何使用#include 来完成这项工作?直接放入代码中时效果很好
我有一个代码块,我想在我的 z/OS Metal C 程序中#include,当它只是程序的一部分时它工作正常,但是当我将它放入 .h 文件并#include 它时,代码赢了不编译。
我已经成功地让这段代码在没有#include 的情况下工作。我确定我忽略了与#include 相关的内容...
此代码有效:
给出如下所示的编译器输出:
但是,当我将代码放入这样的#include 文件时:
并将其包含在我的 Metal C 程序中:
我收到一堆错误消息:
c - 试图在 z/OS HLASM 和 XL C/C++ 金属 C 编译器之间制作“双语宏”
我试图弄清楚如何在单个数据集/文件中包含相同 DSECT/struct 的 HLASM 和 Metal C 定义。
在尝试此操作之前,我尝试了我在如何使用#include 进行这项工作中描述的内容?直接放入代码中时效果很好
所以,我走了另一条路,并想我可以使用#define 将汇编器中的 MACRO 语句更改为 C 编译器将使用的内容:
- 将“宏”更改为“#pragma margins(2,72)”
将“MEND”更改为“#pragma nomargins”
/li>
而且我认为我可以使用#define 将“MACRO”和“MEND”更改为 C 编译器想要的内容,首先我尝试不使用引号:
这没有产生预期的结果:
然后我尝试将#define 值括在引号中:
这提供了更少的错误消息,但仍然不是我需要的。
注意:我使用的 # 是 EBCDIC 7B。
错误消息的描述相当简洁:
CCN3191 字符 &1 不是有效的 C 源字符。说明 有关有效字符的信息,请参阅 C/C++ 语言参考。
在消息文本中:
&1 是一个字符。
用户响应 更改字符。
我参考了 C/C++ 语言参考,但找不到任何说明我不能在#define 中使用“#”的内容。事实上,关于 # 和 ## 运算符有一些话......
有没有办法解决这个问题?
谢谢,斯科特
zos - IBM z/OS Metal C - 我可以创建一个包含 #pragma 语句的 #define 宏吗?
-- 更新 20200114:#define Entry 宏和新结果的新版本
另一个新手问题在这里。我正在尝试创建一个#define 宏,我可以使用它来生成例程的条目以及它的#pragma prolog() 和#pragma epilog():
我尝试了以下几种变体(这代表了今天的尝试):
预处理器似乎无法完成这项工作。宏通过以下方式调用:
编译器会弹出以下内容:
编译器发出以下消息:
关于如何查看“已解决”#pragmas 的样子或它们有什么问题的任何想法?
谢谢,斯科特·法根
assembly - 仅当我使用自己的 prolog/epilogs 时 z/OS Metal C assemble 才会失败
我有一个 Metal C 程序,我试图通过 __asm(“...” : DS(staticdata)) 语句添加一些静态数据,但生成的汇编代码存在一些问题。
当我使用自己的序言和结语代码时,我得到:
记录 944 是“&MSIZE SETA @@LAB@3L”。
当我删除模块中各种例程的序言和结语的#pragmas 时,我得到了非常相似的代码,但它组装得很干净(为了方便起见,我重命名了程序):
无论出于何种原因,生成的 DS 使用 @@LAB@5,但“&MSIZE SETA @@LAB@5L”在这里组装没有错误。奇怪,因为第一个程序中的 @@LAB@3L 和第二个程序中的 @@LAB@5L 计算结果相同:
当我比较这两个片段时(我删除了右侧的十六进制偏移和序列信息),这就是我得到的:
片段完全相同,除了标签不同。
关于我可以在我的序言和结语中的任何一个/两个中所做的任何想法都会扰乱汇编程序导致此错误。
谢谢,斯科特
zos - 有没有办法让 IBM XL C/C++ Compiler, Metal Option 在全局范围内做一个 __asm DS 声明_NOT_ 是一个 EXTERNAL?
我在我的程序的全局范围内创建了几个类似(但不相同)的 WTO 宏列表形式的调用:
(是的,我知道一个在汇编语句声明中有标签,一个没有,这两种方式似乎都无关紧要)。
当它被编译时,编译器会发出关于这些变量的信息:
加上这个错误信息:
(请注意,如果删除其中一个声明,它可以正常工作)。
如果我理解正确,编译器会将名称缩短为八个字符(我没有使用 GOFF),因此这两个字符都与名称 XXXUTILS 发生冲突。
我知道我可以通过在声明中添加“静态”来防止全局范围内的其他类型的声明成为外部声明,例如
我在Inline 汇编语句(IBM 扩展)上花了一些时间,但不知道如何以某种方式将“静态”一词压缩到 __asm 语句中,或者是否有其他方法可以做到这一点。
有人对如何做到这一点有任何想法吗?
谢谢你,斯科特·法根