< 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 >
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.