Перевод из двоично-десятичной системы в двоичную - Assembler

Узнай цену своей работы

Формулировка задачи:

Народ. Я недавно начал изучать ассемблер, научился от силы два десятичных числа складывать... Передо мной задача написать программу, которая переводила бы число из двоично-десятичной СС (BCD) в двоичную СС. Я понимаю как сделать это перевод на бумаге или на языках более высокого уровня, но на ассемблере я не знаю даже как записать это BCD число в программу, не говоря уже о переводе в двоичную СС. Пишу в Flat assembler. Поделитесь необходимой инфой для написания проги. Хотя от готового кода тоже не откажусь) Легче было бы в нем покапаться и понять что к чему, чем перерывать тонны документации. Заранее благодарен.

Решение задачи: «Перевод из двоично-десятичной системы в двоичную»

textual
Листинг программы
  1.     .model flat
  2. check proto c ,:dword
  3.     .data
  4. bcd db 057h, 076h, 041h, 093h ; это число записанное в двоично-десятичном формате 93417657=93417657h -> 059170b9h
  5. n   equ ($-bcd)*8 ; размер двоичного числа не будет больше, поэтому преобразование на месте bcd
  6.                  
  7.     .code
  8. public main
  9. main proc
  10.     ; индексы битов с 1
  11.     mov esi, 0           ; индекс начала уже готового хвоста бинарного числа   
  12. first: 
  13.     inc esi
  14.     cmp esi, n
  15.     ja stop
  16.    
  17.     mov edi, esi         ; вычислим индекс начала проверяемого фрагмента
  18.     and edi, 11b
  19.     jnz next
  20.     add edi, 4
  21. next:
  22.     add edi, n          
  23.    
  24. second:
  25.     ; проверяем фрагмент
  26.     sub edi, 4
  27.     cmp edi, esi
  28.     jbe first
  29.     invoke check, edi
  30.     jmp second       
  31.  
  32. stop:  
  33.     xor ax, ax
  34.     ret
  35. main endp
  36.  
  37. check proc c, x:dword
  38.     ; индекс начала проверяемого фрагмента из 4 бит
  39.     mov ebx, x
  40.     mov ecx, ebx
  41.     dec ebx
  42.     shr ebx, 3
  43.  
  44.     ; определяем сколько байт придется прочитать
  45.     and ecx, 007h
  46.     cmp ecx, 3
  47.     ja read_one_byte   
  48.     add ecx, 8
  49.     cmp ecx, 8
  50.     je read_one_byte   
  51.  
  52.     ; требуется прочитать два байт
  53.     mov ax, word ptr [bcd+ebx-1] ; извлекаем
  54.     sub ecx, 4
  55.     shr ax, cl                 ; сдвигаем
  56.     and ax, 00fh               ; вырезаем последние 4 бита
  57.    
  58.     cmp  ax, 4                 ; если больше 4, то вычитаем 3
  59.     jbe  quit
  60.     sub  ax, 3                
  61.     shl  ax, cl                ; сдвигаем назад изменившиеся биты
  62.    
  63.     mov  dx, 1111b             ; готовим маску
  64.     shl  dx, cl
  65.     not  dx
  66.  
  67.     and  word ptr [bcd+ebx-1], dx; вырежим фрагмент маской  
  68.     or   word ptr [bcd+ebx-1], ax; запишем измененный фрагмент
  69.     jmp quit
  70.  
  71.     ; требуется прочитать один байт
  72. read_one_byte:
  73.     movzx ax, byte ptr [bcd+ebx]
  74.     sub ecx, 4
  75.     shr ax, cl
  76.     and ax, 00fh
  77.    
  78.     cmp  ax, 4                 ; если больше 4, то вычитаем 3
  79.     jbe  quit
  80.     sub  ax, 3            
  81.     shl  ax, cl
  82.  
  83.     mov  dx, 1111b             ; готовим маску
  84.     shl  dx, cl
  85.     not  dx
  86.  
  87.     and  byte ptr [bcd+ebx], dl; вырежим фрагмент маской    
  88.     or   byte ptr [bcd+ebx], al; запишем измененный фрагмент
  89. quit:
  90.     ret
  91. check endp
  92. end

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


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

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

8   голосов , оценка 4.125 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы