在z/OS Assembly中,将字节转换为它的位表示的最佳方法是什么?
例如,X '3A'变成CL 8 '00111010',类似于COBOL或Rexx'X2 B?
我在汇编中得到的是Map到两个表,每个表都是可能的,像这样:
...
SR R1,R1
IC R1,BYTE
IC R1,HEXTAB(R1)
LA R1,BITTAB(R1)
MVC BITS,0(R1)
...
*
BYTE DC X'3A'
BITS DS CL8
HEXTAB DC X'0001020903110A19042112290B311A39'
DC X'05412245134D2A550C5D32651B6D3A75'
DC X'06264262237D468514804E8D2B95569D'
DC X'0D495EA533A966B11C886EB93BC176C9'
DC X'071727374353637324837E9B47AF86C7'
DC X'155181AD4FD18ED32C9096DB57D59EE3'
DC X'0E2E4A6A5F92A6BE3498AAE067DDB2EB'
DC X'1D5989B56FD7BAF33CA0C2EE77E5CAF7'
DC X'FF0810182028303840444C545C646C74'
DC X'25617C847F8C949C48A4A8B087B8C0C8'
DC X'16365272829AAEC650ACD0D28FDAD4E2'
DC X'2D6991BD97DFDCEA58B4D6F29FEDE4F6'
DC X'FE0F1F2F3F4B5B6B607B8B93A3A7B7BF'
DC X'357199C5ABCFD9E168BCDEE9B3F1ECF5'
DC X'FD1E3E5A7A8AA2B670C4CED8BBE8F0F4'
DC X'FC3D79A1C3CDE7EFFB78CCE6FACBF9F8'
BITTAB DC C'00000000100000011000001010000011'
DC C'10000100100001011000011010000111'
DC C'10001000100110001010100010111000'
DC C'11001000110110001110100011111001'
DC C'00101001001110010101100101101001'
DC C'01111001100110101001101110011101'
DC C'10011110100111111010101011101011'
DC C'01101011111011011110111011111111',C'0000000'
但这需要两个令人讨厌的大表的相应表示。
有没有更有效或更简洁的方法来做到这一点?
2条答案
按热度按时间cngwdvgl1#
我使用
UNPK
将半字节隔离为一个字节,而不是使用一个包含所有可能位值的大表。这使我可以AND
离开区域部分,然后使用剩余的半字节作为偏移量进入本地数组字符串,该字符串为4字节长,表示半字节的二进制值。这是第一次,但这是我的第一个想法。如果我真的这样做,我可能会使用
EX
指令和TM
来测试每个位,并简单地将'1'或'0'添加到字符位表示中。它将保存另一个字符数组。为了使它更有用,可以优化它以接收3个参数,即源字符串,其长度和指向输出缓冲区的指针。使整个事情可重入,就不需要本地存储。
我认为这符合你的挑战。
测试字符串为
C"123ABC"
,输出结果为vhmi4jdf2#
这也可以通过使用SLL将八位中的每一位移动到寄存器的高阶位来实现。LTR可用于检查寄存器是否为负(高位= 1)。