Перевод из двоично-десятичной системы в двоичную - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы