Текст программы, реализующий алгоритм

 

.model small

.386

.stack 100h

.data

    str1 db 09h,0d5h,"========",0B8h,0ah,0dh

              db "Enter a ", 0b3h,09h, " ",0b3h,0ah,0dh

              db 09h, 0c3h,"========",0b4h,0ah,0dh

              db "Enter b ",0b3h,09h, " ",0b3h,0ah,0dh

              db 09h, 0c3h,"========",0b4h,0ah,0dh

              db "Result:",0b3h,09h, " ",0b3h,0ah,0dh

              db 09h, 0d4h,"========",0beh,0ah,0dh, '$'

    InBufa   DB 7         

    kola DB?

    a   DB?,?,?,?,?,?,?

 

    InBufb   DB 7

    kolb DB?

    b  DB?,?,?,?,?,?,?

 

    Error DB "Input data ERROR!!!", 0dh, 0ah, '$'

    DivErr   DB "Dividing by Zero!!!", 0dh, 0ah, '$'

    chA DW 0

    chB DW 0

    tabl DW 10000, 1000, 100, 10, 1

    ResBin  DW 0        

    ResBCD DB '+', '0',?,?,?,?, 0ah, 0dh, '$'

    kol db 3

    flag db 0

.code

    include math.lib

.startup

    cls

    locate 0,0

    mov ax,dgroup

    mov ds,ax

        

cikl:           

    mov flag, 0

    mov chA, 0

    mov chB, 0

    mov ResBin, 0

    mov bp, offset ResBCD

    mov ds:[bp], '+'

    mov ds:[bp+1], '0'

    mov ds:[bp+2],?

    mov ds:[bp+3],?

    mov ds:[bp+4],?

    mov ds:[bp+5],?

 

 

    mov al, 3

    mov ah, kol

    sub al, ah

    imul ax, 7

    locate 0, al

    push ax

; Вывод таблицы

    mov dx,offset str1

    mov ah,09h

    int 21h

 

; Ввод чисел

    pop ax

    push ax

    inc al

    locate     10, al

    mov dx,offset InBufa

    mov ah,0ah

    int 21h

    pop ax

    push ax

    add al, 3

    locate     10, al

    mov dx,offset InBufb

    mov ah,0ah

    int 21h

 

; Проверка на числа

    prov InBufA

    prov InBufB

 

; Проверка на знак

    znak a

    znak b

 

; ASCII > BIN

    ASCII_2_BIN kola, chA

    ASCII_2_BIN kolb, chB

 

    funtion

        

; Bin 2 Ascii

    mov cx, 5

    mov bp, offset tabl

    mov si, offset ResBCD

    inc si

v:

    mov bx, ds:[bp]

    mov dx, 0

    idiv bx

    cmp al, 0

    je  nul

    mov flag, 1

    add al, 30h

    mov ds:[si], al

    inc si

    jmp nol

 

nul: cmp flag, 0

    je  nol

    mov ds:[si], 30h

    inc si

nol: mov ax, dx

    add bp, 2

    loop v

 

; Выход_1

    pop ax

    add al, 5

    locate 10, al

    mov dx, offset ResBCD

    mov ah, 09h

    int 21h

    locate 0, 35

    dec kol

    jnz cikl   

; Выход                       

    jmp ex

Er: cls

    locate 25, 8

    mov dx, offset Error

    mov ah, 09h

    int 21h

    jmp ex

DEr: locate 25, 9

    mov dx, offset DivErr

    mov ah, 09h

    int 21h

ex:

.exit(0)

END

 

Листинг кода библиотеки string.lib, в которой находятся макросы, вызываемые в данной программе

 

IFDEF @Model

IFIDN @Model, <1>

TINYMODEL TYPEDEF

ENDIF

ENDIF

 

cls macro

    push ax                       

    push bx                       

    push cx

    push dx

    mov cx,0                     

    mov dh,24                  

    mov dl,79                   

    mov ah,6                    

    mov al,0                     

    mov bh,7

    int 10h                     

    pop dx                       

    pop cx

    pop bx

    pop ax

    endm

 

locate macro col,row

    push dx

    mov dh,row

    mov dl,col

    move_cursor

    pop dx

    endm

 

 

move_cursor macro

    LOCAL ok,vs

    push ax                       

    push bx                       

    cmp dh,24                  

    jna ok                       

    sub dh,dh

ok: cmp dl,79

    jna vs

    sub dl,dl

vs: mov ah,15                  

    int 10h                     

    mov ah,2                    

    int 10h                     

    pop bx                       

    pop ax

endm

 

prov macro InBuf

    local c1

    mov bp, offset InBuf

    inc bp

    mov ch, 0

    mov cl, ds:[bp]

    dec cl

    add bp, 2

 

c1:         cmp byte ptr [ds:[bp]], 30h

              jl  Er

              cmp byte ptr [ds:[bp]], 39h

              ja  Er

              inc bp

    loop c1

endm

 

znak macro per

    local m1

    cmp per, '-'

    je  m1   

    cmp per,'+'

    jne Er     

m1:

endm

 

ASCII_2_BIN macro kol, res

    local p, plus

    mov bp, offset kol

    mov bx, offset kol

    mov ax, 0

    mov al, ds:[bx]

    add bp, ax        

 

    mov ch, 0

    mov cl, ds:[bx]

    dec cl

 

    mov bx, offset tabl

    add bx, 8

 

    mov ax, 0

    mov dx, 0

p: mov ax, ds:[bx]

    mov dl, ds:[bp]

    sub dl, 30h

    imul ax, dx

    add res, ax

    sub bx, 2

    sub bp, 1

    dec cx

    jnz p

        

; Проверка на знак

    mov bp, offset kol

    add bp, 1

    cmp ds:byte ptr[bp], '-'

    jne plus

    neg res

plus:

endm

 

funtion macro

 

;Задание:

; b / a - 1, если a>b;

;Y = -295, если a=b;

; (a - 235) / b, если a<b;

 

    mov ax, chA

    mov bx, chB

    cmp ax, bx

    jne net

    cmp ax, 0

    je  equal

net:

    mov bp, offset a

    mov si, offset b

    mov dl, ds:[bp]

    mov dh, ds:[si]

    cmp dl, dh

    jl  more

    ja  low   

    cmp dl, '-'

    jne pl

    cmp ax, bx

    jg  more

    je  equal

    ja  low

        

pl: cmp ax, bx

    ja  more

    je  equal

    jl  low

more: cmp al, 0

    je  DEr

    mov ax, chB

    mov bx, ax

    and bx, 7FFFh

    cmp ax, bx

    je  pluss

    mov dx,0FFFFh

    jmp did

 

pluss:    mov dx, 0

 

did: idiv chA

    sub ax,1

    jmp www

 

equal:    mov ax, 00h

    sub ax,295

    jmp www

 


low: cmp bl, 0

    je  DEr

 

    mov ax,chA

    sub ax,235

        

    mov bx, ax

    and bx, 7FFFh

    cmp ax, bx

    je  plu2

    mov dx,0FFFFh

    jmp mnu2

plu2: mov dx, 0

mnu2:

    idiv chB

                  

www:    mov bx, ax

    and bx, 7FFFh

    cmp ax, bx

    je  OK

    neg ax

    mov ResBCD, '-'

OK: mov ResBin, ax

endm




Строки


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: