студент
Гость
|
|
« : 08-11-2003 10:29 » |
|
Может кто может объяснить, как у кодов ASCII символов, считанных из файла, отбросить старший бит, а оставшиеся биты пергрупировать в новые байты? Имею ввиду двоичные коды. Был бы очень благодарен если бы могли помочь...
|
|
|
Записан
|
|
|
|
Xeysan
Гость
|
|
« Ответ #1 : 08-11-2003 10:43 » |
|
Не понял, отбросить и сдвинуть? Или так: mov al, byte ptr symbol and al, 7Fh
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #2 : 08-11-2003 10:44 » |
|
Отброс старшего бита это операция ASCII & 01111111 - или в HEX - ASCII & x7F. А насчет второго - перегрупировать - это ты что имеешь ввиду - свою таблицу составить
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Студент
Гость
|
|
« Ответ #3 : 08-11-2003 10:55 » |
|
я имел ввиду, что у байтов отбрасывается старший бит, а потом из тех укороченных байтов формируются новые байты из 8 битов: было 01100101 00110010 стало 1100101 0110010 11001010 11001000
|
|
|
Записан
|
|
|
|
Xeysan
Гость
|
|
« Ответ #4 : 08-11-2003 15:38 » |
|
было 01100101 00110010 стало 1100101 0110010 11001010 11001000 Разберись, который у тебя в примере бит старший, а какой байт первый, а то по-твоему получается, что старший бит 2-го байта вдвигается в младший бит 1-го байта :?:
|
|
|
Записан
|
|
|
|
студент
Гость
|
|
« Ответ #5 : 08-11-2003 17:39 » |
|
не, там всё нормально: смотри: были, допустим 2 байта 01100101 00110010 тогда отбрасываю старшие - это нули слева: (0)1100101 (0)0110010 1100101 0110010 Дальше из этих 7 битовых "байтов" формирую полные байты (просто разбиваю по 8, не обращая внимания, где кончался старый байт, а в конце второго дописываю 00, чтобы было 8 битов): 11001010 11001000
Рассказать трудно, а как это реализовать не представляю. Может есть какая нибудь специфичная функция? Но я похожего ничего не нашёл - разве что SOR :?
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #6 : 08-11-2003 18:50 » |
|
Сдвигом работай - бинарный сдвиг влево... Алгоритм на асме сразу не скажу .... Зависит и от системы, как склеивать.
В чем работаешь?
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
студент
Гость
|
|
« Ответ #7 : 08-11-2003 18:58 » |
|
Работаю под Фоточками ХР с MASM 6.13, TASM
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #8 : 09-11-2003 01:05 » |
|
студент, извини, но мне кажется, что ты просто не понимаешь темы. В ассемблере нет понятия "неполных байтов". Если ты делаешь операцию "and al,7fh", то в результате получаешь не 7 бит, а подный байт, но со старшим битом установленным в ноль. Вроде, это то что ты спрашиваешь.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #9 : 09-11-2003 08:15 » |
|
студент, я тебя понял просто не как не соображу как это в коде выглядит. Кажется так надо пройтись по массиву AND [CHAR], 7Fh затем LSH [CHAR], 1 после чего выполнять следующий цикл сдигаем второй байт на 1 влево при этом в последний бит первого ставим значение CF после этого трерий байт сдвигаем на 1 влево записываем CF в предпоследний бит второго байта. опять сдвигаем на 1 влево записываем CF в последний бит и т.д. надо помнить о том что при достижении 8-го байта на один байт подвинуть весь массив тут поможет MOVSB. Со здвигами байтов тебе поможет дополнительный байт в который ты в последний бит будешь писать CF и сдвигать на 1 влево (можно делать одной инструкцеей вращения) потом получив в этом бите напирмер 00000101b ты его положишь OR поверх нужного байта. Кажется так. Надеюсь понятно а то уже сам запутался.
|
|
|
Записан
|
Странно всё это....
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #10 : 09-11-2003 08:58 » |
|
LogRus, студент, надо тестировать. Т.е. мне показалось пример, LogRus, верным логически - как это будет выглядеть в коде - трудно сказать. Прикол в том, что в зависимости от длины последовательности колличество "потерянных" байт в результате отрезания будет становится больше. Поэтому надо более точно продумать ситуацию сдвига влево... RXL, правильно акцентировал вопрос, что останутся полнуе байты, с 0 в старшем бите.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Антон (LogRus)
|
|
« Ответ #11 : 09-11-2003 09:08 » |
|
Гром, про потерянные байты это да надо но это наверно можно счетчик поставить на 8 как обнулится пора двигать а еще лучше опримизировать например если надо двигать на 6 бит копируем целиком в байт маски и двигаем в право на 2.
|
|
|
Записан
|
Странно всё это....
|
|
|
Xeysan
Гость
|
|
« Ответ #12 : 09-11-2003 11:18 » |
|
.model tiny .386 .code org 100h start{ mov cx, 1 ; Shift counter mov dx, 1 ; Bytes counter mov di, offset array ; Destination bits mov si, offset array + 1 ; Source bits
Again{ mov ax, word ptr [si( ; Load source bits mov bl, byte ptr [di( ; Load dest bits, bh contains garbarge xchg al, ah ; IA, Low byte - low addr. shl al, 1 ; Delete hi bit shl ax, 1 ; Pack source word shld bx, ax, cl ; Pack mov byte ptr [di(, bl ; Store result byte
inc si inc di inc cx cmp cx, 14 jb Skip sub cx, 7 inc si inc dx Skip{ inc dx cmp dx, ARRAY_LEN jb Again ret array db 12h, 23h, 34h, 45h, 56h, 67h, 78h, 89h ARRAY_LEN equ $ - array end start Примерно так, только фрагмент, который идет по массиву с ошибкой. Идея такая, если сдвигать больше 13 бит, то один байт можно пропустить... а тот фрагмент, что сдвигает вроде работает. Извини, что так криво все, но я сейчас ухожу от компа + плюс дел своих тьма. Для 1-вых 4-х он точно работает.
|
|
|
Записан
|
|
|
|
студент
Гость
|
|
« Ответ #13 : 09-11-2003 15:41 » |
|
Xeysan, spasibo bolsoe!
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #14 : 09-11-2003 16:24 » |
|
студент, регистрируйся - вливайся
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Студент
Гость
|
|
« Ответ #15 : 09-11-2003 17:02 » |
|
Гром, спасибо за приглашение. С удовольствием зарегистрировался.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #16 : 09-11-2003 17:41 » |
|
Студент, ну значит нашему полку прибыло!!! Поздравляю.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Студент
Гость
|
|
« Ответ #17 : 09-11-2003 17:48 » |
|
Но я ещё в АСМе слабоват - только начал изучать
|
|
|
Записан
|
|
|
|
Студент
Гость
|
|
« Ответ #18 : 13-11-2003 17:36 » |
|
Всё бы и неплохо, но проблема в том, что символы надо брать из файла а не из массива...
|
|
|
Записан
|
|
|
|
Xeysan
Гость
|
|
« Ответ #19 : 13-11-2003 18:31 » |
|
Дружище, я тебе идею дал, а дальше сам...как говориться RTFM А насчет файла, так это к 21-му прерыванию, открываешь файл, читаешь в массив, а потом сжимаешь. Справочник по асму для дос - www(dot)proglib.ru - там такого навалом... Удачи
|
|
|
Записан
|
|
|
|
Sashok
Молодой специалист
Offline
Пол:
|
|
« Ответ #20 : 13-11-2003 19:36 » |
|
Студент, а в чем задача состоит? Если простое сжатие в пропорции 7/8, алгоритм не задан и ты пишешь как запаковку, так и распаковку, то вот тебе идея гораздо проще: расписываешь каждый восьмой байт по одному биту в старшие биты предыдущих семи. Алгоритм намного проще, а степень сжатия - та же.
|
|
|
Записан
|
Если бы окружающие нас объекты содержали столько же ошибок, сколько программы, цивилизация обрушилась бы от первого порыва ветра...
|
|
|
Xeysan
Гость
|
|
« Ответ #21 : 14-11-2003 04:14 » |
|
Хорошая идея...
|
|
|
Записан
|
|
|
|
Студент
Гость
|
|
« Ответ #22 : 14-11-2003 14:38 » |
|
Я об этом тоже думал, но препод сказал, что надо именно таким алгоритмом писать. Я в принципе въехал как это всё сделать - пока отчитываться за неделю напишу как раз Если чё не получиться - напишу ещё.
|
|
|
Записан
|
|
|
|
Студент
Гость
|
|
« Ответ #23 : 01-12-2003 18:31 » |
|
забацал я эту прогу - окaзалось всё просто: PACK{ lea si, buffer ;buffer 8 bit lea di, rez ;rezult 7 bit mov bh, byte ptr [si( push cx mov cl,1 jmp STEP
STEP{ inc si mov bl, byte ptr [si( rol bl,1 shl bx,cl mov byte ptr [di(, bh inc di inc cl cmp di,7 je WRITE cmp ax,cx je LAST jmp NOTLAST
LAST{ mov [di(,bl jmp WRITE
NOTLAST{ ror bl,cl mov bh,bl jmp STEP
|
|
|
Записан
|
|
|
|
Xeysan
Гость
|
|
« Ответ #24 : 01-12-2003 19:29 » |
|
Приведи всю программу ( функцию ) целиком, а то я сильно сомневаюсь, что это работает...
mov cl, 1 jmp STEP ; <- Эта инструкция не нужна
cmp di, 7 ; Что значит '7'? В di адрес rez, или у тебя он фиксирован по условию? je WRITE ; Где WRITE? cmp ax, cx ; А что в ax?
|
|
|
Записан
|
|
|
|
Студент
Гость
|
|
« Ответ #25 : 02-12-2003 16:13 » |
|
Работает. Я уже за неё отчитался в универе В ах во время считывания очередных восьми байтов помещается число считанных байтов - это необходимо по двум причинам: 1. необходимо знать, когда заканчивается файл - если ах < буфера (8 байт), то из этого можно сделать вывод, что это последняя порция. 2. В последний „архивированный“ байт надо дописать нолики в свободные младшие позиции (это по условию). Весь блок: BEGIN_READ{
mov cx,8 lea dx, buffer mov ah, 3fh mov bx, handles int 21h ;posle etogo v ax zapisyvaetsia cislo scitanyx baitov jc ERROR1 mov cx,ax ;<<< skolko scitano
PACK{ lea si, buffer lea di, rez mov bh, byte ptr [si( push cx mov cl,1 jmp STEP ; etogo v samom dele ne nado!
STEP{ inc si mov bl, byte ptr [si( rol bl,1 shl bx,cl mov byte ptr [di(, bh inc di inc cl cmp di,7 ;kogda pora perexodit k zapisi - 7 baitov na vyxode je WRITE cmp ax,cx ;esli poslednii bait, to v niom v mladsix bitax ostavim 0 je LAST jmp NOTLAST
LAST{ mov [di(,bl jmp WRITE
NOTLAST{ ror bl,cl mov bh,bl jmp STEP
WRITE{ pop cx cmp ax,8 je S1 jmp S2
S1{ dec cx S2{ lea dx, rez mov ah,40h mov bx, handled int 21h jc error2 cmp ax,7 jnz FILE_END jmp BEGIN_READ
Процедуры открытия и создания файлов я опустил FILE_END: там закрываются файлы ERROR2: выводит сообщение об ошибке DI - индексный регистр. он указывает на какие либо даннные в памяти.
|
|
|
Записан
|
|
|
|
Shurick
Гость
|
|
« Ответ #26 : 10-12-2003 17:41 » |
|
Ребята, я тоже слабоват в ASM'е, но мне не прога нужна, а коды. Если у кого есть система команд !!!С КОДАМИ!!! для процессора КР580 (или аналог Intel8080 & i8085), очень прошу сообщить и если можно прислать на мыло Choura22@mail.ru. А то прогу написал, а загнать не могу т.к. в СМ1800, на котором надо работать, можно писать только в кодах. Там нет мнемонических выражений . Помогите, pls .
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #27 : 10-12-2003 20:52 » |
|
система команд !!!С КОДАМИ!!! для процессора КР580
это у меня есть! И мнемоника и коды отсканирую и пришлю. но не сегодня блин, опять ностальгия, я столько на нём, родном КР580 всего куролесил! свой тетрис, сапёр, цветные линии, пентамино и чего только не!. Даже компилятор для какого-то МК... только недоделал - 64к ОЗУ мне не хватило систему команд для него я и сейчас помню, даже количество тактов почти для всех них, хотя не писал для КР580 уже года 4...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #28 : 15-12-2003 19:12 » |
|
Отсканировал и прислал. Но уже не сегодня журнал Радио, 87 год, 5 номер
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #29 : 09-09-2004 13:21 » |
|
Гость, писал, не отрицаю
|
|
|
Записан
|
|
|
|
|