dosseg
.model small
.stack 200h
.data
A dw ?
B dw ?
H dw ?
V dw ?
SA db 'Input length: $'
SB db 0dh,0ah,'Input width: $'
SH db 0dh,0ah,'Input height: $'
SV db 0dh,0ah,'Volume = $'
; ----- данные для ввода чисел -----
cr = 0dh
lf = 0ah
string db 255,0,255 dup(?)
errmsg db 'Invalid character! Use digits only.',cr,lf,'$'
negflag dw ?
.code
; ====================================
; Ввод целого числа
; Результат -> AX
; ====================================
IntegerIn proc
start:
mov ah,0Ah
lea dx,string
int 21h
xor ax,ax
lea si,string+2
mov negflag,ax
cmp byte ptr [si],'-'
jne m2
not negflag
inc si
jmp m3
m2:
cmp byte ptr [si],'+'
jne m3
inc si
m3:
cmp byte ptr [si],cr
je ex1
cmp byte ptr [si],'0'
jb err1
cmp byte ptr [si],'9'
ja err1
mov bx,10
mul bx
sub byte ptr [si],'0'
add al,[si]
adc ah,0
inc si
jmp m3
err1:
lea dx,errmsg
mov ah,9
int 21h
jmp start
ex1:
cmp negflag,0
je ex
neg ax
ex:
ret
IntegerIn endp
; ====================================
; Вывод числа из AX
; ====================================
IntegerOut proc
xor cx,cx
mov bx,10
cmp ax,0
jge m
neg ax
push ax
mov ah,2
mov dl,'-'
int 21h
pop ax
m:
inc cx
xor dx,dx
div bx
push dx
or ax,ax
jnz m
m1:
pop dx
add dx,'0'
mov ah,2
int 21h
loop m1
ret
IntegerOut endp
; ====================================
; Volume(A,B,H)
; AX = A * B * H
; параметры передаются через стек
; ====================================
Volume proc near
push bp
mov bp,sp
mov ax,[bp+8] ; A
mov bx,[bp+6] ; B
mul bx ; AX=A*B
mov bx,[bp+4] ; H
mul bx ; AX=A*B*H
pop bp
ret 6
Volume endp
; ====================================
; Главная программа
; ====================================
Begin:
mov ax,@data
mov ds,ax
; ----- ввод длины -----
mov ah,9
lea dx,SA
int 21h
call IntegerIn
mov A,ax
; ----- ввод ширины -----
mov ah,9
lea dx,SB
int 21h
call IntegerIn
mov B,ax
; ----- ввод высоты -----
mov ah,9
lea dx,SH
int 21h
call IntegerIn
mov H,ax
; ----- вычисление объема -----
mov ax,A
push ax
mov ax,B
push ax
mov ax,H
push ax
call Volume
mov V,ax
; ----- вывод результата -----
mov ah,9
lea dx,SV
int 21h
mov ax,V
call IntegerOut
; ----- выход -----
mov ax,4C00h
int 21h
end Begin