Код:
.model small
data segment
msg_a db 13,10, "a = ", '$'
msg_b db 13,10, "b = ", '$'
msg_c db 13,10, "c = ", '$'
msg_d db 13,10, "d = ", '$'
msg_result db 13,10, "a*c*(a+b)-d = ", '$'
a db ?
b db ?
c db ?
d dw ?
result dw ?
data ends
stk segment stack
db 256 dup(?)
stk ends
code segment
assume cs: code, ds: data, ss: stk
start:
mov ax, data
mov ds, ax
Vvod_peremenou:
mov ah, 09h
lea dx, [msg_a]
int 21h
mov di, (offset store_A)
jmp ReadInt16
store_A:
mov [a], al
mov ah, 09h
lea dx, [msg_b]
int 21h
mov di, (offset store_B)
jmp ReadInt16
store_B:
mov [b], al
mov ah, 09h
lea dx, [msg_c]
int 21h
mov di, (offset store_C)
jmp ReadInt16
store_C:
mov [c], al
mov ah, 09h
lea dx, [msg_d]
int 21h
mov di, offset store_D
jmp ReadInt16
store_D:
mov [d], ax
Vichislenia:
mov al,[a]
imul [c]
mov bx, ax
mov al,[a]
add al,[b]
cbw
imul bx
sub ax,[d]
mov [result], ax
Vivod_resultata:
mov ah, 09h
lea dx, [msg_result]
int 21h
mov ax, [result]
Vivod_result:
mov bx, 10 ;основание системы счисления (делитель)
xor cx, cx ;количество символов в модуле числа
or ax, ax ;для отрицательного числа
jns _div
neg ax ;поменять знак (сделать положительным)
push ax ;и вывести на экран символ "-" (минус)
mov ah, 02h
mov dl, '-'
int 21h
pop ax
_div: ;делим число на 10
xor dx, dx
div bx
push dx ;остаток сохраняем в стеке
inc cx ;количество цифр в числе
or ax, ax
jnz _div ;повторяем, пока в числе есть цифры
mov ah, 02h
store:
pop dx ;извлекаем цифры (остатки от деления на 10) из стека
add dl, '0' ;преобразуем в символы цифр
int 21h ;и выводим их на экран
loop store
ReadInt16:
xor bx, bx ;очищение от мусора, туда будет заносится признак положительного или отрицательного числа
xor cx, cx ;очищение от мусора счетчика
do:
mov ah, 00h ;читать следующий символ
int 16h
mov dl, al ;записываем в dl введенное число
cmp al, 0Dh ;сравниваем не Enter ли это был
je _break; перейдем, если равен Enter
cmp al, '-';проверка на знак введенного числа
jne @endif; если минус,то перейдём
mov bx, 1; положим признак знака в bx
jmp putchar
@endif:
sub al, '0';это число?
jc do; если нет - возвращаемся,будет возвращать ,если в 6-том разряде ноль
cmp al, 9+1
jnc do;так как символ буквы нам не нужен
xor ah, ah
shl cx, 1 ;cx=cx*10
mov si, cx
shl cx, 1
shl cx, 1
add cx, si
add cx, ax ;cx=cx+ax
putchar:
mov ah, 02h
int 21h
jmp do
_break:
mov ax, cx;тогда полностью обнулим и введенное значение и функцию для считывания символа
test bx, bx; проверяем это ноль
jz exit; если Да,то перейдем
neg ax;Нет, тогда сделаем же число положительным
exit:
jmp di
; выводит знаковое 16-разрядное число из регистра AX на экран
; на входе:
; ax - число для отображения
; на выходе:
; число на экране
;завершение программы
mov ax, 4C00h
code ends
end start