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


dosseg
.model small
.stack 200h

.data

A dw ?
B dw ?
H dw ?
V dw ?

SA db 'Input length: $'
SB db 13,10,'Input width: $'
SH db 13,10,'Input height: $'
SV db 13,10,'Volume = $'

string db 255,0,255 dup(?)

errmsg db 'Invalid character! Use digits only.',13,10,'$'

negflag dw ?

.code

; ===========================
; Ввод целого числа
; ===========================

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 m3

    not negflag
    inc si

m3:

    cmp byte ptr [si],13
    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

; ===========================
; Объем параллелепипеда
; V = A * B * H
; ===========================

Volume proc near

    push bp
    mov bp,sp

    mov ax,[bp+8]
    mov bx,[bp+6]
    mul bx

    mov bx,[bp+4]
    mul bx

    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