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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ASCII коды в асме  (Прочитано 35230 раз)
0 Пользователей и 12 Гостей смотрят эту тему.
студент
Гость
« : 08-11-2003 10:29 » 

Может кто может объяснить, как у кодов ASCII символов, считанных из файла, отбросить старший бит, а оставшиеся биты пергрупировать в новые байты? Имею ввиду двоичные коды.
Был бы очень благодарен если бы могли помочь...
Записан
Xeysan
Гость
« Ответ #1 : 08-11-2003 10:43 » 

Не понял, отбросить и сдвинуть?
Или так:
Код:
  mov  al, byte ptr symbol
  and  al, 7Fh
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline 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
 :?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #6 : 08-11-2003 18:50 » 

Сдвигом работай - бинарный сдвиг влево...
Алгоритм на асме сразу не скажу ....
Зависит и от системы, как склеивать.

В чем работаешь?
Записан

А птичку нашу прошу не обижать!!!
студент
Гость
« Ответ #7 : 08-11-2003 18:58 » new

Работаю под Фоточками ХР с MASM 6.13, TASM
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #8 : 09-11-2003 01:05 » 

студент, извини, но мне кажется, что ты просто не понимаешь темы. В ассемблере нет понятия "неполных байтов". Если ты делаешь операцию "and al,7fh", то в результате получаешь не 7 бит, а подный байт, но со старшим битом установленным в ноль. Вроде, это то что ты спрашиваешь.
Записан

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

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #9 : 09-11-2003 08:15 » 

студент, я тебя понял просто не как не соображу как это в коде выглядит. Кажется так надо пройтись по массиву AND [CHAR], 7Fh затем LSH [CHAR], 1 после чего выполнять следующий цикл сдигаем второй байт на 1 влево при этом в последний бит первого ставим значение CF после этого трерий байт сдвигаем на 1 влево записываем CF в предпоследний бит второго байта. опять сдвигаем на 1 влево записываем CF в последний бит и т.д. надо помнить о том что при достижении 8-го байта на один байт подвинуть весь массив тут поможет MOVSB. Со здвигами байтов тебе поможет дополнительный байт в который ты в последний бит будешь писать CF и сдвигать на 1 влево (можно делать одной инструкцеей вращения) потом получив в этом бите напирмер 00000101b ты его положишь OR поверх нужного байта.
Кажется так. Надеюсь понятно а то уже сам запутался. Ага
Записан

Странно всё это....
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #10 : 09-11-2003 08:58 » 

LogRus,  Отлично
студент, надо тестировать.
Т.е. мне показалось пример, LogRus, верным логически - как это будет выглядеть в коде - трудно сказать.
Прикол в том, что в зависимости от длины последовательности колличество "потерянных" байт в результате отрезания будет становится больше. Поэтому надо более точно продумать ситуацию сдвига влево... RXL, правильно акцентировал вопрос, что останутся полнуе байты, с 0 в старшем бите.
Записан

А птичку нашу прошу не обижать!!!
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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!
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #14 : 09-11-2003 16:24 » 

студент, регистрируйся - вливайся Улыбаюсь
Записан

А птичку нашу прошу не обижать!!!
Студент
Гость
« Ответ #15 : 09-11-2003 17:02 » 

Гром, спасибо за приглашение. С удовольствием зарегистрировался.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline 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
Молодой специалист

us
Offline 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 Отлично .
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #27 : 10-12-2003 20:52 » 

Цитата

система команд !!!С КОДАМИ!!! для процессора КР580


это у меня есть! И мнемоника и коды

отсканирую и пришлю. но не сегодня



блин, опять ностальгия, я столько на нём, родном КР580 всего куролесил!
свой тетрис, сапёр, цветные линии, пентамино и чего только не!. Даже компилятор для какого-то МК... только недоделал - 64к ОЗУ мне не хватило  Улыбаюсь

систему команд для него я и сейчас помню, даже количество тактов почти для всех них, хотя не писал для КР580 уже года 4...
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #28 : 15-12-2003 19:12 » 

Отсканировал и прислал. Но уже не сегодня  Улыбаюсь

журнал Радио, 87 год, 5 номер
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #29 : 09-09-2004 13:21 » 

Гость, писал, не отрицаю Ага
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines