Загрузка данных


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