Программа на языке Ассемблер. Подпрограмма, преобразующую произвольное число из AX в формат упакованного BCD

Страницы работы

Содержание работы

РАСЧЕТНО-ГРАФИЧЕСКОЕ ЗАДАНИЕ 2

Задание

Написать программу на языке Ассемблер, выполняющую следующие действия: программа принимает с клавиатуры целое число, введенное в одном из форматов: в двоичном, восьмеричном, десятичном, шестнадцатеричном или троичном. К этому числу она прибавляет некоторое заданное в тексте программы число и либо выводит результат на экран в одном из указанных форматов, либо преобразует его в формат BCD и затем выводит его десятичное представление. Предполагается, что все числа беззнаковые, и при выходе значения числа за пределы 0-65535 старшие разряды теряются.

Варианты

Ниже в клетках указаны номера вариантов. Вверху - формат числа, введенного с клавиатуры. Слева – формат вывода или формат, в который предварительно преобразовывается результат сложения.

Ввод

2-ный

8-ный

10-ный

16-ный

3-ный

Вывод

Двоичный

1

7

13

19

25

Восьмеричный

2

8

14

20

26

Десятичный

3

9

15

21

27

Шестнадцатеричный

4

10

16

22

28

BCD-неупакованный

5

11

17

23

29

BCD-упакованный

6

12

18

24

30

ПРИМЕРЫ ВЫПОЛНЕНИЯ ЗАДАНИЯ

Пример 1

Пусть с клавиатуры вводится пятеричное число, к которому надо прибавить число 129 и результат преобразовать в неупакованный BCD-формат. Ввод, преобразование и вывод чисел описаны в пп. 5.3. и 5.4. Введенное число не больше 65535 и, значит, состоит не более чем из семи пятеричных цифр. Поэтому для ввода числа надо организовать цикл, который будет выполняться не более семи раз. В этом цикле введенное число будет формироваться в регистре bx, а его значение с вводом цифр будет формироваться по формуле

bx = 5*bx + цифра

Для преобразования в неупакованный формат BCD число делится на 10 и остаток записывается в младший байт строки, представляющей неупакованный формат BCD. Затем вновь результат делится на 10 и остаток записывается в следующий байт строки. Эту операцию достаточно произвести 5 раз. После этого преобразования полученная строка выводится на экран. Ее символы выводятся в обратном порядке, ибо байты с меньшими адресами содержат младшие цифры полученного числа. Выход из программы – CTRL/C.

Программа

< 1 >  title u5bcd.exe - from 5 to BCD unpacked

< 2 >  code  SEGMENT

< 3 >  assume cs:code, ds:code

< 4 >  main:

< 5 >  mov   ax,code

< 6 >  mov   ds,ax

< 7 >  again:

< 8 >  mov   si,5   ;пятеричное число

< 9 >  mov   bx,0   ;формируем значение в BX

< 10 >  mov    dl,'?'     ;подсказка

< 11 >  call   display

< 12 >  mov    cx,7       ;семь цифр, не более

< 13 >  next:

< 14 >  call   kbin       ;ввод символа в AL

< 15 >  cmp    al,' '     ;ввод до знака

< 16 >  je     back       ;пробела

< 17 >  mov    ah,0

< 18 >  and    al,00001111b ;ASCII-код ->цифра

< 19 >  mov    di,ax

< 20 >  mov    ax,bx

< 21 >  mul    si

< 22 >  add    ax,di            ;AX = 5*BX + цифра

< 23 >  mov    bx,ax

< 24 >  loop   next

< 25 >  back:

< 26 >  mov    dl,'='

< 27 >  call   display

< 28 >  mov    ax,bx

< 29 >  add    ax,129

< 30 >  call   pbcdn            ;преобразование в BCD неупакованный

< 31 >  call   crlf             ;с новой строки

< 32 >  jmp    again            ;ввод нового числа

< 33 >   

< 34 >  pbcdn      proc              ;AX в BCD неупакованный

< 35 >  mov    di,0

< 36 >  mov    cx,5             ;пять цифр

< 37 >  mov    si,10            ;делитель

< 38 >  a10:

< 39 >  mov    dx,0

< 40 >  div    si               ;(DX:AX)/SI->AX, остаток в DX

< 41 >  add    dl,'0'

< 42 >  mov    [di+offset bcdn],dl ;запись цифры

< 43 >  inc    di

< 44 >  loop   a10

< 45 >  lea    bx,bcdn

< 46 >  mov    cx,10

< 47 >  mov    si,9             ;начиная со старших

< 48 >  a20:

< 49 >  mov    dl,[bx+si] ;выводим цифры

< 50 >  call   display    ;строки BCD

< 51 >  dec    si

< 52 >  loop   a20

< 53 >  ret

< 54 >  bcdn db    10 dup('0')

< 55 >  pbcdn endp

< 56 >   

< 57 >  display proc          ;подпрограмма вывода

< 58 >  mov    ah,2             ;символа на экран

< 59 >  int    21h              ;из регистра DL

< 60 >  ret

< 61 >  display endp

< 62 >   

< 63 >  kbin proc              ;подпрограмма ввода

< 64 >  mov    ah,1             ;символа в AL

< 65 >  int    21h              ;с клавиатуры

< 66 >  ret

< 67 >  kbin endp

< 68 >   

Похожие материалы

Информация о работе