Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поготите с лабой (двумерный массив)

69K
16 марта 2011 года
Black_bit
2 / / 16.03.2011
Здравствуйте. Есть программа, которая подсчитывает сумму элементов главной диагонали, необходимо переделать программу, чтобы она вела подсчет суммы элементов побочной диагонали.
Помогите пожалуйта!
Код:
; Шапка программы
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
69K
17 марта 2011 года
Black_bit
2 / / 16.03.2011
Все, разобрался...

Код:
; Шапка программы
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
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог