Цель работы:
Получение первых навыков программирования на ассемблере.
Текст процедуры Sub_and_show:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Sub_and_show proc Sub al,bl ; вычесть (AL=AL-BL) js not_carry ; и вывести на экран push ax; mov ah,2h ; знак цифры результата mov dl,'-' ; c помощью функции DOS int 21h ; pop ax; neg al; not_carry: neg al; add al,30h ; преобразовать код в число push ax; mov ah,2h ; вывести младшую цифру mov dl,al ; результата с помощью int 21h ; функции DOS pop ax; ret ; вернуться в вызывающую программу Sub_and_show endp |
№ | Название | Вход | Выход |
1 | Ввод символа | ah <- 01h | al – введённый символ |
2 | Вывод символа | ah <- 2
dl <- ASCII код |
Вывод нужного символа |
3 | Вывод строки | ah <- 09h
dx <- адрес строки |
Вывод строки |
4 | Завершение программы | ah <- 4ch | Завершение программы |
Полный текст изменённой программы «lab1.asm»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
; Демонстрационная программа сложения двух ; одноразрядных; беззнаковых чисел ; Для построения рабочей версии используйте команды: ; >tasm demo; ; >tlink demo; ; >demo ; Резервирoвание места под стек sseg segment stack 'stack' dw 256 dup(?) sseg ends ; Определение данных data segment ; Сообщения пользователю msg1 db 10,13,'Program subbing two digits:' db 10,13,'Input first digit: ','$' msg2 db 10,13,'Input second digit: ','$' msg3 db 10,13,'Result = ','$' data ends ; Сегмент кода code segment assume cs:code,ds:data,ss:sseg start: mov ax,data ; настроить сегментный mov ds,ax ; регистр DS на данные lea dx,msg1 ; вывести сообщение call print_msg ; call input_digit ; ввести первое число mov bl,al ; и сохранить в регистре BL lea dx,msg2 ; вывести сообщение call print_msg ; call input_digit ; ввести второе число lea dx,msg3 ; вывести сообщение call print_msg ; call Sub_and_show ;сложить и вывести результат mov ah,4ch ; завершить программу int 21h ; и выйти в DOS ;Подпрограмма вывода сообщения на дисплей ; Вход : DS:DX - адрес сообщения ; Выход : вывод сообщения на дисплей print_msg proc push ax ; сохранить AX mov ah,09h ; вывести сообщение с int 21h ; помощью функции DOS pop ax ; восстановить AX ret ; вернуться в вызывающую программу print_msg endp ;Подпрограмма ввода числа с клавиатуры ; Вход : набранная с клавиатуры цифра ; Выход : в AL - введенное число input_digit proc input_again: mov ah,01h ; ввести символ с клавиатуры int 21h ; с помощью функции DOS cmp al,'0' ; если символ не цифра, jl input_again ; то повторить ввод cmp al,'9' ; jg input_again ; sub al,30h; преобразовать код символа в число ret ; вернуться в вызывающую программу input_digit endp ; Подпрограмма сложения двух чисел ;Вход:AL,BL–слагаемые,выход:вывод результата на дисплей Sub_and_show proc Sub al,bl ; вычесть (AL=AL-BL) js not_carry ; push ax; mov ah,2h ; вывод знака цифры результата mov dl,'-' ; c помощью функции DOS int 21h ; pop ax; neg al; not_carry: neg al; add al,30h ; преобразовать код в число push ax; mov ah,2h ; вывести младшую цифру mov dl,al ; результата с помощью int 21h ; функции DOS pop ax; ret ; вернуться в вызывающую программу Sub_and_show endp code ends end start |