Сформировать одномерный массив, состоящий из отрицательных элементов двумерного массива - Assembler
Формулировка задачи:
Как сформировать одномерный массив состоящий из отрицательных элементов двумерного массива?
Решение задачи: «Сформировать одномерный массив, состоящий из отрицательных элементов двумерного массива»
textual
Листинг программы
NewStr macro ;макрос новой строки mov ah,2 ;вывод символа mov dl,10 ;новая строка int 21h endm stacks segment para stack 'stack' db 256 dup(?) stacks ends data segment para 'data' nRw db 0 ;количество строк в массиве nCl db 0 ;количество колонок в массиве rBt db 0 ;область считывания из файла Sz dw 0 ;nRw*nCl=количество элементов nNum dw ?;nNum=Sz для работы hF dw ? ;описатель исходного файла sEl db ' $';строка для вывода элемента nEl db ? ;количество элементов в строке nEl=nCl для работы flA db 'C:\Array.txt',0;исходный файл flN db 'C:\NegArr',0 ;файл отрицательных flS db 'C:\SortArr',0 ;файл отсортированных fNeg db 0 ;флаг отрицательного fNum db 0 ;флаг числа fEnd dw ? ;флаг конца файла aNeg db 81 dup(0);массив отрицательных, вдруг все 9*9 отрицательные nNeg dw 0 ;количество отрицательных ;заголовки: sA db 'Array x ',10,'$' ;массива чисел sN db 10,'Negative:',10,'$';массива отрицательных Sr db 'Sorting:',10,'$' ;массива отсортированных data ends code segment para 'code' assume cs: code, ds: data, ss: stacks count PROC FAR mov ax, data mov ds, ax mov ah,3dh lea dx,flA ;открываем исходный файл mov al, 0 int 21h mov hF,ax ;запомнили его описатель go0:mov ah,3fh ;считываем из файла lea dx,rBt ;область считывания mov cx,1 ;один байт mov bx,hF ;описатель файла int 21h mov fEnd,ax ;закончился ли файл mov si,dx mov al,[si] ;считанный байт в AL cmp al,' ' jne go8 jmp go4 ;если пробел пропускаем go8:cmp al,13 jne go9 jmp go4 ;если возврат каретки пропускаем go9:cmp al,10 jne goA jmp go4 ;если новая строка пропускаем goA:cmp al,'-' jne go3 mov byte ptr fNeg,1 ;нашли минус, устанавливаем его флаг jmp go4 go3:cmp al,'0' ;возможно цифра jb go1 cmp al,'9' ja go1 mov byte ptr fNum,1 ;точно цифра, устанавливаем ее флаг cmp byte ptr nRw,0 ;если число строк не заполнено ja go5 lea si,sA ;адрес заголовка mov [si+6],al;записали число строк sub al,48 ;цифру перевели в число mov nRw,al ;записали его mov byte ptr fNum,0;скинули флаг jmp go4 go5:cmp byte ptr nCl,0;если число колонок не установлено ja go1 lea si,sA mov [si+8],al;записали его в строку sub al,48 ;перевели в число mov nEl,al ;элементов в строке mov nCl,al mul byte ptr nRw mov Sz,ax mov nNum,ax ;всего элементов mov ah,9 lea dx,sA int 21h ;вывели строку про массив mov byte ptr fNum,0 ;сбросили флаг jmp go4 go1:lea si,sEl;адрес строки элемента mov dx,si mov word ptr[si],2020h;забиваем пробелы в строку cmp byte ptr fNeg,1;вдруг ранее был минус jne go2 mov bl,al sub bl,48;цифру в число neg bl ;переводим в отрицательное lea di, aNeg;адрес отрицательного массива add di,nNeg;адрес текущего элемента mov [di],bl;записали элемент inc word ptr nNeg;увеличили счетчик минусов mov byte ptr[si],'-';проставили минус inc si go2:cmp byte ptr fNum,1;число? jne go4 mov [si],al;вписали цифру mov ah, 9 int 21h ;вывели строку элемента dec byte ptr nEl jnz go7 ;ширина массива закончилась? NewStr ;да, новая строка mov al,nCl mov nEl,al ;для следующей строки go7:mov byte ptr fNeg,0;сбрасываем флаги mov byte ptr fNum,0 dec byte ptr nNum jz go6 go4:cmp word ptr fEnd,0;не закончился ли исходный файл je go6 jmp go0 go6:NewStr mov ah,3eh ;закроем исходный файл mov bx,hF int 21h cmp byte ptr nNeg,0;есть ли вообще отрицательные je goG ;готовимся к выводу отрицательных lea dx,flN ;имя файла C:\NegArr lea si,sN ;адрес заголовка Negative: call PrintA;вывели массив на экран и в файл call SortA ;отсортировали массив ;готовимся к выводу отсортированных lea dx,fls ;имя файла C:\SortArr lea si,Sr ;адрес заголовка Sorting: call PrintA;вывели массив на экран и в файл goG:mov ah,8 ;ждем нажатия клавиши int 21h mov ah, 4ch ;выход int 21h endp ;сортировка методом пузырька SortA proc mov bx,nNeg goF:dec bx jz goC lea si,aNeg;начало массива mov cx,bx goE:mov al,[si] cmp al,[si+1];сравнивает со следующим jge goD xchg al,[si+1];меняет местами mov [si],al;больший в [SI] goD:inc si loop goE jmp goF goC:ret endp ;вывод и запись массива в файл PrintA proc ;создаем файл mov ah,3ch xor cx,cx int 21h mov bx,ax ;запомнили его описатель mov ah,9 mov dx,si int 21h ;вывели заголовок lea si,sEl mov byte ptr[si],'-';они все отрицательные mov dx, si mov cx,nNeg ;всего отрицательных lea di,aNeg ;начало их массива goB:mov al,[di] ;текущий элемент neg al ;в положительный add al,48 ;в цифру mov [si+1],al;в строку mov ah,9 int 21h ;вывели строку push cx ;сохранили счетчик mov ah,40h mov cx,3;3 символа в файл int 21h ;записали строку в файл pop cx ;восстановили счетчик inc di ;адрес следующего элемента loop goB NewStr mov ah,3eh ;закроем файл int 21h ret endp code ENDS END count