Перевод из двоично-десятичной системы в двоичную - Assembler
Формулировка задачи:
Народ. Я недавно начал изучать ассемблер, научился от силы два десятичных числа складывать... Передо мной задача написать программу, которая переводила бы число из двоично-десятичной СС (BCD) в двоичную СС.
Я понимаю как сделать это перевод на бумаге или на языках более высокого уровня, но на ассемблере я не знаю даже как записать это BCD число в программу, не говоря уже о переводе в двоичную СС.
Пишу в Flat assembler. Поделитесь необходимой инфой для написания проги. Хотя от готового кода тоже не откажусь) Легче было бы в нем покапаться и понять что к чему, чем перерывать тонны документации.
Заранее благодарен.
Решение задачи: «Перевод из двоично-десятичной системы в двоичную»
textual
Листинг программы
- .model flat
- check proto c ,:dword
- .data
- bcd db 057h, 076h, 041h, 093h ; это число записанное в двоично-десятичном формате 93417657=93417657h -> 059170b9h
- n equ ($-bcd)*8 ; размер двоичного числа не будет больше, поэтому преобразование на месте bcd
- .code
- public main
- main proc
- ; индексы битов с 1
- mov esi, 0 ; индекс начала уже готового хвоста бинарного числа
- first:
- inc esi
- cmp esi, n
- ja stop
- mov edi, esi ; вычислим индекс начала проверяемого фрагмента
- and edi, 11b
- jnz next
- add edi, 4
- next:
- add edi, n
- second:
- ; проверяем фрагмент
- sub edi, 4
- cmp edi, esi
- jbe first
- invoke check, edi
- jmp second
- stop:
- xor ax, ax
- ret
- main endp
- check proc c, x:dword
- ; индекс начала проверяемого фрагмента из 4-х бит
- mov ebx, x
- mov ecx, ebx
- dec ebx
- shr ebx, 3
- ; определяем сколько байт придется прочитать
- and ecx, 007h
- cmp ecx, 3
- ja read_one_byte
- add ecx, 8
- cmp ecx, 8
- je read_one_byte
- ; требуется прочитать два байт
- mov ax, word ptr [bcd+ebx-1] ; извлекаем
- sub ecx, 4
- shr ax, cl ; сдвигаем
- and ax, 00fh ; вырезаем последние 4 бита
- cmp ax, 4 ; если больше 4, то вычитаем 3
- jbe quit
- sub ax, 3
- shl ax, cl ; сдвигаем назад изменившиеся биты
- mov dx, 1111b ; готовим маску
- shl dx, cl
- not dx
- and word ptr [bcd+ebx-1], dx; вырежим фрагмент маской
- or word ptr [bcd+ebx-1], ax; запишем измененный фрагмент
- jmp quit
- ; требуется прочитать один байт
- read_one_byte:
- movzx ax, byte ptr [bcd+ebx]
- sub ecx, 4
- shr ax, cl
- and ax, 00fh
- cmp ax, 4 ; если больше 4, то вычитаем 3
- jbe quit
- sub ax, 3
- shl ax, cl
- mov dx, 1111b ; готовим маску
- shl dx, cl
- not dx
- and byte ptr [bcd+ebx], dl; вырежим фрагмент маской
- or byte ptr [bcd+ebx], al; запишем измененный фрагмент
- quit:
- ret
- check endp
- end
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д