Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ASCII->BCD 
:(
    Опции темы
StandartenFuhrer
Дата 7.2.2007, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 22.10.2006

Репутация: нет
Всего: нет



Читал-читал форум... но толком так и не понял о БСД-формате...
Раскажите пожалуйста сам алгоритм перехода от ASCII к неупакованому\упокаваному БСД
можна и с примерчиком....   smile 
PM MAIL   Вверх
JAPH
Дата 7.2.2007, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 1
Всего: 23



BCD = Binary Coded Decimals, двоично-десятичные числа.
Неупакованное BCD-число хранит одну десятичную цифру, в двоичном виде, конечно. К примеру, 7 в неупакованном двоично-десятичном формате выглядит как 00000111b.
Упакованное BCD-число хранит двузначное десятичное число, старшую цифру в старшей тетраде, младшую - в младшей. Так, число 79 выглядит как 01111001b.

Переход между ASCII ("0" - "9") и неуп. BCD состоит в вычитании/прибавлении 30h.
Код

mov ax, 3536h ;AX содержит ASCII-число 56
sub ax, 3030h ;Теперь в AX неуп. BCD 56
;Перейдём к уп. BCD. Для этого надо младшую тетраду AH поместить в старшую тетраду AL
mov cl, 4
shl al, cl
shr ax, cl

Последнее можно короче - aad 16.
Обратно догадайтесь сами smile



--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
Dude03
Дата 7.2.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



гораздо быстрее не отнимать, а делать "and".
3030h = 11000000110000b
Соответственно инвертируй все биты 3030h и сделай с ним "and".
PM MAIL   Вверх
JAPH
Дата 7.2.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 1
Всего: 23



Почему гораздо быстрее? Обе команды по 1 такту.
Но если уж and, то почему с 0CFCFh, а не с 0F0Fh?


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
Dude03
Дата 7.2.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



Цитата(JAPH @  7.2.2007,  14:11 Найти цитируемый пост)
Но если уж and, то почему с 0CFCFh, а не с 0F0Fh? 

нет мне оправдания - ошибся smile 


Цитата(JAPH @  7.2.2007,  14:11 Найти цитируемый пост)
Почему гораздо быстрее? Обе команды по 1 такту.

действительно одинаково. Хз, просто привык считать, что логика быстрее.
PM MAIL   Вверх
StandartenFuhrer
Дата 9.2.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 22.10.2006

Репутация: нет
Всего: нет



Большое вам спасибо...краткость-сестра таланта.... smile

Добавлено @ 10:28 
а как бы вы товарищи посоветовали хранить вещественные числа(задание лабы)...целую часть в одной переменной...адробную в другой?и тогда арифметические действия с дробной вызывают подозрение(+1 к целой)...формат неупакованый БСД...
PM MAIL   Вверх
JAPH
Дата 9.2.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 1
Всего: 23



Зачем целую часть в одной переменной, дробную в другой? Просто в памяти отводим массив циферок
Код

    db   10 dup (0)

и виртуально разделяем его на целую и дробную части (т.е. фиксируем точку).
Сложение (A = A + B) будет примерно таким:
Код

    lea  di, A
    lea  si, B
    mov  cx, 10
    clc
@:  lodsb
    adc  al, [di]
    aaa
    stosb
    loop @




--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
StandartenFuhrer
Дата 13.2.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 22.10.2006

Репутация: нет
Всего: нет



Да со сложением и вычитанием разобрался...спасиб за помощь... но руководитель проекта(так их нынче виличают)... сказал что б разрадность было 5 в целой части и 5 в дробной... как подумаю как умножать...10 розрядов то бу в результате...сон пропадает...
Выручайте братцы... хоть сам и пишу давно на асьме... но с такой байдой не встречался ни разу...
PM MAIL   Вверх
JAPH
Дата 14.2.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 1
Всего: 23



Конечно, это далеко не лучший способ перемножения чисел, но как один из вариантов сойдёт. В переменных запятые подразумеваются точно посередине.
Код

        .186
sseg    segment stack
        db      400h dup (?)
sseg    ends
dseg    segment
a       db      0, 0, 0, 0, 1, 3, 4, 7, 0, 7
b       db      0, 0, 0, 0, 4, 2, 5, 2, 5, 2
c       db      20 dup (0)
dseg    ends
cseg    segment
        assume  cs:cseg, ds:dseg, ss:sseg
@:      mov     ax, dseg
        mov     ds, ax
        mov     es, ax
        mov     bx, offset b + 9
        mov     di, offset c + 19
        std
        mov     cx, 10
@1:     push     cx
        mov     cx, 10
        mov     si, offset a + 9
        xor     ah, ah
@2:     lodsb
        mov     dh, ah
        mul     byte ptr [bx]
        add     al, dh
        add     al, [di]
        aam
        stosb
        loop    @2
        mov     al, [di]
        add     al, ah
        aaa
        stosb
        adc     byte ptr [di], 0
        pop     cx
        dec     bx
        add     di, 10
        loop    @1
        mov     ax, 4C00h
        int     21h
cseg    ends
        end     @



--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1150 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.