Цель работы изучить шаблон comпрограммы преобразования суммы десятичных чисел, введенных с клавиатуры, в шестнадцатеричную систему исчисления преобразования суммы десятичных чисел, введенных с клавиатуры, в десятичную систему исчисления Ход работы
Скачать 458.13 Kb.
|
Цель работы: изучить шаблон COM-программы преобразования суммы десятичных чисел, введенных с клавиатуры, в шестнадцатеричную систему исчисления; преобразования суммы десятичных чисел, введенных с клавиатуры, в десятичную систему исчисления; Ход работы Составим программу для преобразования суммы чисел и переведения результата в шестнадцатеричную систему исчисления (код программы представлен в «Приложении 1»). Рис. 1 – Результат работы программы Составим программу для преобразования суммы чисел и переведения результата в десятичную систему исчисления (код программы представлен в «Приложении 2»). Рис. 2 – Результат выполнения программы Рис. 3 – Проверка правильности работы программы Вывод: провели сборку COM-программ, воспользовавшись командой «tlink /t». Протестировали работу программы, выполняя ввод различных чисел с клавиатуры. Была выполнена проверка правильного преобразования десятичного числа в шестнадцатеричное. «Приложение №1» .model tiny .code .286 org 100h start: mov dx,offset message1 mov ah,9 int 21h mov dx,offset buffer mov ah,0Ah int 21h mov dx,offset crlf mov ah,9 int 21h ;Перевод числа в ASCII формате из буфера в бинарное число АХ xor di,di xor ax,ax mov cl,blength xor ch,ch xor bx,bx mov si,cx mov cl,10 asc2hex: mov bl,byte ptr bcontents[di] sub bl,'0' jb asc_error cmp bl,9 ja asc_error mul cx add ax,bx inc di cmp di,si jb asc2hex mov per_a,ax mov ax,0 start1: mov dx,offset message2 mov ah,9 int 21h mov dx,offset buffer mov ah,0Ah int 21h mov dx,offset crlf mov ah,9 int 21h ;Перевод числа в ASCII формате из буфера в бинарное число АХ xor di,di xor ax,ax mov cl,blength xor ch,ch xor bx,bx mov si,cx mov cl,10 asc2hex1: mov bl,byte ptr bcontents[di] sub bl,'0' jb asc_error cmp bl,9 ja asc_error mul cx add ax,bx inc di cmp di,si jb asc2hex1 add ax,per_a ;Вывод на экран строки message2 push ax mov ah,9 mov dx,offset message3 int 21h pop ax ;Вывод на экран числа из регистра АХ vyvod: push ax xchg ah,al call print_al pop ax call print_al ret asc_error: mov dx,offset err_msg mov ah,9 int 21h ret ;Процедура print_al. Выводит на экран число в регистре AL в шестнадцатеричном формате, модифицирует значение регистров AX и DX print_al: mov dh,al and dh,0Fh shr al,4 call print_nibble mov al,dh print_nibble: cmp al,10 sbb al,69h das mov dl,al mov ah,2 int 21h ret message1 db "A= $" message2 db "B= $" message3 db "A+B= $" err_msg db "Error Input" crlf db 0Dh,0Ah,'$' per_a dw 0 buffer db 6 blength db ? bcontents: end start «Приложение №2» .model tiny .code .286 org 100h start: mov dx,offset message1 mov ah,9 int 21h mov dx,offset buffer mov ah,0Ah int 21h mov dx,offset crlf mov ah,9 int 21h ;Перевод числа в ASCII формате из буфера в бинарное число АХ xor di,di xor ax,ax mov cl,blength xor ch,ch xor bx,bx mov si,cx mov cl,10 asc2hex: mov bl,byte ptr bcontents[di] sub bl,'0' jb asc_error cmp bl,9 ja asc_error mul cx add ax,bx inc di cmp di,si jb asc2hex mov per_a,ax mov ax,0 start1: mov dx,offset message2 mov ah,9 int 21h mov dx,offset buffer mov ah,0Ah int 21h mov dx,offset crlf mov ah,9 int 21h ;Перевод числа в ASCII формате из буфера в бинарное число АХ xor di,di xor ax,ax mov cl,blength xor ch,ch xor bx,bx mov si,cx mov cl,10 asc2hex1: mov bl,byte ptr bcontents[di] sub bl,'0' jb asc_error cmp bl,9 ja asc_error mul cx add ax,bx inc di cmp di,si jb asc2hex1 mov per_b,ax add ax,per_a mov per_x,ax ;Вывод на экран строки message2 push ax mov ah,9 mov dx,offset message3 int 21h pop ax ;Вывод на экран числа из регистра АХ call print_al ret asc_error: mov dx,offset err_msg mov ah,9 int 21h ret print_al:; Процедура вывода на экран mov cx,10 ; система счисления lea si, ascval+4 ; Установка указателя на конец массива ascval mov ax, per_x ; Результат х занести в ax c20: cmp ax,10 ; Сравнить результат с числом 10 jb c30 ; Если меньше то преобразовывать не надо xor dx,dx ; Очистка регистра dx для команды деления div cx ; Делим на 10 or dl, 30h ; Преобразование остатка к ASCII коду mov [si], dl ; Занесение остатка от деления в массив ascval dec si ; Перемещение указателя массива на 1 байт влево jmp c20 ; Переход на начало для преобразования след. цифры c30: or al, 30h ; Если остаток меньше 10, то вывод результата на экран mov [si], al ; дисплея командами (см. ниже) lea dx, ascval ; Загрузка адреса массива mov ah, 9 ; Вызов 9-ой функции MS-DOS int 21h ret ; Возврат в головную программу из п/программы ascval db 5 dup(30h),'$' ;Зарезервировать 5 байт и поместить туда 30h message1 db "A= $" message2 db "B= $" message3 db "A+B= $" err_msg db "Error Input" crlf db 0Dh,0Ah,'$' per_a dw 0 per_b dw 0 per_x dw ? buffer db 6 blength db ? bcontents: end start |