Задание
Написать программу на языке Ассемблер, выполняющую следующие действия: программа принимает с клавиатуры целое число, введенное в одном из форматов: в двоичном, восьмеричном, десятичном, шестнадцатеричном или троичном. К этому числу она прибавляет некоторое заданное в тексте программы число и либо выводит результат на экран в одном из указанных форматов, либо преобразует его в формат 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 >
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.