如何将参数从外部汇编器子例程传递回 cobol 程序?

2023-12-27

我试图从用汇编程序编写的外部子例程传回参数。调用例程是在 cobol 中,外部汇编例程的参数如下所示:

01  CALCSHRS-PARMS.
    05  CS-DEPOSIT-AMT      PIC 9(5)V99 COMP-3.
    05  CS-SHARE-PRC        PIC 9(3)V99 COMP-3.
    05  CS-SHARE-AMT        PIC 9(9)V99 COMP-3.

调用看起来像这样:

CALL 'CALCSHRS' USING CS-DEPOSIT-AMT
                      CS-SHARE-PRC
                      CS-SHARE-AMT.

该例程使用CS-DEPOSIT-AMT和CS-SHARE-PRC来计算CS-SHARE-AMT,需要将其传回。这是汇编程序:

CALCSHRS CSECT                                             
*                                                          
         PRINT NOGEN                                       
*                                                           
         STM   14,12,12(13)        SAVE ENTRY REGS         
         LR    12,15               SET BASE REG            
         USING CALCSHRS,12         ESTABLISH ADDRESSABILITY
*                                                          
         LA    14,SUBPSAVE         STANDARD                
         ST    13,4(,14)           SAVE                    
         ST    14,8(,14)           AREA                    
         LR    13,14               LINKAGE                 
*                                                          
         LM    2,4,0(1)            LOAD THE PARAMETERS                                                               
*                                                          
         ZAP   DEPOSITP,0(2,4)       GET THE DEPOSIT AMOUNT  
         ZAP   SHAREPCK,0(3,3)     GET THE SHARE PRICE     
*                                                          
         ZAP   SHARESP(9),DEPOSITP INITIALIZE SHARES       
*                                                          
         MP     SHARESP,=P'10000'     MULTIPLY BY 1000     
         DP     SHARESP,SHAREPCK     DIVIDE BY SHARE PRICE 
         ZAP    SHARESPR,SHARESP(6)  MOVE THE FIRST 5 BYTES
*                                                          
         SRP    SHARESPR(6),(64-1),5 SHIFT TO ROUND        
         SRP    SHARESPR(6),2,5      SHIFT AGAIN           
*                                                          
         MVC   0(6,4),SHARESPR     ME ATTEMPTING TO RETURN SHARESPR...                       
*                                                          
         L     13,4(,13)           STANDARD SAVE                    
         LM    14,12,12(13)        AREA LINKAGE                     
         SR    15,15               SET RETURN CODE TO 0             
         BR    14                                                   
*                                                                   
         LTORG                                                      
*                                                                   
SUBPSAVE DC    18F'0'                                               
*                                                                   
SHAREPCK DS    PL3                   SHARE PRICE PACKED             
DEPOSITP DS    PL5                   DEPOSIT IN PACKED DECIMAL      
SHARESP  DS    PL9                   SHARES  IN PACKED DECIMAL      
SHARESPR DS    PL6                   SHARES ROUNDED                 
*                                                                   
         END   CALCSHRS 

我只需要返回 SHARESPR 并将其放入我的 cobol 程序中的 CS-SHARE-AMT 中。其他一切都按照我想要的方式进行。有人知道我需要怎么做吗?任何帮助深表感谢。


事实证明,您可以使用 ZAP 将参数及其地址传递回寄存器。就我而言,CS-SHARE-AMT 位于寄存器 4 中,因此这就是我将 SHARESPR 从汇编代码传回调用 COBOL 程序的方式:

ZAP  0(6,4),SHARESPR(6)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将参数从外部汇编器子例程传递回 cobol 程序? 的相关文章

  • 为什么不能执行 mov [eax], [ebx] [重复]

    这个问题在这里已经有答案了 我可以做这个 mov eax ebx 和这个 mov eax ebx 甚至这个 mov eax ebx 但不是这个 错误C2415 mov eax ebx 只是wtf 为什么 它与 ptr1 ptr2 相同 为什
  • 从 Web 服务器异步调用应用程序

    我有一个用 Spring 制作的 在 Tomcat 上运行的 Web 应用程序 在同一台机器上有一个普通的 Java 应用程序 我想通过从Web服务器调用Java应用程序来执行它 但我想让应用程序不会使用服务器的资源 它涉及分类器的训练 因
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • ARMv8 A64 汇编中立即值的范围

    我的理解是 ARMv8 A64 汇编中的立即参数可以是 12 位长 如果是这样的话 为什么这行汇编代码是 AND X12 X10 0xFEF 产生此错误 使用 gcc 编译时 Error immediate out of range at
  • 使用 MIPS 从 Big Endian 到 Little Endian 无需逻辑运算?

    我正在使用 MIPS QtSpim 将 32 位字从 Big Endian 转换为 Little Endian 我下面显示的内容已检查且正确 不过我想知道还有什么其他方法可以让我进行转换 我虽然只使用了旋转和移位 但如果没有逻辑运算 我就无
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • 如何编译GCC生成的asm?

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • 是否可以从外部文件运行 openoffice 宏?

    我想从外部文件运行 OpenOffice 宏 喜欢 vlad leo soffice macro home vlad q vbs 并不是真正的答案 只是一个评论 以便提出这个问题 并希望得到答案 这可能与必须显式设置宏的权限有关 例如 编辑
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 如何使用 Bochs 运行汇编代码?

    我想使用 Bochs 作为 8086 模拟器 是否有捷径可寻 我想要的是类似 emu8086 的东西 http www emu8086 com http www emu8086 com 如果程序的初始部分适合 512 字节 并且您不介意将自
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 何时可以重用avx指令中的源寄存器

    在 avx 指令中用作源的寄存器何时可以在指令开始处理后重用 例如 我想使用vgatherdps该指令消耗两个 ymm 寄存器 其中之一是位移索引 我意识到vgatherdps由于数据的局部性较差 因此需要花费大量时间来收集 位移索引寄存器
  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中意味着什么?

    我想我明白 movzbl rdi rcx 1 ecx 意思是 将零扩展字节移至长整型 并表示将 ecx 扩展为 32 位 但我不完全确定语法 rdi rcx 1 指的是什么 我在某处看到该语法指的是 Base Index Scale 但我找
  • 无法识别的仿真模式:MinGW32 上的 elf_i386

    我正在尝试制作内核 但无法链接C与程序集一起输出 这ld 我收到错误 无法识别的仿真模式 elf i386 我正在使用 Windows 10 专业版以及 MinGW32 和 MSYS 我正在使用的代码 link ld link ld OUT
  • 将字段中的位扩展到掩码中所有(重叠+相邻)集位的最快方法?

    假设我有 2 个名为 IN 和 MASK 的二进制输入 实际字段大小可能是 32 到 256 位 具体取决于用于完成任务的指令集 每次调用时两个输入都会改变 Inputs IN 1100010010010100 MASK 000111101

随机推荐