; Шапка программы
include MACROIO.INC ;включение макрокоманд
; Сегменты данных и стека
data segment
STR db 160 dup(?)
st1 db 'Матрица$'
st2 db 'Сумма $'
ste0 db 'Ошибка! Сумма превышает величину в слово!$'
ste1 db 'Ошибка! N<2 !$'
ste2 db 'Ошибка! Сумма меньше 0!$'
mas dw 1,2,3,4,5
dw 2,3,4,5,6
dw 3,4,5,6,7
dw 4,5,6,7,8
dw 5,6,7,8,9
smesh dw 5
result dw ?
data ends
stk segment stack 'stack'
db 512 dup(?)
stk ends
SEGMP1 SEGMENT 'CODE'
ASSUME CS:SEGMP1
PROCC PROC
PUSH BP
MOV BP,SP
MOV BL,AH
MOV BH,0
SHL BX,1
CALL CS:SUBAD[BX]
; ...
MOV SP,BP
POP BP
IRET ; выход
SUBAD DW subprog0,subprog1
PROCC ENDP
; Подпрограммы
subprog0 PROC
; тело подпрограммы с номером 0. Выводит массив
CMP CX,1
JL ER
@DispStr DI
@DispCh 13 10
MOV DX,CX
A: PUSH CX
PUSH DX
mputi 2,CX,SI,STR
@DispStr STR
@DispCh 13 10
POP DX
POP CX
DEC DX
jg A
JMP OK
ER: MOV AH,0
MOV DX,1
INT 64h
JMP OK
OK: RET
subprog0 ENDP
;
subprog1 PROC
; тело подпрограммы с номером 1. Считает сумму
CMP CX,2
JL ERROR1
MOV BX,CX
INC BX
SHL BX,1
XOR AX,AX
CYC:
ADD AX,[SI]
JB ERROR0 ;ПЕРЕПОЛНЕНИЕ
ADD SI,BX
LOOP CYC
CMP AX,0
JL ERROR2
MOV [DI],AX ;Если все нормально
JMP ALLR
ERROR0: MOV AH,0
MOV DX,0
INT 64h
JMP ALLR
ERROR1:
MOV AH,0
MOV DX,1
INT 64h
MOV AX,0
JMP ALLR
ERROR2: MOV AH,0
MOV DX,2
INT 64h
MOV [DI],AX
JMP ALLR
ALLR:
RET
subprog1 ENDP
SEGMP1 ENDS
SEGMP2 SEGMENT 'CODE'
ASSUME CS:SEGMP2
EPROC PROC
; обработка ошибок
PUSH BP
MOV BP,SP
MOV BL,AH
MOV BH,0
SHL BX,1
CALL CS:SUBER[BX]
; ...
MOV SP,BP
POP BP
IRET
SUBER DW errorprog0
EPROC ENDP
; Подпрограммы
errorprog0 PROC
; ЧТО ЗА ОШИБКА?
CMP DX,1
JE NEN
CMP DX,2
JE ZERO
@DispStr ste0
JMP EX
NEN: @DispStr ste1
JMP EX
ZERO: @DispStr ste2
EX: @DispCh 13 10
RET
errorprog0 ENDP
SEGMP2 ENDS
; Главная программа
codes segment 'code'
ASSUME CS:codes, DS:data, ES:data
START:
; Установка регистров DS и ES на сегмент данных
MOV AX,data
MOV DS,AX
MOV ES,AX
; ...
PUSH DS
@SetInt 65h,PROCC
@SetInt 64h,EPROC
POP DS
; ...
MOV DI,offset st1
MOV SI,offset mas
MOV CX,smesh
MOV AH,0
INT 65h
; !!!!!!!!!ВЫВОДИТЬСЯ МАТРИЦА!!!!!!!!!
MOV CX,smesh
MOV SI,offset mas
MOV DI,offset result
MOV AH,1
INT 65h
; !!!!!!!!!СЧИТАЕМ СУММУ!!!!!!!!!!
MOV DI,offset st2
MOV SI,offset result
MOV CX,1
MOV AH,0
INT 65h
; ВЫВОДИМ РЕЗУЛЬТАТ. СУММУ
@Exit
codes ends
END START
Поготите с лабой (двумерный массив)
Здравствуйте. Есть программа, которая подсчитывает сумму элементов главной диагонали, необходимо переделать программу, чтобы она вела подсчет суммы элементов побочной диагонали.
Код:
; Шапка программы
include MACROIO.INC ;включение макрокоманд
; Сегменты данных и стека
data segment
STR db 160 dup(?)
st1 db 'Матрица$'
st2 db 'Сумма $'
ste0 db 'Ошибка! Сумма превышает величину в слово!$'
ste1 db 'Ошибка! N<2 !$'
ste2 db 'Ошибка! Сумма меньше 0!$'
mas dw 1,2,3,4,3
dw 2,3,4,5,6
dw 3,4,5,6,7
dw 4,5,6,7,8
dw 5,6,7,8,9
smesh dw 5
result dw ?
data ends
stk segment stack 'stack'
db 512 dup(?)
stk ends
; Сегмент программы обработки прерывания
SEGMP1 SEGMENT 'CODE'
ASSUME CS:SEGMP1
PROCC PROC
; Стандартный пролог подпрограммы обработки прерывания
PUSH BP
MOV BP,SP
; Определение смещения в списке адресов по номеру
MOV BL,AH ; извлечение номера подпрограммы
MOV BH,0 ; и пересылка его с удвоением
SHL BX,1 ; в регистр BX
CALL CS:SUBAD[BX] ; обращение к подпрограмме
; ...
; Стандартный эпилог подпрограмы обработки прерывания
MOV SP,BP
POP BP
IRET ; выход из программы обработки прерывания
SUBAD DW subprog0,subprog1 ; список адресов подпрограмм
PROCC ENDP
; ...
; Подпрограммы
subprog0 PROC
; тело подпрограммы с номером 0. Выводит массив
CMP CX,1
JL ER
@DispStr DI
@DispCh 13 10
MOV DX,CX
A: PUSH CX
PUSH DX
mputi 2,CX,SI,STR
@DispStr STR
@DispCh 13 10
POP DX
POP CX
DEC DX
jg A
JMP OK
ER: MOV AH,1
MOV DX,1
INT 64h
JMP OK
OK: RET
subprog0 ENDP
;
subprog1 PROC
; тело подпрограммы с номером 1. Считает сумму
CMP CX,2
JL ERROR1
MOV BX,CX
DEC BX
SHL BX,1
XOR AX,AX
ADD SI,BX
CYC:
ADD AX,[SI]
JB ERROR0 ;ПЕРЕПОЛНЕНИЕ
ADD SI,BX
LOOP CYC
CMP AX,0
JL ERROR2
MOV [DI],AX ;Если все нормально
JMP ALLR
ERROR0: MOV AH,0
MOV DX,0
INT 64h
JMP ALLR
ERROR1:
MOV AH,0
MOV DX,1
INT 64h
MOV AX,0
JMP ALLR
ERROR2: MOV AH,0
MOV DX,2
INT 64h
MOV [DI],AX
JMP ALLR
ALLR:
RET
subprog1 ENDP
SEGMP1 ENDS
SEGMP2 SEGMENT 'CODE'
ASSUME CS:SEGMP2
EPROC PROC
; Стандартный пролог подпрограммы обработки ошибок
PUSH BP
MOV BP,SP
; Определение смещения в списке адресов по номеру
MOV BL,AH ; извлечение номера подпрограммы
MOV BH,0 ; и пересылка его с удвоением
SHL BX,1 ; в регистр BX
CALL CS:SUPAD[BX] ; обращение к подпрограмме
; ...
; Стандартный эпилог подпрограмы обработки прерывания
MOV SP,BP
POP BP
IRET ; выход из программы обработки прерывания
SUPAD DW errorprog0 ; список адресов подпрограмм
EPROC ENDP
; ...
; Подпрограммы
errorprog0 PROC
; тело подпрограммы с номером 0.++++
; ЧТО ЗА ОШИБКА?
CMP DX,1
JE NEN
CMP DX,2
JE ZERO
@DispStr ste0
JMP EX
NEN: @DispStr ste1
JMP EX
ZERO: @DispStr ste2
EX: @DispCh 13 10
RET
errorprog0 ENDP
SEGMP2 ENDS
; Главная программа
codes segment 'code'
ASSUME CS:codes, DS:data, ES:data
START:
; Установка регистров DS и ES на сегмент данных
MOV AX,data
MOV DS,AX
MOV ES,AX
; Установка вектора прерывания
PUSH DS ; сохранение DS
@SetInt 65h,PROCC ; установка вектора прерывания
; с номером 60h на программу MNTPR
@SetInt 64h,EPROC
POP DS ; восстановление DS
; Подготовка аргументов для обращения к подпрограмме n1
MOV DI,offset st1
MOV SI,offset mas
MOV CX,smesh
MOV AH,0
INT 65h ; обращение к подпрограмме с номером n1
; !!!!!!!!!ВЫВОДИТЬСЯ МАТРИЦА!!!!!!!!!
; Подготовка аргументов для обращения к подпрограмме поиска суммы
MOV CX,smesh
MOV SI,offset mas
MOV DI,offset result
MOV AH,1
INT 65h ; обращение к подпрограмме n2
; !!!!!!!!!СЧИТАЕМ СУММУ!!!!!!!!!!
MOV DI,offset st2
MOV SI,offset result
MOV CX,1
MOV AH,0
INT 65h
; ВЫВОДИМ РЕЗУЛЬТАТ. СУММУ
@Exit
codes ends
END START
include MACROIO.INC ;включение макрокоманд
; Сегменты данных и стека
data segment
STR db 160 dup(?)
st1 db 'Матрица$'
st2 db 'Сумма $'
ste0 db 'Ошибка! Сумма превышает величину в слово!$'
ste1 db 'Ошибка! N<2 !$'
ste2 db 'Ошибка! Сумма меньше 0!$'
mas dw 1,2,3,4,3
dw 2,3,4,5,6
dw 3,4,5,6,7
dw 4,5,6,7,8
dw 5,6,7,8,9
smesh dw 5
result dw ?
data ends
stk segment stack 'stack'
db 512 dup(?)
stk ends
; Сегмент программы обработки прерывания
SEGMP1 SEGMENT 'CODE'
ASSUME CS:SEGMP1
PROCC PROC
; Стандартный пролог подпрограммы обработки прерывания
PUSH BP
MOV BP,SP
; Определение смещения в списке адресов по номеру
MOV BL,AH ; извлечение номера подпрограммы
MOV BH,0 ; и пересылка его с удвоением
SHL BX,1 ; в регистр BX
CALL CS:SUBAD[BX] ; обращение к подпрограмме
; ...
; Стандартный эпилог подпрограмы обработки прерывания
MOV SP,BP
POP BP
IRET ; выход из программы обработки прерывания
SUBAD DW subprog0,subprog1 ; список адресов подпрограмм
PROCC ENDP
; ...
; Подпрограммы
subprog0 PROC
; тело подпрограммы с номером 0. Выводит массив
CMP CX,1
JL ER
@DispStr DI
@DispCh 13 10
MOV DX,CX
A: PUSH CX
PUSH DX
mputi 2,CX,SI,STR
@DispStr STR
@DispCh 13 10
POP DX
POP CX
DEC DX
jg A
JMP OK
ER: MOV AH,1
MOV DX,1
INT 64h
JMP OK
OK: RET
subprog0 ENDP
;
subprog1 PROC
; тело подпрограммы с номером 1. Считает сумму
CMP CX,2
JL ERROR1
MOV BX,CX
DEC BX
SHL BX,1
XOR AX,AX
ADD SI,BX
CYC:
ADD AX,[SI]
JB ERROR0 ;ПЕРЕПОЛНЕНИЕ
ADD SI,BX
LOOP CYC
CMP AX,0
JL ERROR2
MOV [DI],AX ;Если все нормально
JMP ALLR
ERROR0: MOV AH,0
MOV DX,0
INT 64h
JMP ALLR
ERROR1:
MOV AH,0
MOV DX,1
INT 64h
MOV AX,0
JMP ALLR
ERROR2: MOV AH,0
MOV DX,2
INT 64h
MOV [DI],AX
JMP ALLR
ALLR:
RET
subprog1 ENDP
SEGMP1 ENDS
SEGMP2 SEGMENT 'CODE'
ASSUME CS:SEGMP2
EPROC PROC
; Стандартный пролог подпрограммы обработки ошибок
PUSH BP
MOV BP,SP
; Определение смещения в списке адресов по номеру
MOV BL,AH ; извлечение номера подпрограммы
MOV BH,0 ; и пересылка его с удвоением
SHL BX,1 ; в регистр BX
CALL CS:SUPAD[BX] ; обращение к подпрограмме
; ...
; Стандартный эпилог подпрограмы обработки прерывания
MOV SP,BP
POP BP
IRET ; выход из программы обработки прерывания
SUPAD DW errorprog0 ; список адресов подпрограмм
EPROC ENDP
; ...
; Подпрограммы
errorprog0 PROC
; тело подпрограммы с номером 0.++++
; ЧТО ЗА ОШИБКА?
CMP DX,1
JE NEN
CMP DX,2
JE ZERO
@DispStr ste0
JMP EX
NEN: @DispStr ste1
JMP EX
ZERO: @DispStr ste2
EX: @DispCh 13 10
RET
errorprog0 ENDP
SEGMP2 ENDS
; Главная программа
codes segment 'code'
ASSUME CS:codes, DS:data, ES:data
START:
; Установка регистров DS и ES на сегмент данных
MOV AX,data
MOV DS,AX
MOV ES,AX
; Установка вектора прерывания
PUSH DS ; сохранение DS
@SetInt 65h,PROCC ; установка вектора прерывания
; с номером 60h на программу MNTPR
@SetInt 64h,EPROC
POP DS ; восстановление DS
; Подготовка аргументов для обращения к подпрограмме n1
MOV DI,offset st1
MOV SI,offset mas
MOV CX,smesh
MOV AH,0
INT 65h ; обращение к подпрограмме с номером n1
; !!!!!!!!!ВЫВОДИТЬСЯ МАТРИЦА!!!!!!!!!
; Подготовка аргументов для обращения к подпрограмме поиска суммы
MOV CX,smesh
MOV SI,offset mas
MOV DI,offset result
MOV AH,1
INT 65h ; обращение к подпрограмме n2
; !!!!!!!!!СЧИТАЕМ СУММУ!!!!!!!!!!
MOV DI,offset st2
MOV SI,offset result
MOV CX,1
MOV AH,0
INT 65h
; ВЫВОДИМ РЕЗУЛЬТАТ. СУММУ
@Exit
codes ends
END START