IBM汇编程序中的位移

时间:2015-04-28 20:37:50

标签: assembly bit-manipulation mainframe

在IBM OS / 390程序集中,我尝试执行以下操作:

我有一组以2个零结尾的位:

00xxxxxx 00yyyyyy 00zzzzzz

我想将它们压缩成以下格式:

xxxxxxyy yyyyzzzz zz...

我认为订单会像

ICM  R7,B'1111',FIRSTBUF       LOAD 4 BYTES FROM FIRSTBUF INTO REGISTER 7
SLL  R7,2                      SHIFT ALL BITS LEFT BY 2
STCM R7,B'1000',FINALBUF       PASTE THE LEFTMOST BYTE ONLY
SLL  R7,2                      SHIFT ALL BITS LEFT BY 2
(somehow overwrite only the rightmost 2 bits of the leftmost byte)
STCM R7,B'0100',FINALBUF       PASTE SECOND LEFTMOST BYTE
SLL  R7,2                      SHIFT ALL BITS LEFT BY 2
(somehow overwrite only the right 4 bits of the second byte)
STCM R7,B'0010',FINALBUF       PASTE SECOND RIGHTMOST BYTE
SLL  R7,2                      SHIFT ALL BITS LEFT BY 2
....

我在这里走在正确的轨道上吗?

5 个答案:

答案 0 :(得分:2)

我知道您在询问OS / 390架构。但是,如果您在z10或更高版本的计算机上运行,​​则旋转并插入选定的位(RISBG)可能会有所帮助。

答案 1 :(得分:1)


ICM  R7,B'1111',FIRSTBUF       LOAD 4 BYTES FROM FIRSTBUF INTO REGISTER 7

SLL  R7,2       ; Shift away zeros
LR   R8,R7       ; Move to a work register
AND  R8, 0x3F   ; Clear out extra bits.
; First Character complete.

SLL  R7,8       ; Remove 1 character and lower 2 bit 0s by shifting away.
LR   R9,R7       ; Move to another work register
AND  R9, 0x3F    ; Clear out extra bits.
SLL  R9, 6       ; Shift up to proper location
O    R8, R9      ; Drop it in
; Second Character complete.

SLL  R7,8       ; Remove 1 character and lower 2 bit 0s by shifting away.
LR   R9,R7       ; Move to register
AND  R9, 0x3F    ; Clear out extra bits.
SLL  R9, 14      ; Shift up to proper location
O    R8, R9      ; Drop it in
; Third Character complete.

SLL  R7,8        ; Remove 1 character and lower 2 bit 0s by shifting away.
LR   R9,R7       ; Move to register
AND  R9, 0x3F    ; Clear out extra bits.
SLL  R9, 22      ; Shift up to proper location
O    R8, R9      ; Drop it in

; And so on until you want to store the result, or your holder register is full.

之前我没有在这个汇编程序中编码,但是一个汇编程序与另一个汇编程序非常相似,上面应该通过按位和/或与移位相结合来演示位操作的思想。它还通过不经常将数据写入存储器来缓冲I / O,而是使用寄存器来加速。

祝你好运!

答案 2 :(得分:1)

我认为你已经在房子周围走了一段路。

BUF01    DS    CL4                First data location
...
BUF02    DS    CL4                Second data location
...
BUF03    DS    CL4                Third data location
...
FINBUF   DS    0CL9               Final location
FINB01   DS    CL3                First final part
FINB02   DS    CL3                Second final part
FINB03   DS    CL3                Third final part

         L     R7,BUF01          Load first data to available gp register    
         STCM  R7,B'0111',FINB01 Store low-order three where needed

         L     R7,BUF02          Load second data to available gp register    
         STCM  R7,B'0111',FINB02 Store low-order three where needed

         L     R7,BUF03          Load third data to available gp register    
         STCM  R7,B'0111',FINB03 Store low-order three where needed
         ETVOILA                 Required data arrives at this point in FINBUF

如果您的数据(或任何数据)恰好位于寄存器中,请丢弃LOAD并将R7更改为相应的寄存器。

您在问题中使用的ICMB'1111'的优势在于它设置了条件代码,而LOAD则没有。如果你不需要CC,那么ICM比LOAD慢,所以你不能使用它。

这里,盲目地将四个字节加载到寄存器,然后存储低阶三个没有问题。可能有很多变化,但除了简单之外没有理由保留它。

将整个四个字节加载到寄存器中。由于掩码为B< 0111',因此只有寄存器的三个低位字节存储在存储器中。来自寄存器的对应于掩码中的1的任何字节将从第二个操作数的地址开始连续存储。你只需要不存储第一个字节就可以获得连续的9个字节。不需要转移然后合并。

以下是对掩码下存储字符(STCM)指令的解释摘录,来自第7章通用指令的第313页(来自z / OS 2.1 元素和功能页面链接到文档) z / Architecture操作原理,这是大型机汇编程序的参考指南。

  

在掩码的控制下从通用寄存器R(1)中选择的字节是   放在从第二个操作数开始的连续字节位置   地址。

     

M(3)字段的内容用作a   面具。从左到右的这四个比特对应于四个   通用寄存器R(1)的从左到右的字节。对于商店字符   在掩模(STCM,STCMY)下,掩模位对应的四个字节>通用寄存器R(1)的位位置32-63 ...字节   相应   掩码中的那些在连续的时候以相同的顺序放置   从第二个操作数地址开始的连续存储位置。   当掩码不为零时,第二个操作数的长度相等   到掩码中的那些数量。一般的内容   寄存器保持不变。

请注意,您的CPU可能不是最新版本,但您问题中所有说明的说明和使用方法都是相同的。询问您的技术支持您应该使用哪种POP(操作原理)来匹配您的实际CPU。

答案 3 :(得分:1)

作为一个顽固的装配爱好者,我将在上面的例子中略微改变......

首先,如果你有可用的寄存器并且可以安排原始值在存储器中相邻,那么一个简单的LOAD MULTIPLE(LM Rx,Ry,数据)和三个STORE CHARACTERS MASER MASK(STCM)就可以了。共有四条说明。

但是后来我发现用一条使用TRANSLATE(TR)的指令可以做到更好的方法:

IN1    DC  A(0)                      <- Input fields...they must be contiguous   
IN2    DC  A(0)
IN3    DC  A(0)
     . . .
TARGET DC  XL9'010203050607090A0B'   <- Note the pattern
     . . .
       TR  TARGET,IN1                <- Magic!

TRANSLATE指令使用第二个操作数作为查找表替换目标中的值。虽然这最常用于将ASCII转换为EBCDIC之类的东西,但它也可用于重新排列&#34;数据,就像原始海报想要的那样。 TR取第一个字节(X&#39; 01&#39;),按此数量索引到第二个操作数,并用它找到的任何内容替换输入中的值。当指令完成时,TARGET字段包含所要求的内容 - 这种方法仅消耗单个CPU指令。

我很少能够展示我对大型机汇编程序的了解,所以感谢给我机会!

答案 4 :(得分:0)

* ASSUME R1 -> TWO ENTRY PARM LIST
* PARM ONE -> 4 BYTES WITH BITS = 00XXXXXX 00YYYYYY 00ZZZZZZ ...
* PARM TWO -> 4 BYTES TO RECEIVE BITS = XXXXXXYY YYYYZZZZ ZZ000000 ...
U3856804 CSECT
         SAVE (14,12) "STM 14,12,12(13)"
         USING U3856804,15
         LM 14,15,0(1) R14 -> PARM ONE, R15 -> PARM TWO
         IC 0,0(14)    R0 LOW-ORDER BYTE = 00XXXXXX
         IC 1,1(14)    R1 LOW-ORDER BYTE = 00YYYYYY
         SLL 1,26      R1 HIGH-ORDER BYTE = YYYYYY00
         SLDL 0,6      R0 LOW-ORDER HALFWORD = 0000XXXX XXYYYYYY
         IC 1,2(14)    R1 LOW-ORDER BYTE = 00ZZZZZZ
         SLL 1,26      R1 HIGH-ORDER BYTE = ZZZZZZ00
         SLDL 0,20     R0 = XXXXXXYY YYYYZZZZ ZZZZ.... ........
         ST 0,0(,15)   STORE RESULT
         RETURN (14,12) "LM 14,12,12(13)" "BR 14"
         END