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

M2:

      add   dl,al       ;сложение: (dl)=(dl)+(al)

      mov   bl,dl

      mov   dx,offset message_1     ;ввывод пробела

      mov   ah,09h

      int   21h

      mov ax,r

      dec ax                  ;общий цыкл уменьшаем на 1

      mov r,ax

      cmp ax,0

je M_2

jmp M_1

M_2:

      mov   dx,offset message_2

      mov   ah,09h

      int   21h

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

      mov dx,minim

      shr dx,4h         ;сдвиг содержимого dx на 4 разряда вправо

      and ax,0000000000001111b      ;логическое умножение

      mov rr,ax

      add   dl,30h            ;сложение (dl)=(dl)+30h

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

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

      add   dl,7h       ;сложение (dl)=(dl)+7h

M4:

      mov ah,02h

      int 21h

      xor   dx,dx

      xor   ax,ax

      mov   ax,rr

      mov   dl,al

      add   dl,30h            ;сложение (dl)=(dl)+30h

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

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

      add   dl,7h       ;сложение (dl)=(dl)+7h

M5:

      mov ah,02h

      int 21h

      mov ax,4c00h            ;формирование функции стандартного выхода          

      int 21h                 ;формирование прерывания типа 21h и стандартный выход            

main  endp              ;конец процедуры main

code  ends              ;конец сегмента кода

end   main              ;конец программы с точкой входа main

2)

model small

.stack 100h

.data

N=10 ;макрос

mass dw 10 dup(0)

file_name db 'input.txt',0

file_name2 db 'salary.txt',0

handle dw 0 ;манипулятор файла

handle2 dw 0 ;манипулятор файла

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

buffer db 4 dup(0) ;буфер

.code

.startup

;открываем файл

   xor ax,ax

   mov ax,3D00h ;будем открывать файл для чтения

   mov dx,offset file_name ;DS:DX указывают на путь к файлу

   int 21h

   mov handle,ax ;запомним номер файла в переменной Handle

;цикл

   mov di,0 ;указывает на текущий элемент mass

mass_cicle: ; обший цикл копирования-преобразования

   mov cx,4

   mov bx,handle ;будем читать

   mov dx,offset buffer ;DS:DX указывает на буфер в памяти для чтения

   mov ah,3Fh ;функция 3Fh - чтение файла

   int 21h

;преобразавание из ASCII кода в число

   mov si,3 ;позиция в источнике

   mov bx,1 ;bx будем испльзовать как множитель

transform: ;цикл преобразования

   xor ax,ax ;подготовка для mul

   mov al,buffer[si]

   sub al,30h

   cmp al,9h

jle past

   sub al,7h

past:   

   mul bx ;если операнд, указанный в команде - слово,

             ;то второй сомножитель должен располагаться в ax

             ;результат помещается в пару dx:ax

;прибавляем к нашему результату

   shl di,1 ; не нужно начиная с ~286

   add mass[di],ax

   shr di,1

   shl bx,4 ;следующий разряд x16

   dec si

jnl transform ;переходим если si <> -1

   inc di

   cmp di,N

jnz mass_cicle

;обработка массива

   mov si,0 ;инициализация нулем индекса массива si

   mov cx,10 ;инициализация числом 10 счетчика циклов cx            

   mov ax,mass[0] ;запись в регистр ax первого элемента массива mass

   mov minimum,ax ;запись в переменную minimum содержимого регистра ax

cycle:

   mov ax,mass[si] ;запись в регистр ax si-ого элемента массива mass

   cmp ax,minimum ;сравнение

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

   add si,2 ;в противном случае увеличиваем si на 2 (так как массив типа word)

   loop cycle ;если cx не равен нулю, то cx уменьшается на 1 и переходим к cycle

   jmp endmass ;в противном случае переходим к метке конца программы endmass

min:

   mov minimum,ax ;запись в переменную minimum содержимого регистра ax

   add si,2 ;увеличение si на 2

   dec cx

   jne cycle ;если cx не равен нулю, то переходим к cycle

endmass:

;закрытие файла input.txt

   mov ah,3eh

   mov bx,handle ;bx содержит номер файла handle

   int 21h       ;DS:dx адресса для чтения/записи

;запись результата обработки массива в файл

;открываем файл

   mov ax,3D02h ;будем открывать файл для чтения/записи

   mov dx,offset file_name2 ;DS:DX указывают на путь к файлу

   int 21h

   mov handle2,ax ;запомним номер файла в переменной Handle2

;преобразование из числа в ASCI код

   mov bx,minimum

;преобразование первого символа

   mov bx,minimum    ;в bх заносим максимальное число

   and bx,1111000000000000b      ;логическое умножение

   shr bx,4h         ;сдвиг содержимого dx на 4 разряда вправо

   add   bh,30h      ;сложение (bh)=(bh)+30h

   cmp   bh,39h      ;сравнить (bh) с 39h

   jle   M4          ;перейти на метку M4 если bh<39h или bh=39h

   add   bh,7h       ;сложение (bh)=(bh)+7h

M4:

   mov ah,bh

   shl ah,4h

;преобразование второго символа

   mov bx,minimum    ;в bх заносим максимальное число

   and bx,0000111100000000b      ;логическое умножение

   add   bh,30h      ;сложение (bh)=(bh)+30h

   cmp   bh,39h      ;сравнить (bh) с 39h

   jle   M5          ;перейти на метку M4 если bh<39h или bh=39h

   add   bh,7h       ;сложение (bh)=(bh)+7h

M5:

   and bx,0000111100000000b      ;логическое умножение

   add ah,bh

;преобразование третьего символа

   mov bx,minimum    ;в bх заносим максимальное число

   and bx,0000000011110000b      ;логическое умножение

   shr bl,4h         ;сдвиг содержимого dx на 4 разряда вправо

   add   bl,30h      ;сложение (bl)=(bl)+30h

   cmp   bl,39h      ;сравнить (bl) с 39h

   jle   M6          ;перейти на метку M6 если bl<39h или bl=39h

   add   bl,7h       ;сложение (bl)=(bl)+7h

M6:

   mov al,bl

   shl al,4h

;преобразование четвертого символа

   mov bx,minimum    ;в bх заносим максимальное число

   and bx,0000000000001111b      ;логическое умножение

   add   bl,30h      ;сложение (bl)=(bl)+30h

   cmp   bl,39h      ;сравнить (bl) с 39h

   jle   M7          ;перейти на метку M7 если bl<39h или bl=39h

   add   bl,7h       ;сложение (bl)=(bl)+7h

;M7:

   and bx,0000000000001111b      ;логическое умножение

   and bx,0000000011110000b      ;логическое умножение

   add al,bl

mov minimum,ax

   xor ax,ax

   mov ah,40h ;запись в фаил

   mov bx,handle2

   mov cx,2

   mov dx,offset minimum ;DS:DX адрес записи

   int 21h

;закрытие файла salary.txt

   mov ah,3eh

   mov bx,handle2

   int 21h

.exit 0

Задание № 3 (вариант № 14):

Написать программу преобразования однобайтного числа в соответствующий ему код ASCII.

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

masm                     ;режим работы TASM

model small              ;тип используемой модели памяти

stack 256                ;выделение памяти для стека

.data                    ;начало сегмента данных

input db 4 dup(0)

.code                    ;начало сегмента кода

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

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

mov ds,ax                ;AX в DS

xor ax,ax                ;очистка регистров

xor bx,bx

xor dx,dx

xor cx,cx

m0:

       mov ah,01h

       int 21h           ;чтение данных с клавиатуры

       mov input[bx],al

       inc bx

       cmp bx,03h

jle m0

call LF0D                ;вызов процедуры "перевод строки-возврат каретки"

xor bx,bx                ;очистка регистров

mov ah,02h               ;определение функции прерывания int21h

man:                     ;преобразование ASCII-кода в цифры

       mov dl,input[bx]  ;запись в dl ASCII-кода из массива input

       cmp dl,60h

       jle man0

       sub dl,57h        ;если разряд равен a...f, то вычесть из него 57h

       jmp man2

man0:                    ;сравнение разряда с 40h

       cmp dl,40h

       jle man1

       sub dl,37h        ;если разряд равен A...F, то вычесть из него 37h

       jmp man2

man1:                    ;если разряд равен 0...9, то вычесть из него 30h

       sub dl,30h

man2:

inc bx                   ;вывод данных на экран

       int 21h

       inc dh

cmp dh,03h               ;сравнение младшего разряда с 09h

jle man

exit:

mov ax,4c00h             ;стандартный выход

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

LF0D proc                ;процедура "перевод строки-возврат каретки"

       mov ah,02h

       mov dl,0Ah

       int 21h

       mov dl,0Dh

       int 21h

ret

LF0D endp

end main                ;конец программы с точкой входа main