Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Зеркальное отображение байтов  (Прочитано 33916 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
opilune
Новенький

ru
Offline Offline

« : 18-09-2012 19:16 » 

Ребят, объясните пожалуйста, как сделать зеркальное отображение байта.. Искал на просторах интернета ничего не нашел стоящего.. Видел тему "зеркальное отражение битового массива", но тут массив и битовый..

Просто у меня задача вроде не сложная, но зеркальное отражение вызвало затруднение..
//Задан байт. Построить слово, младший байт которого содержит исходный, а старший – его зеркальное отображение//

Вот сама задача, вдруг кому-нибудь будет скучно, может сделает, потом сверим коды:))

Байт в общем задается сразу, например 10100010, слово будет 10100010 (младший байт) и 010001101 (старший байт) <-- зеркальный (10100010 младший)
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 18-09-2012 19:40 » 

Например, сдвигом через флаг переноса.

rcl al
rcr bl
...

Код потом сравним Ага
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
opilune
Новенький

ru
Offline Offline

« Ответ #2 : 18-09-2012 20:30 » 

угу, спасибо.. про циклический сдвиг операнда влево через флаг переноса не знал.. ) Думал придется по одной цифре через буфер переворачивать)
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 18-09-2012 20:37 » 

Способов множество.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
opilune
Новенький

ru
Offline Offline

« Ответ #4 : 18-09-2012 20:40 » 

берем первый байт элемента, в нем отражаем биты, ставим байт в конце, берем второй, отражаем, ставим предпоследним и т.д.

Добавлено через 34 секунды:
Код ASM
1
2
3
4
5
6
7
8
9
lea si, elem
mov al,[si]
call mirror
mov [si+8],cl
mov al,[si+1]
call mirror
mov [si+7],cl
.....
 
А отражаем примерно так: берем нулевой бит байта, ставим его последним в др регистре, берем первый, ставим предпоследним.
Код ASM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mirror:
  xor cl,cl
 
  mov bl,al
  and bl,1
  shl bl,7
  or cl,bl
 
  mov bl,al
  shr bl,1 ; сдвигаем нужный бит к началу
  and bl,1 ; оставляем только нулевой бит
  shl bl,6  ; сдвигаем его в конец
  or cl,bl  ; сохраняем
 ....

вот так можно ведь тоже?
« Последнее редактирование: 18-09-2012 20:41 от opilune » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 18-09-2012 22:20 » 

Я бы предложил такой подход:

Код: (ASM)
; Исходный байт находится в AL
; Отражение помещается в AH
mirror  proc
        mov     dh, 11111111b
        mov     cl, 00000001b
        mov     ch, 10000000b
do:     mov     dl, al
        and     dl, cl
        jz      skip
        or      ah, ch
skip:   shl     cl, 1
        shr     ch, 1
        and     cl, dh
        jnz     do
        ret
        endp
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 20-09-2012 09:30 » 

в программе на C++ я для скорости применял табличный метод - вручную прописанное сопоставление 256 записей из отражённых значений байтов.
Пробегаемся по массиву с конца одним указателем и с начала другим: байты отражаются через таблицу и переставляются местами. Если количество байтов нечётное, то средний байт отработается всё равно корректно по общему алгоритму

Но в C++ нет флага переноса. Но, мне кажется, на ассемблере этот способ всё равно даст выигрыш в скорости.

Но если массивы предполагаются небольшие, то нафиг таблицу )
« Последнее редактирование: 20-09-2012 09:34 от Алексей1153++ » Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 20-09-2012 10:04 » 

Объясните мне, что такое зеркальное отражение на примерах

0000 1111 -> ?
1010 1001 -> ?
0110 0110 -> ?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 20-09-2012 10:25 » 

abcd efgh -> hgfe dcba

"обратный порядок бит"
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 20-09-2012 10:30 » 

abcd efgh -> hgfe dcba

"обратный порядок бит"
Ну.. тут я не совсем тупой.

А в двоичном формате?

0000 1111 -> 1111 0000?
1010 1001 -> 1001 0101?
0110 0110 -> 0110 0110?

Т.е. нужно переставить местами полубайты?


Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 20-09-2012 12:05 » 

Sla, причём тут полубайты? Все 8 бит в обратном порядке. У тебя это видно только в строке 2.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 20-09-2012 13:53 » 

Так не. Я тоже не понял (Слав, мы наверное совсем тупые?)

Вы говорите об отражении БИТов, а надо БАЙТов. Ведь в задании стоит даже:

Видел тему "зеркальное отражение битового массива", но тут массив и битовый..

Так что же такое "зеркальное отображение байтов"?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 20-09-2012 14:38 » 

Джон, автор немного косноязычен, но мне кааца, дело именно в отражении битового массива Улыбаюсь


Цитата
как сделать зеркальное отображение байта
Записан

v2
Помогающий

ua
Offline Offline

« Ответ #13 : 20-09-2012 15:46 » 

Коль пошла такая пьянка - тост в защиту нибблов и маленьких таблиц: )
Код: (ASM)
mnTab:
  db    0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15
Mirror:             ; bits in byte AL, out AH
  movzx dx ,al
  and   dl ,0x0F
  add   dx ,offset mnTab
  mov   ah ,byte ptr [dx]
  shl   ah ,4
  movzx dx ,al
  shr   dl ,4
  add   dx ,offset mnTab
  or    ah ,byte ptr [dx]
ret
« Последнее редактирование: 20-09-2012 15:57 от v2 » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 20-09-2012 18:12 » 

v2, коль пошла такая пьянка, то задача решается вообще в 1 машинную инструкцию - так, как говорил Алексей1153++.

Код: (ASM)
.8086
.model tiny
.code
        org     100h

entry:
        jmp     main

mirror  db      00000000b
        db      10000000b
        db      01000000b
        db      11000000b
        db      00100000b
        db      10100000b
        db      01100000b
        db      11100000b
        db      00010000b
        db      10010000b
        db      01010000b
        db      11010000b
        db      00110000b
        db      10110000b
        db      01110000b
        db      11110000b
        db      00001000b
        db      10001000b
        db      01001000b
        db      11001000b
        db      00101000b
        db      10101000b
        db      01101000b
        db      11101000b
        db      00011000b
        db      10011000b
        db      01011000b
        db      11011000b
        db      00111000b
        db      10111000b
        db      01111000b
        db      11111000b
        db      00000100b
        db      10000100b
        db      01000100b
        db      11000100b
        db      00100100b
        db      10100100b
        db      01100100b
        db      11100100b
        db      00010100b
        db      10010100b
        db      01010100b
        db      11010100b
        db      00110100b
        db      10110100b
        db      01110100b
        db      11110100b
        db      00001100b
        db      10001100b
        db      01001100b
        db      11001100b
        db      00101100b
        db      10101100b
        db      01101100b
        db      11101100b
        db      00011100b
        db      10011100b
        db      01011100b
        db      11011100b
        db      00111100b
        db      10111100b
        db      01111100b
        db      11111100b
        db      00000010b
        db      10000010b
        db      01000010b
        db      11000010b
        db      00100010b
        db      10100010b
        db      01100010b
        db      11100010b
        db      00010010b
        db      10010010b
        db      01010010b
        db      11010010b
        db      00110010b
        db      10110010b
        db      01110010b
        db      11110010b
        db      00001010b
        db      10001010b
        db      01001010b
        db      11001010b
        db      00101010b
        db      10101010b
        db      01101010b
        db      11101010b
        db      00011010b
        db      10011010b
        db      01011010b
        db      11011010b
        db      00111010b
        db      10111010b
        db      01111010b
        db      11111010b
        db      00000110b
        db      10000110b
        db      01000110b
        db      11000110b
        db      00100110b
        db      10100110b
        db      01100110b
        db      11100110b
        db      00010110b
        db      10010110b
        db      01010110b
        db      11010110b
        db      00110110b
        db      10110110b
        db      01110110b
        db      11110110b
        db      00001110b
        db      10001110b
        db      01001110b
        db      11001110b
        db      00101110b
        db      10101110b
        db      01101110b
        db      11101110b
        db      00011110b
        db      10011110b
        db      01011110b
        db      11011110b
        db      00111110b
        db      10111110b
        db      01111110b
        db      11111110b
        db      00000001b
        db      10000001b
        db      01000001b
        db      11000001b
        db      00100001b
        db      10100001b
        db      01100001b
        db      11100001b
        db      00010001b
        db      10010001b
        db      01010001b
        db      11010001b
        db      00110001b
        db      10110001b
        db      01110001b
        db      11110001b
        db      00001001b
        db      10001001b
        db      01001001b
        db      11001001b
        db      00101001b
        db      10101001b
        db      01101001b
        db      11101001b
        db      00011001b
        db      10011001b
        db      01011001b
        db      11011001b
        db      00111001b
        db      10111001b
        db      01111001b
        db      11111001b
        db      00000101b
        db      10000101b
        db      01000101b
        db      11000101b
        db      00100101b
        db      10100101b
        db      01100101b
        db      11100101b
        db      00010101b
        db      10010101b
        db      01010101b
        db      11010101b
        db      00110101b
        db      10110101b
        db      01110101b
        db      11110101b
        db      00001101b
        db      10001101b
        db      01001101b
        db      11001101b
        db      00101101b
        db      10101101b
        db      01101101b
        db      11101101b
        db      00011101b
        db      10011101b
        db      01011101b
        db      11011101b
        db      00111101b
        db      10111101b
        db      01111101b
        db      11111101b
        db      00000011b
        db      10000011b
        db      01000011b
        db      11000011b
        db      00100011b
        db      10100011b
        db      01100011b
        db      11100011b
        db      00010011b
        db      10010011b
        db      01010011b
        db      11010011b
        db      00110011b
        db      10110011b
        db      01110011b
        db      11110011b
        db      00001011b
        db      10001011b
        db      01001011b
        db      11001011b
        db      00101011b
        db      10101011b
        db      01101011b
        db      11101011b
        db      00011011b
        db      10011011b
        db      01011011b
        db      11011011b
        db      00111011b
        db      10111011b
        db      01111011b
        db      11111011b
        db      00000111b
        db      10000111b
        db      01000111b
        db      11000111b
        db      00100111b
        db      10100111b
        db      01100111b
        db      11100111b
        db      00010111b
        db      10010111b
        db      01010111b
        db      11010111b
        db      00110111b
        db      10110111b
        db      01110111b
        db      11110111b
        db      00001111b
        db      10001111b
        db      01001111b
        db      11001111b
        db      00101111b
        db      10101111b
        db      01101111b
        db      11101111b
        db      00011111b
        db      10011111b
        db      01011111b
        db      11011111b
        db      00111111b
        db      10111111b
        db      01111111b
        db      11111111b

main:

        lea     bx, mirror
        xor     ax, ax
        mov     al, 10100010b

        xlat                  ; <<<=== вот эта волшебная инструкция

        ret

        end     entry
Но мне так кажется, автору это не надо - будет "низачот".
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
opilune
Новенький

ru
Offline Offline

« Ответ #15 : 25-09-2012 20:38 » 

Вот так сделал в итоге программу

Код: (ASM)
dosseg
.model small
.stack 1000h
.data
;*************************              ;РАЗДЕЛ КОНСТАНТ И ПЕРЕМЕННЫХ

byte1   db 10010001b                    ;заданный байт
word2   dw ?                            ;построенное слово
;--------------------------------------------------------

                                        ;НАЧАЛО ПРОГРАММЫ
.code

start:  mov ax,@data                    ;загружаем адрес сегмента данных
        mov ds,ax                       ;загружаем адрес сегмента в сегментный регистр даннных

        mov al,byte1                    ;загружаем заданный байт

        rcr al,1                        ;выдвигаем (вправо) из заданного байта 0-ой исходный бит во флаг переноса
        rcl ah,1                        ;задвигаем (влево) бит из флага переноса в зеркальное отображение байта

        rcr al,1                        ;выдвигаем (вправо) из заданного байта 1-ый исходный бит во флаг переноса
        rcl ah,1                        ;задвигаем (влево) бит из флага переноса в зеркальное отображение байта

        rcr al,1                        ;выдвигаем (вправо) из заданного байта 2-ой исходный бит во флаг переноса
        rcl ah,1                        ;задвигаем (влево) бит из флага переноса в зеркальное отображение байта

        rcr al,1                        ;выдвигаем (вправо) из заданного байта 3-ий исходный бит во флаг переноса
        rcl ah,1                        ;задвигаем (влево) бит из флага переноса в зеркальное отображение байта

        rcr al,1                        ;выдвигаем (вправо) из заданного байта 4-ый исходный бит во флаг переноса
        rcl ah,1                        ;задвигаем (влево) бит из флага переноса в зеркальное отображение байта

        rcr al,1                        ;выдвигаем (вправо) из заданного байта 5-ый исходный бит во флаг переноса
        rcl ah,1                        ;задвигаем (влево) бит из флага переноса в зеркальное отображение байта

        rcr al,1                        ;выдвигаем (вправо) из заданного байта 6-ой исходный бит во флаг переноса
        rcl ah,1                        ;задвигаем (влево) бит из флага переноса в зеркальное отображение байта

        rcr al,1                        ;выдвигаем (вправо) из заданного байта 7-ой исходный бит во флаг переноса
        rcl ah,1                        ;задвигаем (влево) бит из флага переноса в зеркальное отображение байта

                                        ;в регистре AH получили зеркальный байт

        mov al,byte1                    ;загружаем заданный байт
        mov word2,ax                    ;сохраняем полученное слово в котором:
                                        ;младший байт AL - исходный, старший байт AH - зеркальный

        mov ah,4ch                      ;загружаем номер функции DOS: завершить программу
        int 21h                         ;вызов функции DOS

end start                               ;КОНЕЦ ПРОГРАММЫ
« Последнее редактирование: 26-09-2012 04:11 от RXL » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 26-09-2012 04:11 » 

А теперь попробуй поместить сдвиг в цикл.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Vermut
Новенький

ru
Offline Offline

« Ответ #17 : 29-12-2013 13:44 » new

А зачем такие сложности. Всё намного проще. Для зеркального отражения бит, есть команда NOTВнимание! Говорит и показывает...

Код: (ASM)

; на выходе: AH = 10100010b
;            AL = 01011101b

        xor eax, eax
        mov  ah, 10100010b
        mov  al, ah
        not  al      ; ивертирование бит.
 

И на последок, малюсенький примерчик, использования такой команды.

Код: (ASM)

;********************************************************************************;
;                                InveertBits                                     ;
;********************************************************************************;
;                                                                                ;
; Description:                                                                   ;
;  The program inverting bits of binary number.                                  ;
;                                                                                ;
; Target OS:                                                                     ;
;  Windows.                                                                      ;
;                                                                                ;
; The code is written by Vermut.                                                 ;
; Created specially for https://forum.shelek.ru/                                  ;
; Compile with FASM.                                                             ;
;                                                                                ;
; Rights of copying: is free.                                                    ;
;                                                                                ;
;********************************************************************************;

;--------------------------------------------------------------------------------;
; HEAD AREA                                                                      ;
;--------------------------------------------------------------------------------;

format PE GUI 4.0
entry START

include 'C:\Program Files\FASM\INCLUDE\win32ax.inc'

;--------------------------------------------------------------------------------;
; CODE AREA                                                                      ;
;--------------------------------------------------------------------------------;

START:
        xor     eax, eax
        mov      al, bin_number
        mov     edi, Result.highword
        call    CnvByteToASCIIBinNumber
        not      al
        mov     edi, Result.lowword
        call    CnvByteToASCIIBinNumber
        invoke  MessageBox, 0, Result, Caption, 0
        invoke  ExitProcess, 0

;--------------------------------------------------------------------------------;
; PROCS AREA                                                                     ;
;--------------------------------------------------------------------------------;

; al  = byte number.
; edi = buffer address.

CnvByteToASCIIBinNumber:
        xor     ecx, ecx
        mov     cl, 8
    cnv:
        rol     al, 1
        jc      set_1
        mov     [edi], byte "0"
        jmp     @f
  set_1:
        mov     [edi], byte "1"
  @@:
        inc     edi
        dec     cl
        jnz     cnv
        clc
        ret

;--------------------------------------------------------------------------------;
; DATA AREA                                                                      ;
;--------------------------------------------------------------------------------;

Caption: db 'Inverting bits example!', 0

bin_number = 10100010b

virtual at Result
end virtual

Result:
db 'HighWord: '
.highword: db '        b', 10, 13
db 'LowWord:  '
.lowword:  db '        b ', 0

;--------------------------------------------------------------------------------;
; IMPORT AREA                                                                    ;
;--------------------------------------------------------------------------------;

data import

  library KERNEL32, 'KERNEL32.DLL',\
          USER32, 'USER32.DLL'

  import KERNEL32,\
  ExitProcess, 'ExitProcess'

  import USER32,\
  MessageBox, 'MessageBoxA'

end data

;--------------------------------------------------------------------------------;
 


Добавлено через 5 минут и 48 секунд:
Забыл скрин вставить.  Улыбаюсь

* InvertBits.zip (6.67 Кб - загружено 1077 раз.)
* Screenshot.png (4.84 Кб - загружено 1192 раз.)
« Последнее редактирование: 29-12-2013 13:49 от Vermut » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 29-12-2013 16:02 » 

Vermut, ты чёй-то попутал. Инверсия и битовая перестановка — вещи совершенно разные.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines