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 ; ивертирование бит.
И на последок, малюсенький примерчик, использования такой команды. ;********************************************************************************; ; 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 секунд:Забыл скрин вставить.
|
|
« Последнее редактирование: 29-12-2013 13:49 от Vermut »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #18 : 29-12-2013 16:02 » |
|
Vermut, ты чёй-то попутал. Инверсия и битовая перестановка — вещи совершенно разные.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|