Формирование массива и 10 двухбайтных чисел, переписать во второй массив все положительные числа

Страницы работы

10 страниц (Word-файл)

Содержание работы

Задание № 1 (вариант № 4):

Сформировать массив и 10 двухбайтных чисел. Переписать во второй массив все положительные числа.

Текст программы:

1)

STACKSG     SEGMENT PARA USE16

A     DW    25 DUP(0)

B     DW    25 DUP(0)

С     DB    1  DUP(0)

ENTS DB    0AH,0DH,24H

FIN   DB    'fin.txt',00H

FOUT  DB    'fout.txt',00H

STACKSG ENDS

CODESG      SEGMENT PARA'Code'

BEGIN PROC FAR

      ASSUME DS:STACKSG,CS:CODESG

      MOV AX,STACKSG

      MOV DS,AX

;Чтение с клавиатуры и запись в массив А

      MOV CX,10

      LEA SI,A         

M100: MOV AH,01H

      INT 21H

      MOV [SI],AL

      INT 21H

      MOV [SI+1],AL

      INT 21H

      MOV [SI+2],AL

      INT 21H

      MOV [SI+3],AL

      MOV [SI+4],20H

      ADD SI,5   

      MOV AH,09H

      LEA DX,ENTS

      INT 21H

      LOOP M100

;Сравнение

      LEA SI,A

      LEA DI,B   

      MOV CX,10  

M0:   MOV AL,[SI]

      CMP AL,37H

      JG M1

      ADD SI,5

      LOOP M0

      JMP M3

M1:   MOV BL,[SI]

      MOV [DI],BL

      MOV BL,[SI+1]

      MOV [DI+1],BL

      MOV BL,[SI+2]

      MOV [DI+2],BL

      MOV BL,[SI+3]

      MOV [DI+3],BL

      MOV BL,[SI+4]

      MOV [DI+4],BL

      ADD SI,5

      ADD DI,5

      LOOP M0    

M3:

      MOV AH,09H

      LEA DX,ENTS

      INT 21H

      LEA DX,B   

      MOV AH,09H

      INT 21H    

        MOV AX,4C00H

      INT 21H

BEGIN       ENDP

CODESG      ENDS

        END BEGIN

2)

        seg_data segment para public 'data'

         mas_in  dw           0ah dup ('?')

         mas_out dw           0ah dup ('#')

         razrad                     dw  0ah

         des_t                      dw  2710h

         tis                        dw  1000

         sot                        dw  100

         des                        dw  10

         fmas_in  db          80 dup ('#')

         fmas_out db          80 dup ('#')

         file_in  db          "C:\files\in.dat",0

         file_out db          "C:\files\out.dat",0

        seg_data ends

        seg_stack segment stack

         db                   256 dup ('?')

        seg_stack             ends

        seg_code segment para public 'code'

         main    proc

          assume  ds:seg_data, cs:seg_code, ss:seg_stack

          mov      ax,seg_data

          mov    ds,ax

; Обнуляем регистры

          mov    ax,0

          mov    bx,0

          mov    cx,0

          mov    dx,0

          mov    si,0

          mov    di,0

; Открываем файл с первым массивом

          mov    ax,3d00h

          lea      dx,file_in

          int            21h

; Читаем данные из файла

read:   mov   bx,ax

        mov   ah,3fh

        mov   cx,80

        lea   dx,fmas_in

        int   21h

; Закрываем файл с первым массивом

        mov         ah,3eh

              int         21h

; Ввод элементов массива

ent:    xor bx,bx

      mov   al,fmas_in[si]

      add   si,1

            cmp    al,2dh

            jne          ddd

            push   1

          jmp     dd4   

ddd:   push 0

dd4:  mov    al,fmas_in[si]

          add     si,1

sub          al,30h

          xor     ah,ah

          add     bx,ax

          mov    cx,4

cikl:

          mov     al,fmas_in[si]

          add     si,1        

          push   ax

          mov    ax,bx

          mul    razrad

          mov    bx,ax

          pop     ax

          sub     al,30h

          xor     ah,ah

          add     bx,ax

          loop    cikl

          add     si,2

          jmp     zap

; Запись

zap:        pop   ax

      cmp    ax,1

          jne      dd2

          neg      bx

dd2:   mov    mas_in[di],bx

          xor     bx,bx

          add     di,2

          cmp    di,20

          jb        ent

          xor     si,si

          xor      di,di

          jmp     srav

; Сравнение

srav:   mov     ax,mas_in[si]

          add       si,2

          cmp      si,20

          ja          print

          cmp      ax,0

          jge        srav

          mov      mas_out[di],ax

          add       di,2

          jmp      srav

print:  xor   dx,dx

      xor     ax,ax

      push     di

      xor      si,si

      xor   di,di              

dd3:   xor  bx,bx

      mov    ax,mas_out[si]

          neg      ax

          mov    bx,ax

          mov    fmas_out[di],2dh

          add     di,1

          xor      ax,ax

          xor      dx,dx

          mov    ax,bx

          div      des_t

          mov    cx,dx

          add     al,30h

          mov    fmas_out[di],al

          add     di,1

          xor     dx,dx

          mov    ax,cx

          div      tis

          mov    cx,dx

          add     al,30h

          mov    fmas_out[di],al

          add     di,1

          xor     ax,ax

          xor     dx,dx

          mov    ax,cx

          div      sot

          mov    cx,dx

          add     al,30h

          mov    fmas_out[di],al

          add     di,1

          xor     ax,ax

          xor     dx,dx

          mov    ax,cx

          div      des

          mov    cx,dx

          add     al,30h

          mov    fmas_out[di],al

          add      di,1

          xor      ax,ax

          xor      dx,dx

          mov    ax,cx

          add     al,30h

          mov    fmas_out[di],al

          add      di,1

          xor      dx,dx

          xor      ax,ax

          mov    fmas_out[di],0dh

          add      di,1

          add      si,2

          pop       bx

          cmp     si,bx

          je         open

      push    bx

      jmp    dd3 

; Открытие файла для записи второго массива

open: sub    di,1

       mov    cx,di

       mov    ax,3d01h

           lea       dx,file_out

           int       21h

; Сохранение

save: mov    bx,ax

       mov    ah,40h

       lea    dx,fmas_out

       int    21h

; Закрытие файла с выходным массивом

          mov     ah,3eh

          int        21h

; Выход из программы

exit:   mov    ah,4ch

          int       21h

         main endp

        seg_code ends

       end main

Задание № 2 (вариант № 9):

Сформировать массив и 10 двухбайтных чисел. Найти минимальное значение.

Текст программы:

1)

data  segment     para public 'data'      ;сегмент данных

message     db    'Введите две шестнадцатеричные цифры: $'

message_1   db    ' $'

message_2   db    0ah,0dh,'Минимальное число: $',0ah,0dh

data  ends

stk   segment     stack

      db    256 dup ('?')                 ;сегмент стека

stk   ends

code  segment     para public 'code'      ;начало сегмента кода

minim dw ?                          ;выделение памяти под переменную minim

r dw ?

rr dw ?

main proc                           ;начало процедуры main

      assume ds:data,cs:code,ss:stk

      mov   ax,data                       ;адрес сегмента данных в регистр ax

      mov   ds,ax ;ax в ds

      mov   ah,9

      mov   dx,offset message

      int   21h

      mov ax,11                     ;общий цикл

      mov r,ax

      mov cx,10               ;формирование счётчиа

      mov bx,0FFh       ;чтобы переменная minim не обнулилось занесем в bx макс. число

      mov minim,0FFh    ;в переменную minim заносим максимальное число из возможных

M_1:

    mov ax,bx                 ;в ах заносим введеное число

    cmp ax,minim        ;сравнение вида ax<=minim

    jbe min             ;если ax меньше или равно minim, то переходим на метку min

    jcxz M_2            ;если сх=0, переходим в M_2, если нет, то продолжаем

    dec cx

jmp M3

min:

    mov minim,ax        ;в minim заносим минимальное число

    jcxz M_2            ;если сх=0, переходим в M_2, если нет, то продолжаем

    dec cx

M3:

      xor   ax,ax       ;очистить регистр ax

      mov   ah,1h       ;1h в регистр ah

      int   21h         ;генерация прерывания с номером 21h

      mov   dl,al       ;содержимое регистра al в регистр dl

      sub   dl,30h            ;вычитание: (dl)=(dl)-30h

      cmp   dl,9h       ;сравнить (dl) с 9h

      jle   M1          ;перейти на метку M1 если dl<9h или dl=9h

      sub   dl,7h       ;вычитание: (dl)=(dl)-7h

M1:

      shl dl,1                ;сдвиг содержимого dl на 1 разряда влево

      shl dl,1

      shl dl,1

      shl dl,1

      int   21h         ;вызов прерывания с номером 21h

      sub   al,30h            ;вычитание: (dl)=(dl)-30h

      cmp   al,9h       ;сравнить (al) с 9h

      jle   M2          ;перейти на метку M2 если al<9h или al=9h

      sub   al,7h       ;вычитание: (al)=(al)-7h

Похожие материалы

Информация о работе