查看上一个主题 :: 查看下一个主题
|
作者 |
信息 |
第75章
活跃用户
已加入:2014年6月9日 帖子:119 位置:CT
|
|
|
|
嗨,专家们,
我们是否需要BALR 12,0 的可寻址性,或者只使用USING就可以了?
我看到代码写成
据我所知,USING告诉扰码器将使用哪个基址寄存器和地址来计算目标代码,并且BALR在运行时将地址传递给寄存器。我只是感到困惑,因为程序应该加载到内存中的任何位置,为什么需要BALR分配地址进行注册?
我试着只写简单的代码几行而中止0C4,不知道为什么?
对不起,新手问题。
码: |
巴尔R 12,0
使用方式 *,12
MOVE MVC NUM1,NUM2
NUM1 DC CL5'ABCDE'
NUM2 DC CL3'FGH'
NUM3 DC CL4'IJKL'
结束 |
|
|
回到顶部 |
|
 |
比尔·奥博伊尔
CICS 主持人

已加入:2008年1月14日 帖子:2504 地点:美国乔治亚州亚特兰大
|
|
|
|
之所以得到S0C4,是因为您的常量在逻辑流程中,而汇编程序不知道这一点。
您需要将常量分支到可执行指令。
但是您的程序需要做更多的工作。
嗯... |
|
回到顶部 |
|
 |
史蒂夫·迈尔斯
活跃的成员
已加入:2013年11月30日 帖子:870 地点:宇宙
|
|
|
|
使用方式汇编程序指令是您(程序员)向汇编程序保证您(程序员)将在寄存器中插入地址。例如 -
码: |
MYPGM CSECT
SAVE (14,12),,*
BALR 12,0
USING *,12
AP NUM1,NUM2
RETURN (14,12),RC=0
NUM1 DC PL5'25000'
NUM2 DC PL3'12512'
END ,
|
在此程序中,您已经将地址存储到寄存器中。汇编器生成-
码: |
Loc Object Code Addr1 Addr2 Stmt Source Statement
000000 00000 00028 1 MYPGM CSECT
2 保存 (14,12),,*
000000 47F0 F00A 0000A 4+ B 10(0,15)
000004 05 5+ DC AL1(5)
000005 D4E8D7C7D4 6+ DC CL5'MYPGM'
00000A 90EC D00C 0000C 7+ STM 14,12,12(13)
00000E 05C0 8 巴尔R 12,0
R:C 00010 9 使用方式 *,12
000010 FA42 C010 C015 00020 00025 10 AP NUM1,NUM2
11 返回(14,12),RC=0
000016 98EC D00C 0000C 13+ LM 14,12 ,12(13)
00001A 41F0 0000 00000 14+ LA 15,0(0,0)
00001E 07FE 15+ BR 14
000020 000025000C 16 NUM1 DC PL5'25000'
000025 12512C 17 NUM2 DC PL3'12512'
18 结束 , |
程序员,USING语句为您提供了便利。没有USING语句和其他Assembler辅助工具,您将编写-
码: |
MYPGM CSECT
DC X'FA42F00AF00F'
DC X'1BFF'
DC X'07FE'
DC X'000025000C'
DC X'12512C'
END , |
而不是 -
码: |
MYPGM CSECT
AP NUM1-MYPGM(5,15),NUM2-MYPGM(3,15)
SR 15,15
BR 14
NUM1 DC PL5'25000'
NUM2 DC PL3'12512'
END , |
要么
码: |
MYPGM CSECT
USING *,15
AP NUM1,NUM2
SR 15,15
BR 14
NUM1 DC PL5'25000'
NUM2 DC PL3'12512'
END , |
您想写哪一个?我花了7年的时间编写与AMASPZAP控制语句等效的第一个示例,但这并不令人欣慰-而且容易出错! |
|
回到顶部 |
|
 |
第75章
活跃用户
已加入:2014年6月9日 帖子:119 位置:CT
|
|
|
|
嗨,史蒂夫,
谢谢您的回答。对于使用指令,我认为我可以理解它是什么或为什么需要它。但是我的问题是我不知道我们真的需要 巴尔R 12,0 与*,12一起使用? |
|
回到顶部 |
|
 |
威利·詹森(Willy Jensen)
活跃用户

已加入:2015年9月1日 帖子:416 地点:丹麦
|
|
|
|
如果在调用时r12包含程序的地址,则为否-但通常不是这种情况。良好的做法是在程序开始时自行设置一个基本寄存器。 R15应该包含您的程序的地址,但是r15被某些宏和程序调用所更改,因此通常认为使用起来不安全。因此使用r12。 |
|
回到顶部 |
|
 |
史蒂夫·迈尔斯
活跃的成员
已加入:2013年11月30日 帖子:870 地点:宇宙
|
|
|
|
为了使USING有用,必须将地址放入寄存器中。
码: |
MYPGM CSECT
USING 工作区域,11
USING *,12
SAVE (14,12)
LR 12,15
GETMAIN R,LV=WASIZE
LR 11,1
...
USING 记录,10
GET ADCB
LR 10,1
...
办公区
...
ADCB DCB DSORG = PS,MACRF = GL,...
等待 EQU *-WORKAREA
...
记录 DSECT
... |
在这种相当典型的安排中,有3条USING语句可以覆盖3个不同的存储区域。- 寄存器12定义了程序区域的可寻址性。该地址从寄存器15开始,然后被复制到寄存器12。这遵循如下约定:调用程序时,其地址存储在寄存器15中,并通过BALR 14,15实现对程序的传输。也可能是BALR 12,0 / 使用方式 *,12,其中BALR将地址存储在寄存器中。
- 寄存器11定义了WORKAREA DSECT定义的工作区的可寻址性。该地址由GETMAIN宏获取,并复制到寄存器11。
- 寄存器10定义了对数据记录的可寻址性。 得到 宏将记录地址存储在寄存器1中,程序将地址复制到寄存器10中。
我的许多大型程序都是这样构造的-
码: |
MYPGM CSECT
USING 工作区域,11
USING *,12
SAVE (14,12)
LR 12,15
BAL 11,*+L'*+4
DC AL4(WORKAREA)
L 11,0(,11)
...
USING 记录,10
GET ADCB
LR 10,1
...
工作区
...
ADCB DCB DSORG = PS,MACRF = GL,...
...
记录 DSECT
... |
这会将程序文本与工作区文本分开。在-
码: |
BAL 11,*+L'*+4
DC AL4(WORKAREA)
L 11,0(,11) |
- 巴尔机器指令将工作区地址的地址存储在寄存器11中。
- DC汇编程序指令指定工作区的地址。
- L机器指令加载工作区的地址。
|
|
回到顶部 |
|
 |
比尔·奥博伊尔
CICS 主持人

已加入:2008年1月14日 帖子:2504 地点:美国乔治亚州亚特兰大
|
|
|
|
抬头-
对于需要寻址(或可能不需要寻址)的符合HLL / LE的调用者的“ CEECAA”(可能不是)的汇编器子程序(不是MAIN)C ommon A 锚 Area),请不要使用R12,因为 民航局 是 总是 基于呼叫者的R12。只需将R12留空以防万一并选择另一个寄存器(IE:R3)。
嗯... |
|
回到顶部 |
|
 |
史蒂夫·迈尔斯
活跃的成员
已加入:2013年11月30日 帖子:870 地点:宇宙
|
|
|
|
O'Boyle先生的评论适用于预期在LE非XPLINK环境中运行的程序,该环境不适用于独立的Assembler程序。与不兼容LE XPLINK的程序相同,不兼容LE的XPLINK程序是一个完全不同的主题。 |
|
回到顶部 |
|
 |
第75章
活跃用户
已加入:2014年6月9日 帖子:119 位置:CT
|
|
|
|
布拉 12,0 会将指令地址计数器复制到寄存器12中,该寄存器将是CPU执行的下一个指令地址。按照标准规则,R15是程序的入口点。
将与
??基址寄存器R12中的地址与上面两个代码中的地址相同吗?
谢谢 |
|
回到顶部 |
|
 |
威利·詹森(Willy Jensen)
活跃用户

已加入:2015年9月1日 帖子:416 地点:丹麦
|
|
|
|
不。
L 12,15将尝试向r12加载存储地址x'15'的内容。在较旧的计算机中,如果对齐不正确,其本身将产生错误“ x15”。正确的指示是:
LR 12,15 ,它将r15的内容复制到r12。
但是,然后您必须使用using指定程序的启动。您的USING将使样本中的Regreg分别从位置2和4覆盖,并且r15指向位置0。我分别说位置2和4,因为'balr'的长度为2个字节,'l'的长度为4个字节。
所以像这样:
MYPROG 中科院
LR 12,15
使用MYPROG,12
但是在我看来,您确实需要一个汇编程序课程,因为我们甚至都没有提到其他必要的东西,例如链接约定。 |
|
回到顶部 |
|
 |
第75章
活跃用户
已加入:2014年6月9日 帖子:119 位置:CT
|
|
|
|
谢谢威利。我的意思是LR 12,15,这是错字。
以下两个代码应具有相同的功能以提供可寻址性,并且两个代码在R12中的地址应相同,对吗?
码: |
MYPROG CSECT
LR 12,15
使用MYPROG,12 |
和
码: |
MYPROG CSECT
巴尔R 12,0
使用MYPROG,12 |
是的,我现在真的在学习。 |
|
回到顶部 |
|
 |
史蒂夫·迈尔斯
活跃的成员
已加入:2013年11月30日 帖子:870 地点:宇宙
|
|
|
|
不,我认为您没有学到任何东西。
在
码: |
MYPGM CSECT
USING *,12
SAVE (14,12)
LR 12,15 |
寄存器12的地址为MYPGM,因为这就是寄存器15中的地址。
在
码: |
MYPGM CSECT
SAVE (14,12)
BALR 12,0
USING *,12 |
寄存器12的地址将大于MYPGM的地址。更大的数量取决于SAVE宏中的指令数量,以及BALR指令的另外2个字节。在这两个示例中,输入寄存器均已保存 之前 LR或BALR指令更改的寄存器12。 |
|
回到顶部 |
|
 |
|
 |
查看书签
所有时间均为格林尼治标准时间+ 6小时 |
|