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

< 69 >  crlf proc              ;переход на

< 70 >  mov    dl,10            ;новую строку

< 71 >  call   display

< 72 >  mov    dl,13

< 73 >  call   display

< 74 >  ret

< 75 >  crlf endp

< 76 >  code ENDS

< 77 >       end   main

Пример 2

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

Написать подпрограмму, используя команду xlat для получения кода BCD чисел, принимающих значения от 0 до 99 – например, код BCD числа 28 будет равен 28h. Число из AX делится на 100 и код BCD, соответствующий остатку от деления, записывается по адресу строки, содержащей байты формата BCD. Затем полученное частное вновь делится на 100 и записывается следующий байт BCD. Эта операция повторяется 5 раз. После преобразования полученная строка BCD выводится в главной программе с помощью подпрограммы hex, описанной в главе 5.

Программа

< 1 >  title a21.exe -- from 10 to BCD compressed

< 2 >  code  segment

< 3 >  assume cs:code, ds:code

< 4 >  main:

< 5 >  mov   ax,code

< 6 >  mov   ds,ax

< 7 >  again:

< 8 >  mov   si,10

< 9 >  mov   bx,0        ; into bx

< 10 >  mov    dl,'?'

< 11 >  call   display

< 12 >  mov    cx, 5

< 13 >  next:

< 14 >  call   kbin

< 15 >  cmp    al,' '

< 16 >  je     back

< 17 >  mov    ah,0

< 18 >  and    al, 00001111b

< 19 >  mov    di,ax

< 20 >  mov    ax,bx

< 21 >  mul    si

< 22 >  add    ax, di

< 23 >  mov    bx, ax

< 24 >  loop   next

< 25 >  back:

< 26 >  mov    dl,'='

< 27 >  call   display

< 28 >  mov    ax,bx

< 29 >  call   pbcd

< 30 >  lea    bx,bcd

< 31 >  add    bx,2

< 32 >  mov    dl,[bx]

< 33 >  call   hex

< 34 >  lea    bx,bcd

< 35 >  add    bx,1

< 36 >  mov    dx,[bx]

< 37 >  call   hex

< 38 >  lea    bx,bcd

< 39 >  add    bx,0

< 40 >  mov    dx,[bx]

< 41 >  call   hex

< 42 >  call   crlf

< 43 >  jmp    again

< 44 >   

< 45 >  pbcd proc        ; ax to bcd

< 46 >  push   di

< 47 >  push   si

< 48 >  mov    di,0

< 49 >  mov    cx, 3

< 50 >  mov    si,100

< 51 >  a10:

< 52 >  mov    dx,0

< 53 >  div    si

< 54 >  push   ax

< 55 >  mov    al,dl

< 56 >  lea    bx,tablebcd

< 57 >  xlat

< 58 >  mov [di+offset bcd], al

< 59 >  inc    di

< 60 >  pop    ax

< 61 >  loop   a10

< 62 >  pop    si

< 63 >  pop    di

< 64 >  ret

< 65 >  bcd  dt    12345

< 66 >  tablebcd db 00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h, 08h, 09h

< 67 >  db 10h, 11h, 12h, 13h, 14h, 15h, 16h, 17h, 18h, 19h

< 68 >  db 20h, 21h, 22h, 23h, 24h, 25h, 26h, 27h, 28h, 29h

< 69 >  db 30h, 31h, 32h, 33h, 34h, 35h, 36h, 37h, 38h, 39h

< 70 >  db 40h, 41h, 42h, 43h, 44h, 45h, 46h, 47h, 48h, 49h

< 71 >  db 50h, 51h, 52h, 53h, 54h, 55h, 56h, 57h, 58h, 59h

< 72 >  db 60h, 61h, 62h, 63h, 64h, 65h, 66h, 67h, 68h, 69h

< 73 >  db 70h, 71h, 72h, 73h, 74h, 75h, 76h, 77h, 78h, 79h

< 74 >  db 80h, 81h, 82h, 83h, 84h, 85h, 86h, 87h, 88h, 89h

< 75 >  db 90h, 91h, 92h, 93h, 94h, 95h, 96h, 97h, 98h, 99h

< 76 >  pbcd endp

< 77 >   

< 78 >  display    proc

< 79 >  mov    ah,2

< 80 >  int    21h

< 81 >  ret

< 82 >  display    endp

< 83 >   

< 84 >  kbin proc  near

< 85 >  mov    ah,1

< 86 >  int    21h

< 87 >  ret

< 88 >  kbin endp

< 89 >   

< 90 >  hex proc near

< 91 >  mov    ax,cs

< 92 >  mov    ds,ax ; set ds=cs

< 93 >  push   dx

< 94 >  mov    bx,offset table

< 95 >  mov    al,dl

< 96 >  shr    al, 1

< 97 >  shr    al, 1

< 98 >  shr    al, 1

< 99 >  shr    al, 1

< 100 >  xlatb             ;translate

< 101 >  mov    dl,al

< 102 >  call   display

< 103 >  pop    ax

< 104 >  and    al,00001111b

< 105 >  xlatb             ;translate

< 106 >  mov    dl,al

< 107 >  call   display

< 108 >  ret

< 109 >table      db    '0123456789ABCDEF'

< 110 >hex  endp

< 111 > 

< 112 >crlf proc  near

< 113 >  mov dl,10

< 114 >  call display

< 115 >  mov dl,13

< 116 >  call display

< 117 >  ret

< 118 >crlf endp

< 119 >code ends

< 120 >     end main

< 121 >