Лістинг програми на Assembler

 

STACKSG SEGMENT PARA STACK 'Stack'

    DW  80 DUP(?)

STACKSG ENDS

;----------------------------------------------------------------------------

DATASG SEGMENT PARA 'Data'

HANDLE DW 0

MIN DW  0fff0H                 ;минимальный элемент

MAX DW  0

SREDN DW  0

TEN DB 10

 

IN_FNAME DB  "IN.DAT",0      ;имя входного файла

OUT_FNAME DB  "OUT.DAT",0     ;имя выходного файла

 

NUMROWS DW  1                  ;количество строк

NUMCOLS DW  1                  ;количество столбцов

ROW    DW  0

TMP    DW ?                  ;temporary cell

BUFFER DB  64 DUP(5)          ;буфер ввода

 

stringlen  DB?

STRING     DB 4  DUP(?)    ;temporary string

DATASG ENDS

 

CODESG SEGMENT PARA 'Code'

BEGIN PROC FAR

ASSUME CS:CODESG,DS:DATASG,SS:STACKSG

    PUSH DS

    SUB AX,AX

    PUSH AX

    MOV AX,DATASG

    MOV DS,AX

    CALL LOAD_FROM_FILE        ;вызов

    CALL CALCULATE              ;пользовательских

    CALL SAVE_TO_FILE          ;процедур

    RET

BEGIN ENDP

 

LOAD_FROM_FILE PROC NEAR

    MOV AH,03Dh             ;­

    MOV AL,0C2h             ; открытие файла

    MOV   DX,OFFSET IN_FNAME;‑

    INT 21h

    MOV HANDLE,AX

 

   mov BX,0

   push BX

   @Cicle1:

    MOV BX,HANDLE

    MOV AH,03Fh             ;­

    MOV CX,1                   ; считываем 1 байт в буфер

    MOV DX,OFFSET NUMROWS;‑

    INT 21h

    cmp NUMROWS,32; Space

    jz @EndCicle1

           sub NUMROWS,48

           pop BX

           mov AX,BX

           mul TEN

           add AX,NUMROWS

           mov BX,AX

           push BX

   jmp @Cicle1

   @EndCicle1:

   pop BX

   mov NUMROWS,BX

 

   mov BX,0

   push BX

   @Cicle2:

    MOV BX,HANDLE

    MOV  AH,03Fh             ;­

    MOV CX,1                   ; считываем 1 байт в буфер

    MOV DX,OFFSET NUMCOLS;‑

    INT 21h

    cmp NUMCOLS,32; Space

    jz @EndCicle2

           sub NUMCOLS,48

           pop BX

           mov AX,BX

           mul TEN

           add AX,NUMCOLS

           mov BX,AX

           push BX

   jmp @Cicle2

   @EndCicle2:

   pop BX

   mov NUMCOLS,BX

 

   mov BX,0

   push BX

   @Cicle3:

    MOV BX,HANDLE

    MOV AH,03Fh             ;­

    MOV CX,1                   ; считываем 1 байт в буфер

    MOV DX,OFFSET ROW;‑

    INT 21h

    cmp ROW,32; Space

    jz @EndCicle3

           sub ROW,48

           pop BX

           mov AX,BX

           mul TEN

           add AX,ROW

           mov BX,AX

           push BX

   jmp @Cicle3

   @EndCicle3:

   pop BX

   mov ROW,BX

 

    MOV AX,NUMROWS

    MOV CX,NUMCOLS

    MUL CX                   ; AX = NUMROWS * NUMCOLS

   mov CX,AX

 

   mov SI,0

   @GlobalCicle:

           push CX

 

           mov BX,0

           push BX

           @Cicle4:

            MOV BX,HANDLE

            MOV AH,03Fh             ;­

            MOV CX,1                    ; считываем 1 байт в буфер

            MOV DX,OFFSET TMP;‑

            INT 21h

            cmp TMP,32; Space

            jz @EndCicle4

                   sub TMP,48

                   pop BX

                   mov AX,BX

                   mul TEN

                   add AX,TMP

                   mov BX,AX

                   push BX

           jmp @Cicle4

           @EndCicle4:

 

           pop BX

           mov buffer[SI],BL

           inc SI

 

           pop CX

   loop @GlobalCicle

 

    MOV Ah,3Eh

    MOV BX,HANDLE

    INT 21H

    RET

LOAD_FROM_FILE ENDP

CALCULATE PROC NEAR

     MOV BX, OFFSET BUFFER

    MOV AX, ROW

    MOV CX,NUMCOLS

    MUL CX

    MOV SI,AX

    MOV CX, NUMCOLS

    mov DX,SI

    mov al,[bx+si]

   xor ah,ah

    mov min,ax

    mov max,ax

   mov sredn,ax

    dec cx

    inc si

   jcxz @endcycle

@CYCLE1:

    MOV Al, [BX+SI]

   xor ah,ah

    CMP AX,MIN

    JA @NEXT1

    MOV MIN, AX

@NEXT1:

    inc SI

    LOOP @CYCLE1

    MOV CX, NUMCOLS

    MOV SI,DX

@CYCLE2:

    MOV Al, [BX+SI]

   xor ah,ah

    CMP AX,MAX

    JB @NEXT2

    MOV MAX, AX

@NEXT2:

    inc SI

    LOOP @CYCLE2

 

    MOV AX,MIN

    ADD AX,MAX

    SHR AX,1

    MOV SREDN,AX

@ENDCYCLE:

    RET

CALCULATE ENDP

SAVE_TO_FILE PROC NEAR

    MOV AH,03Ch            ;­

    MOV CX,0               ; открытие файла

    MOV DX,OFFSET OUT_FNAME;‑

    INT 21h

    MOV HANDLE,AX

   mov AX,min

   push AX

   mov stringlen,0

 

   @2Cicle1:

           pop AX

           xor ah,ah

           or AL,AL

           jz @2EndCicle1

 

           mov BX,AX

           div TEN

           push AX

           mul TEN

           sub BX,AX

           add BX,48; '0'

 

           mov CL,stringlen

           or CL,CL

           jz @end_disl1

           xor CH,CH

           mov SI,CX

 

           @dislocation1:

                   mov AL, string[SI-1]

                   mov string[SI], AL

                   dec SI

           loop @dislocation1

           @end_disl1:

           inc stringlen

 

           mov String[0],BL

 

           jmp @2Cicle1

   @2EndCicle1:

   MOV BX,HANDLE          ;­

   MOV AH,040h            ;¦

   MOV CL,stringlen        ; сохранение MIN

   xor ch,ch

   MOV DX,OFFSET string   ;‑

   INT 21h

 

   mov MIN,32; Space

   MOV BX,HANDLE

   MOV AH,040h

   MOV CX,1

   MOV DX,OFFSET MIN

   INT 21h

 

   mov AX,max

   push AX

   mov stringlen,0

 

   @2Cicle2:

           pop AX

           xor ah,ah

           or AL,AL

           jz @2EndCicle2

 

           mov BX,AX

           div TEN

           push AX

           mul TEN

           sub BX,AX

           add BX,48; '0'

 

           mov CL,stringlen

           or CL,CL

           jz @end_disl2

           xor CH,CH

           mov SI,CX

 

           @dislocation2:

                   mov AL, string[SI-1]

                   mov string[SI], AL

                   dec SI

           loop @dislocation2

           @end_disl2:

           inc stringlen

 

           mov String[0],BL

 

           jmp @2Cicle2

   @2EndCicle2:

   MOV BX,HANDLE          ;­

   MOV AH,040h            ;¦

   MOV CL,stringlen       ; сохранение MAX

   xor ch,ch

   MOV     DX,OFFSET string   ;‑

   INT 21h

 

   mov MIN,32; Space

   MOV BX,HANDLE

   MOV AH,040h

   MOV CX,1

   MOV DX,OFFSET MIN

   INT 21h

 

   mov AX,sredn

   push AX

   mov stringlen,0

 

   @2Cicle3:

           pop AX

           xor ah,ah

           or AL,AL

           jz @2EndCicle3

 

           mov BX,AX

           div TEN

           push AX

           mul TEN

           sub BX,AX

           add BX,48; '0'

 

           mov CL,stringlen

           or CL,CL

           jz @end_disl3

           xor CH,CH

           mov SI,CX

 

           @dislocation3:

                   mov AL, string[SI-1]

                   mov string[SI], AL

                   dec SI

           loop @dislocation3

           @end_disl3:

           inc stringlen

 

           mov String[0],BL

 

           jmp @2Cicle3

   @2EndCicle3:

   MOV BX,HANDLE          ;­

   MOV AH,040h            ;¦

   MOV CL,stringlen       ; сохранение SREDN

   xor ch,ch

   MOV DX,OFFSET string   ;‑

   INT 21h

 

   mov MIN,32; Space

   MOV BX,HANDLE

   MOV AH,040h

   MOV CX,1

   MOV DX,OFFSET MIN

   INT 21h

 

 

    MOV Ah,3Eh

    MOV BX,HANDLE

    INT 21H

    RET

SAVE_TO_FILE ENDP

CODESG ENDS

    END BEGIN


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



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