IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> преобразование форматов
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Всё.....я уже ни чё не понимаю......sad.gif(((((((((( как преобразовать двоичное число в десятичное(BCD)?размер двоичного 6 байт.....процессор 16разрядный..сопроцессор не использовать......
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Цитата
в десятичное(BCD)
В упакованное (две цифры в байте, например 23d -> 23h) или неупакованное (одна цифра в байте, 23d -> 02h, 03h)?


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


В упакованное
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


В виде вставок пойдёт?

Первый вариант (развёрнутые циклы):
program _bcd;

{$G+}

const
  Hex: array[0..15] of Char = '0123456789ABCDEF';

var
  bin: array[0..5] of Byte;
  bcd: array[0..7] of Byte;

  t: LongInt absolute bin;
  i: Integer;

begin
  t := 123456789;
{  t := 987654321; }
  asm
     call @@div10
     mov dx,ax
     call @@div10
     shl ah,4
     or ax,dx
     mov byte ptr bcd[7],ah
     call @@div10
     mov dx,ax
     call @@div10
     shl ah,4
     or ax,dx
     mov byte ptr bcd[6],ah
     call @@div10
     mov dx,ax
     call @@div10
     shl ah,4
     or ax,dx
     mov byte ptr bcd[5],ah
     call @@div10
     mov dx,ax
     call @@div10
     shl ah,4
     or ax,dx
     mov byte ptr bcd[4],ah
     call @@div10
     mov dx,ax
     call @@div10
     shl ah,4
     or ax,dx
     mov byte ptr bcd[3],ah
     call @@div10
     mov dx,ax
     call @@div10
     shl ah,4
     or ax,dx
     mov byte ptr bcd[2],ah
     call @@div10
     mov dx,ax
     call @@div10
     shl ah,4
     or ax,dx
     mov byte ptr bcd[1],ah
     call @@div10
     mov dx,ax
     call @@div10
     shl ah,4
     or ax,dx
     mov byte ptr bcd[0],ah
     jmp @@exit

  @@div10:
     mov cl,10
     xor ax,ax
     mov al,byte ptr bin[5]
     div cl
     mov byte ptr bin[5],al
     mov al,byte ptr bin[4]
     div cl
     mov byte ptr bin[4],al
     mov al,byte ptr bin[3]
     div cl
     mov byte ptr bin[3],al
     mov al,byte ptr bin[2]
     div cl
     mov byte ptr bin[2],al
     mov al,byte ptr bin[1]
     div cl
     mov byte ptr bin[1],al
     mov al,byte ptr bin[0]
     div cl
     mov byte ptr bin[0],al
     ret

  @@exit:
  end

  for i := 0 to 7 do
    Write(Hex[bcd[i] shr 4], Hex[bcd[i] and $F]);
  Writeln;
end.

Второй вариант (циклы на основе "loop"):
program bcd2;

{$G+}

const
  Hex: array[0..15] of Char = '0123456789ABCDEF';

var
  bin: array[0..5] of Byte;
  bcd: array[0..7] of Byte;

  t: LongInt absolute bin;
  i: Integer;

begin
  t := 123456789;
{  t := 987654321; }
  asm
     push si
     push di
     push ds
     pop es
     std

     lea di,bcd[7]
     mov cx,8
  @@store:
     push cx
     call @@div10
     mov bx,ax
     call @@div10
     shl ah,4
     or ax,bx
     mov al,ah
     stosb
     pop cx
     loop @@store
     jmp @@exit

   @@div10:
     mov dl,10
     xor ax,ax
     lea si,bin[5]
     mov cx,6
   @@div:
     lodsb
     div dl
     mov [si+1],al
     loop @@div
     ret

  @@exit:
     pop di
     pop si
  end

  for i := 0 to 7 do
    Write(Hex[bcd[i] shr 4], Hex[bcd[i] and $F]);
  Writeln;
end.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Я так понял что суть твоего решения заключается в том что ты каждый байт двоичного числа поочереди делишь на десятичное 10, тем самым остаток и является десятичным разрядом...но результат будет не один и тот же если делить побайтно и делить все 6 байт сразу на 10....или я не прав????
Расскажи мне лучше как мне разделить вс 6 байт сразу на 10d
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Цитата
но результат будет не один и тот же если делить побайтно и делить все 6 байт сразу на 10....или я не прав????
Все зависит от того, что подразумевается под словом "побайтно" wink.gif

Здесь реализовано полноценное деление 48-битного двоичного числа на 10 (перенос осуществляется через ah). Оно выполняется побайтно за 6 интераций.

Цитата
Расскажи мне лучше как мне разделить вс 6 байт сразу на 10d
Это возможно только в 48-и и более разрядной архитектуре smile.gif

Сообщение отредактировано: xds -


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


ВСЁ понял.....спасибо

Это ещё возможно с использованием сопроцессора

М
невозможно, если читать первый пост



Сообщение отредактировано: FreeMan -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Цитата(F0b0s @ 13.11.2006 0:58) *

ВСЁ понял.....спасибо

Это ещё возможно с использованием сопроцессора

Ага smile.gif Можно ещё использовать 16-битное деление.

Сообщение отредактировано: xds -


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Мужской

Репутация: -  0  +


Вот сам тут кое чё написал.....тока преобразование не в BCD а в ASCII....то из одного другое сделать не сложно.....


NAME 


;...........................................
Data	 SEGMENT
 X1	DQ	000012345678ABCDh
 R	 DB	15 DUP(0)
 Data		ENDS

;...........................................
Code	 SEGMENT
		  ASSUME   CS:Code,DS:Data

;...........................................
  Start:	 MOV   AX,Data
			 MOV   DS,AX
			 LEA   SI,X1
			 LEA   BX,R
			 MOV   DI,10
			 MOV   BP,15
			 ADD   SI,(type X1 -2)
		 M2: XOR   Dl,DL
			 MOV   CX,4
		 M1: MOV   AX,[SI]
			 DIV   DI
			 MOV   [SI],AX
			 SUB   SI,2
			 DEC   CX
			 JNZ   M1
			 MOV   [BX],Dl
			 LEA   SI,X1
			 ADD   SI,(type X1-2)
			 INC   BX
			 DEC   BP
			 JNZ   M2

Code		 ENDS
			 END   Start

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 14.03.2025 7:24
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name