2015-04-28 4 views
0

В IBM OS/390 сборки, я пытаюсь сделать следующее:бит сдвига в IBM ассемблере

У меня есть набор битов, которые все заканчиваются в 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 
.... 

Я нахожусь на правильном пути здесь?

+2

Я считаю, что вы ищете опционный код типа «или» –

+0

На самом деле простая загрузка и сохранение под маской. Не требуется никаких изменений или необходимости. –

ответ

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. 

Я не закодированы в этом ассемблере раньше, но один ассемблер много похож на другой, и выше, должны продемонстрировать идеи манипуляции с битами с побитовое и/или в сочетании со смещением. Он также буферизует ввод-вывод, не констатируя запись данных в память, вместо этого используя регистры для ускорения работы.

Удачи вам!

+1

'O' - фактически мнемоника для операции с памятью регистров. Регистр-регистр - это 'OR', по крайней мере, насколько я могу судить. – EOF

+0

Скорее всего, вы правы - я ушел из IBM pdf, который я нашел, но без какого-либо ассемблера, чтобы сказать мне, что я сделал неправильно, я надеюсь, что концепция и/или/сдвиг - это то, что доходит до OP, а также избежать чрезмерной записи в память. –

+0

Я немного смущен синтаксисом здесь ... 0x3F должен быть 3 байта, где все биты установлены в 1? – user3856804

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 

Если ваши данные (или какой-либо из него) происходит уже быть в регистрах, канавы нагрузку и изменить R7 в соответствующий реестр.

Преимущество ICM с B'1111', которое вы использовали в своем вопросе, заключается в том, что он устанавливает код условия, а LOAD - нет. Если вам не нужен CC, ICM будет медленнее LOAD, поэтому вы не будете использовать его.

Здесь нет проблем с слепотой загрузки четырех байтов в регистр, а затем хранения нижнего порядка. Возможны многочисленные вариации, но нет оснований держать это в противовес простым.

Все четыре байта загружаются в регистр. Только три младших байта регистра хранятся в памяти из-за маски, являющейся B'0111 '. Любые байты из регистра, которые соответствуют 1 в маске, будут храниться смежно, начиная с адреса второго операнда. Вы получаете свои непрерывные девять байтов, просто не сохраняя первый байт когда-либо. Нет необходимости в смене, а затем комбинировать.

Вот выдержка из объяснения хранения символов Под маской (STCM) инструкции, начиная со страницы 313 Глава 7. Общие указания тока (от г/OS 2.1 элементы и особенности страница, связанная с документацией) z/Архитектура Принципы работы, который является вашим справочным руководством для ассемблера мейнфреймов.

Б, выбранный из регистра общего назначения R (1) под контролем маски размещен на смежных местах байт, начиная со вторым операндом адреса.

Содержимое поля M (3) используется как маска . Эти четыре бита, слева направо, соответствуют одному для одного с четырьмя байтами , слева направо, общего регистра R (1).Для STORE CHARACTERS ПОД МАСКИ (STCM, STCMY) четыре байта, к которым соответствуют биты маски>, находятся в разрядных позициях 32-63 общего регистра R (1) ... Байт , соответствующий , для единиц в маске помещается в том же порядке в последовательном порядке и смежных местах хранения, начинающихся со второго операнда. Когда маска не равна нулю, длина второго операнда равна количеству символов в маске. Содержимое общего регистра остается неизменным.

Примечание. Ваш CPU может быть не последним, но описание и использование всех инструкций по вашему вопросу будет таким же. Спросите техническую поддержку, какую POP (Принципы работы) вы должны использовать, чтобы соответствовать вашему фактическому процессору.

+0

Ах, мы получили эксперта здесь вместо моей общей попытки. OP должен следовать этому примеру больше, чем моему, так как, опять же, я вытягивался из внешних знаний и не работал на этой платформе :) Спасибо! –

+0

Нет, но спасибо. кто-то, кто пишет BAL или HLASM, ударит меня позади :-) Компилятор COBOL генерирует машинный код, чтобы вы могли посетить * Принципы работы *, если вас это достаточно заинтересовало. –

+0

Nah.Сейчас я делаю ARM, если мне нужно, но в большинстве случаев я должен оставаться на более высоком уровне в эти дни. Я скажу, что этот ассемблер чувствовал себя немного переработанным по сравнению с материалами RISC, которые я изучил с течением времени. Конечно, со временем все становится сложнее, даже ARM :) –

1

Как твердолобый ассемблере любовник, я собирался предложить небольшое изменение на примере выше ...

Во-первых, если у вас есть доступные регистры и могу организовать для исходных значений, чтобы быть смежными в памяти , простой трюк LOAD MULTIPLE (LM Rx, Ry, data) и три STORE CHARACTERS UNDER MASK (STCM). Всего четыре инструкции.

Но потом мне пришло в голову, что есть еще лучший способ сделать это с помощью одной команды с помощью ПЕРЕВЕСТИ (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! 

ПЕРЕВЕСТИ инструкция заменяет значения в мишени с использованием второго операнда в качестве Справочная таблица. Хотя это наиболее часто используется для таких вещей, как преобразование ASCII в EBCDIC, его также можно использовать для «переупорядочения» данных, как того требовал оригинальный плакат. TR берет первый байт (X'01 '), индексирует во второй операнд на эту сумму и заменяет значение на входе тем, что он находит. Когда команда завершается, поле TARGET содержит именно то, что требуется - и этот подход потребляет только одну инструкцию CPU.

Мне редко приходится хвастаться своими знаниями об ассемблере мейнфреймов, поэтому спасибо за предоставленную мне возможность!

+0

Отлично. Не так много ассемблерных вопросов здесь. Больше, но не намного больше, на www.ibmmainframes.com, если вы хотите прыгать в любое время. Там также группа ассемблеров на LinkedIn, где некоторые очень хорошие люди болтаются (не я, я растянулся, чтобы неправильно понять вопрос :-)). –

+0

Жаль. Есть люди, которые поднимают ассемблер в художественную форму ... есть так много, чтобы учиться на этом вопросе, и люди, которые действительно, действительно знают этот материал, исчезают с угрожающей скоростью. –

+0

Если это не картина вашей внучки, вы будете еще некоторое время. Я откладывал попытку исправить свой ответ в течение нескольких недель. Я был так рад, что кто-то опубликовал новый ответ, я только прочитал последние два абзаца снизу вверх. Для фактического вопроса мой ответ бесполезен, так как я неправильно понял вопрос. Я боюсь, что вы улучшили свой ответ ... но ... –

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 
+0

Обычно публикация простого кода не рекомендуется - оберните вокруг него пояснительный текст. –

Смежные вопросы