Текст программы:
title LAB3
page ,132
DSEG segment para public 'data'
DATA db 3Bh,20h,0Dh,32h,0A1h,24h,0A0h,0Dh,0,0Ah,20h
db 0B0h,40h,24h,0E1h,0Dh,0,24h,3Bh,30h,0C0h,0Dh
db 20h,97h,3Bh,83h,0,0A0h,20h,0D0h,27h,20h,0C6h
db 91h,0,20h,0FEh,3Bh,90h,0,3Bh,24h,17h,20h,24h
MEN db 'summa <= -16', 0Ah,0Dh,24h
SER db '-16
BOL db 'summa polozhitelna',0Ah,0Dh,24h
NET db 'kod CR ne najden',0Ah,0Dh,24h
DSEG ends
CSEG segment para public 'code'
assume ds:DSEG,cs:CSEG,ss:SSEG
JUMP proc far
;сохраняем адрес возврата
push ds
sub ax,ax
push ax
;инициализация сегмента данных
mov ax,DSEG
mov ds,ax
;поиск начального элемента в DATA
mov cx,4 ;счетчик внешних циклов
mov dx,45 ;счетчик внутренних циклов
lea si,DATA;начальный адрес данных
dec si
;начало внешнего цикла
EXT: push cx ;сохранение счетчика внешних циклов
mov cx,dx ;загрузка счетчика внутренних циклов
;вложенный цикл
LOC: inc si
cmp byte ptr[si],0Dh ; код CR?
loopne LOC
;продолжение внешнего цикла
jne NO ;код не найден
mov dx,cx
pop cx ;восстановление сч. внешних циклов
loop EXT
;сложение 5 байт без самого большого
mov cx,4 ;подготовка цикла
inc si
mov al,byte ptr[si]
cbw ;расширение знака
mov dx,ax
mov bx,ax
inc si
A: mov al,byte ptr[si]
cbw
add bx,ax
cmp dx,ax
jg B
mov dx,ax
B: inc si
loop A
sub bx,dx ;вычитание наибольшего элемента
;вывод сообщений
cmp bx,0
jg BO ;переход, если сумма >0
cmp bx, -16
jg SE ;переход, если сумма >-16, но<0
lea dx,MEN;выод сообщения, что сумма <=-16
mov ah,9h
int 21h
jmp FIN
BO: lea dx,BOL
mov ah,9h
int 21h
jmp FIN
SE: lea dx,SER
mov ah,9h
int 21h
jmp FIN
NO: lea dx,NET
mov ah,9h
int 21h
FIN: ret
JUMP endp ;конец процедуры
CSEG ends ;конец сегмента кода
SSEG segment para stack 'stack'
db 256 dup(?)
SSEG ends
end JUMP
Блок-схема нахождения суммы
![Блок-схема нахождения суммы](http://codingrus.ru/images/assembler/006.JPG) |