| 
			| 
					
						| opilune 
								Новенький    Offline | 
								|  | «  : 18-09-2012 19:16 »  |  | 
 
 Ребят, объясните пожалуйста, как сделать зеркальное отображение байта.. Искал на просторах интернета ничего не нашел стоящего.. Видел тему "зеркальное отражение битового массива", но тут массив и битовый.. 
 Просто у меня задача вроде не сложная, но зеркальное отражение вызвало затруднение..
 //Задан байт. Построить слово, младший байт которого содержит исходный, а старший – его зеркальное отображение//
 
 Вот сама задача, вдруг кому-нибудь будет скучно, может сделает, потом сверим коды:))
 
 Байт в общем задается сразу, например 10100010, слово будет 10100010 (младший байт) и 010001101 (старший байт) <-- зеркальный (10100010 младший)
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #1 : 18-09-2012 19:40 »  |  | 
 
 Например, сдвигом через флаг переноса. rcl al rcr bl ... Код потом сравним   |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| opilune 
								Новенький    Offline | 
								|  | « Ответ #2 : 18-09-2012 20:30 »  |  | 
 
 угу, спасибо.. про циклический сдвиг операнда влево через флаг переноса не знал.. ) Думал придется по одной цифре через буфер переворачивать) |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #3 : 18-09-2012 20:37 »  |  | 
 
 Способов множество. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| opilune 
								Новенький    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 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #5 : 18-09-2012 22:20 »  |  | 
 
 Я бы предложил такой подход: ; Исходный байт находится в 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
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #6 : 20-09-2012 09:30 »  |  | 
 
 в программе на C++ я для скорости применял табличный метод - вручную прописанное сопоставление 256 записей из отражённых значений байтов.Пробегаемся по массиву с конца одним указателем и с начала другим: байты отражаются через таблицу и переставляются местами. Если количество байтов нечётное, то средний байт отработается всё равно корректно по общему алгоритму
 
 Но в C++ нет флага переноса. Но, мне кажется, на ассемблере этот способ всё равно даст выигрыш в скорости.
 
 Но если массивы предполагаются небольшие, то нафиг таблицу )
 |  
						| 
								|  |  
								| « Последнее редактирование: 20-09-2012 09:34 от Алексей1153++ » |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #7 : 20-09-2012 10:04 »  |  | 
 
 Объясните мне, что такое зеркальное отражение на примерах
 0000 1111 -> ?
 1010 1001 -> ?
 0110 0110 -> ?
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #8 : 20-09-2012 10:25 »  |  | 
 
 abcd efgh -> hgfe dcba
 "обратный порядок бит"
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #9 : 20-09-2012 10:30 »  |  | 
 
 abcd efgh -> hgfe dcba
 "обратный порядок бит"
 
 Ну.. тут я не совсем тупой. А в двоичном формате? 0000 1111 -> 1111 0000? 1010 1001 -> 1001 0101? 0110 0110 -> 0110 0110? Т.е. нужно переставить местами полубайты?  |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| Dimka 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #10 : 20-09-2012 12:05 »  |  | 
 
 Sla, причём тут полубайты? Все 8 бит в обратном порядке. У тебя это видно только в строке 2. |  
						| 
								|  |  
								|  |  Записан | 
 
 Программировать - значит понимать (К. Нюгард)Невывернутое лучше, чем вправленное (М. Аврелий)
 Многие готовы скорее умереть, чем подумать (Б. Рассел)
 |  |  | 
	| 
			| 
					
						| Джон 
								простоАдминистратор    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."
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #12 : 20-09-2012 14:38 »  |  | 
 
 Джон, автор немного косноязычен, но мне кааца, дело именно в отражении битового массива   как сделать зеркальное отображение байта |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| v2 
								Помогающий    Offline | 
								|  | « Ответ #13 : 20-09-2012 15:46 »  |  | 
 
 Коль пошла такая пьянка - тост в защиту нибблов и маленьких таблиц: ) 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 
								ДеятельКоманда клуба    Offline 
								Пол:    | 
								|  | « Ответ #14 : 20-09-2012 18:12 »  |  | 
 
 v2, коль пошла такая пьянка, то задача решается вообще в 1 машинную инструкцию - так, как говорил Алексей1153++ . .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 
								Новенький    Offline | 
								|  | « Ответ #15 : 25-09-2012 20:38 »  |  | 
 
 Вот так сделал в итоге программу  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 | 
								|  | « Ответ #16 : 26-09-2012 04:11 »  |  | 
 
 А теперь попробуй поместить сдвиг в цикл. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Vermut 
								Новенький    Offline | 
								|  | « Ответ #17 : 29-12-2013 13:44 »  |  | 
 
 А зачем такие сложности. Всё намного проще. Для зеркального отражения бит, есть команда NOT .    ; на выходе: AH = 10100010b
 ;            AL = 01011101b
 
 xor eax, eax
 mov  ah, 10100010b
 mov  al, ah
 not  al      ; ивертирование бит.
 
 И на последок, малюсенький примерчик, использования такой команды. Добавлено через 5 минут и 48 секунд:;********************************************************************************;
 ;                                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
 
 ;--------------------------------------------------------------------------------;
 
 Забыл скрин вставить.    |  
						| 
								| 
 |  
								| « Последнее редактирование: 29-12-2013 13:49 от Vermut » |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #18 :  29-12-2013 16:02 »   |  | 
 
 Vermut, ты чёй-то попутал. Инверсия и битовая перестановка — вещи совершенно разные. |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	|  |