P.S.: файл .asm соответсвенно должен называеться 1.asm, а экзешник 1.exe
text segment
text segment
assume cs:text,ds:data,ss:stk
zapusk db 0
begin:
mov ax,data
mov ds,ax
cmp cs:zapusk,10
jne J1
jmp avaria
J1:
mov bh,cs:zapusk
add bh,1
mov zapusk2,bh
mov ah,09h
mov dx,offset message
int 21h
;otkritie fayla
mov ah,3dh
mov al,2
mov dx,offset filename
int 21h
jnc J2
jmp error
J2:
mov diskriptor,ax
;chtenie zagolovka
mov ah,3fh
mov bx,diskriptor
mov cx,512
mov dx,offset header
int 21h
jnc J3
jmp error
J3:
;poisk jacheyki dlja hranenija chisla zapuskov
mov dx,header+08h
add dx,header+16h
mov cl,4
shl dx,cl
mov cx,0
mov ah,42h
mov al,0
mov bx,diskriptor
int 21h
jnc J4
jmp error
;zapis v fayl
J4:
mov ah,40h
mov bx,diskriptor
mov cx,1
mov dx,offset zapusk2
int 21h
jnc P1
jmp error
P1:
;выводим сообщение о вводе числа
mov ah,09h
mov dx,offset message3
int 21h
;вводим с клавиатуры число
mov bx,0 ;номер страницы
mov cx, len_string ;записываем количество повторений ввода символа
lea dx,string ;записываем символы в массив string
mov ah,3fh ;номер функции
int 21h
sub ax,2
mov bx,ax
;получаем из цифр число
mov si,0 ;номер элемента массива string
cikl1:
cmp si,bx ;сравниваю цифру числа с числом 10, чтобы проверить что была введена цифра с клавиатуры
jnb M1 ;если равно, то выходим из цикла
mov ax,chislo1 ;записываю число в 10-ной СС в ах
mul ten ;умножаю число на 10
sub string[si],30h ;вычитаю из кода символа 48, чтобы получить цифру
add ax,string[si] ;прибавляю к ax цифру числа
mov ah,0
mov chislo1,ax ;записываю результат в chislo
inc si ;увеличиваю номер элемента на 1
jmp cikl1 ;если меньше, то переходим на cikl1
M1:
;выводим сообщение о вводе числа
mov ah,09h
mov dx,offset message3
int 21h
;вводим с клавиатуры число
mov bx,0 ;номер страницы
mov cx, len_string ;записываем количество повторений ввода символа
lea dx,string ;записываем символы в массив string
mov ah,3fh ;номер функции
int 21h
sub ax,2
mov bx,ax
;получаем из цифр число
mov si,0 ;номер элемента массива string
cikl2:
cmp si,bx ;сравниваю цифру числа с числом 10, чтобы проверить что была введена цифра с клавиатуры
jnb M2 ;если равно, то выходим из цикла
mov ax,chislo2 ;записываю число в 10-ной СС в ах
mul ten ;умножаю число на 10
sub string[si],30h ;вычитаю из кода символа 48, чтобы получить цифру
add ax,string[si] ;прибавляю к ax цифру числа
mov ah,0
mov chislo2,ax ;записываю результат в chislo
inc si ;увеличиваю номер элемента на 1
jmp cikl2 ;если меньше, то переходим на cikl1
M2:
cmp chislo1, 0FAh ;правильные ли числа введены?
jl z1
jmp err1
Z1:
cmp chislo2, 0FAh
jl M4
jmp err1
M4:
mov ax, chislo1 ;начало суммы, в ах 1-ое число
mov bx, chislo2 ;в bx 2-ое число
add bx, ax ;складываем
mov chislo3, bx ;результат в chislo3
R2:
mov ax, chislo3 ;в ах сумму(модуль разности)
mov chast, ax
mov si, 0
mov itter, 0 ;обнуляем кол-во повторений
cikl3: ;деление на 10, подготовка к выводу
mov ax, chast
div ten ;делим на 10
mov ost[si], ah ;остаток от деления в ost
inc itter ;увеличиваем кол-во повторений
mov ah, 0 ;обнуляем ah, в al частное
mov chast, ax ;чстное от деления в chast
inc si ;увеличиваем эл-т массива ost
cmp chast, 0 ;сранвиваем частное с 0
jne cikl3 ;если не равно то повторяем
mov ah,09h ;подфункция вывода строки
cmp f, 1 ;смотрим выводилась ли сумма
je R3 ;если выводилась
mov dx,offset summa ;выводим сообщение сумма
int 21h
jmp vivod ;уходим на вывод
R3:
mov dx, offset raznost ;записываем в dx строку разность
cmp i, 1 ;смотрим отрицательная или положительбная разность
je R4 ;если отрицательная разность
int 21h
jmp vivod ;уходим на вывод
R4:
mov dx, offset raznost1 ;записываем в dx сообщение для отрицательной разности
int 21h
Vivod:
mov si, 4 ;si=4
mov cx, itter ;в cx кол-во повторений
mov ah, 02h ;водфункция вывода символа для int 21h
cikl4:
cmp ost[si], 0 ;сравниваем остаток с нулём
jne M3 ;если не равно, то уходим из цикла
cmp cx, si ;сраниваем cx И si
jg M3 ;если cx больше, то уходим из цикла
dec si ;уменьшаем si
jmp cikl4
M3:
mov dl, ost[si] ;в dl выводимое число
add dl, 30h ;преобразуем число в символ
int 21h
dec si ;уменьшаем si
loop cikl4 ;если si не 0 то повторяем cikl4
inc f ;увеличиваем флаг(признак), того выводилась ли уже сумма или нет
cmp f, 2 ;сравниваем флаг с 2
je konec ;если вывели разность то выходим
mov ax, chislo1 ;начало разности, в ax 1-ое число
mov bx, chislo2 ;в bx 2-ое число
mov chislo3, 0h ;обнуляем результат
cmp bx, ax ;сравниваем 2-ое число с 1-ым
jg R1 ;если больше 2-ое
sub ax, bx ;если 1-ое больше, то вычитаем из него 2-ое
; jnc R6 ;так тоже пробывал
; neg ax
;R6:
mov chislo3, ax ;результат в chislo3
jmp R2 ;уходим на подготовку и вывод
R1:
sub bx, ax ;если больше 2-ое вычитаем из него 1-ое
; jnc R5
; neg bx
;R5:
mov chislo3, bx ;результа в chislo3
inc i ;увеличиваем флаг отрицательности разности
jmp R2 ;уходим на подготовку и вывод
err1: ;вывод сообщения о том что введено неверное число и выход
mov ah, 09h
mov dx, offset error1
int 21h
jmp konec
jmp konec
avaria:
mov ah,09h
mov dx,offset message2
int 21h
mov ah,0
int 16h
konec:
mov ax,4c00h
int 21h
error:
mov cx,ax
mov ah,09h
mov dx,offset errormessage
int 21h
mov ah,02h
mov dl,cl
int 21h
jmp konec
text ends
data segment
message db 10,13,'Programma rabotaet$',10,13
message2 db 10,13,'Vremja isteklo',13,10,'Nazhmite lubuju klavishu$',10,13
filename db '2.EXE',0
diskriptor dw 0
header dw 256 dup(0)
errormessage db 10,13,'Oshibka rabotji s faylom $'
zapusk2 db 0
message3 db 10,13,"Vvedite chislo iz (0;250], $"
summa db 10,13,'summa = $',10,13
raznost db 10,13,'raznost = $',10,13
raznost1 db 10,13,'raznost = -$',10,13
error1 db 10,13,'nevernii vvod$',10,13
ost db 4 dup (0) ;массив остатков из 4-х эл-ов
chast dw ? ;частное от деления
itter dw 0 ;число повторений
f db 0 ;флаг суммы
i db 0 ;флаг отрицательности разности
string dw 4 dup (0) ;массив, который будет содержать 4 цифры числа
len_string =$-string ;длина массива
chislo1 dw 0 ;число в 10-ной СС
chislo2 dw 0 ;число в 10-ной СС
chislo3 dw 0 ;число в 10-ной СС
ten db 10
mas db 4 dup (0) ;массив из 4 эл-тов, содержащих число 10, который будет содержать цифры числа в новой СС
data ends
stk segment stack
db 256 dup(0)
ends
end begin