Перевод из двоично-десятичной системы в двоичную - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д