
![]() |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
![]() ![]() |
![]() |
F0b0s |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Мужской Репутация: ![]() ![]() ![]() |
Всё.....я уже ни чё не понимаю......
![]() |
xds |
![]()
Сообщение
#2
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата в десятичное(BCD) В упакованное (две цифры в байте, например 23d -> 23h) или неупакованное (одна цифра в байте, 23d -> 02h, 03h)?-------------------- The idiots are winning.
|
F0b0s |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Мужской Репутация: ![]() ![]() ![]() |
В упакованное
|
xds |
![]()
Сообщение
#4
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
В виде вставок пойдёт?
Первый вариант (развёрнутые циклы): 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.
|
F0b0s |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я так понял что суть твоего решения заключается в том что ты каждый байт двоичного числа поочереди делишь на десятичное 10, тем самым остаток и является десятичным разрядом...но результат будет не один и тот же если делить побайтно и делить все 6 байт сразу на 10....или я не прав????
Расскажи мне лучше как мне разделить вс 6 байт сразу на 10d |
xds |
![]()
Сообщение
#6
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата но результат будет не один и тот же если делить побайтно и делить все 6 байт сразу на 10....или я не прав???? Все зависит от того, что подразумевается под словом "побайтно" ![]() Здесь реализовано полноценное деление 48-битного двоичного числа на 10 (перенос осуществляется через ah). Оно выполняется побайтно за 6 интераций. Цитата Расскажи мне лучше как мне разделить вс 6 байт сразу на 10d Это возможно только в 48-и и более разрядной архитектуре ![]() Сообщение отредактировано: xds - -------------------- The idiots are winning.
|
F0b0s |
![]()
Сообщение
#7
|
|||
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Мужской Репутация: ![]() ![]() ![]() |
ВСЁ понял.....спасибо
Это ещё возможно с использованием сопроцессора
Сообщение отредактировано: FreeMan - |
|||
xds |
![]()
Сообщение
#8
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
ВСЁ понял.....спасибо Это ещё возможно с использованием сопроцессора Ага ![]() Сообщение отредактировано: xds - -------------------- The idiots are winning.
|
F0b0s |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот сам тут кое чё написал.....тока преобразование не в 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
|
![]() ![]() |
![]() |
Текстовая версия | 14.03.2025 7:15 |