Вывод на экран только первых двух столбцов матрицы - Assembler
Формулировка задачи:
Двумерный массив n*n вводится с клавиатуры, а потом выводится на экран. Как сделать чтобы вывело только 2 первых столбика массива, а не весь?
.model tiny .code ORG 100h write macro str push ax push dx lea dx,str ;адрес строки для вывода mov ah,09h ;09h функция int 21h pop dx pop ax endm ;макрос вывода числа на экран ;вход: AX - число для вывода на экран putdigit macro local lput1 local lput2 local exx push ax push cx push -1 ;сохраним признак конца числа mov cx,10 ;делить будем на 10 lput1: xor dx,dx ;чистим регистр dx mov ah,0 div cl ;Делим mov dl,ah push dx ;Сохраним цифру cmp al,0 ;Остался 0? jne lput1 ;нет -> продолжим mov ah,2h lput2: pop dx ;Восстановим цифру cmp dx,-1 ;Дошли до конца -> выход je exx add dl,'0' ;Преобразуем число в цифру int 21h ;Выведем цифру на экран jmp lput2 ;И продолжим exx: mov dl,' ' int 21h pop cx pop ax endm ;макрос ввода числа с клавиатуры ;выход: AX - введенное число indigit macro local lin push bx push cx push dx mov ah,0Ah ;буферизированный ввод lea dx,buf int 21h xor ax,ax xor cx,cx ;разбор количества цифр введенного числа mov cl,[buf+1] ;количество реально введенных символов xor di,di lin: mov dl,10 mul dl mov bl,[buf+di+2] sub bl,30h ;ASCII -> число add al,bl inc di loop lin pop dx pop cx pop bx endm start: write msgRows indigit mov rows,ax write crlf ;принудительно переводим курсор на след. строку write msgCols indigit mov cols,ax write crlf write msgEl ;ввод массива lea bx,array mov cx,rows in1: ;цикл по строкам push cx mov cx,cols mov si,0 in2: ;цикл по колонкам indigit ;макрос ввода числа mov [bx][si],al inc si write crlf loop in2 add bx,cols pop cx loop in1 write msgPrep ;вывод массива на экран lea bx,array mov cx,rows out1: ;цикл по строкам push cx mov cx,cols mov si,0 write crlf out2: ;цикл по колонкам xor ax,ax mov al,[bx][si] ;Выводимое число в регисте AL putdigit ;макрос вывода inc si loop out2 add bx,cols pop cx loop out1 ;press any key write msgPress mov ah,0 int 16h ;exit mov ax,4c00h int 21h ret rows dw ? cols dw ? array db 10*10 dup (?) ;массив vector db 10 dup (?) ; вектор для результата crlf db 13,10,'$' buf db 3,0,3 dup ('$'),'$' msgPress db 13,10,'press any key...$' msgRows db 'rows (mai mic ca 10): $' msgCols db 'columns (mai mic ca 10): $' msgEl db 13,10,'elements : ',13,10,'$' msgPrep db 13,10, 'array: ',13,10,'$' msgRes db 13,10, 'result: ',10,13, '$' end start
Решение задачи: «Вывод на экран только первых двух столбцов матрицы»
textual
Листинг программы
ORG 100h JMP start mess0 DB 13,10,'ENTER ARRAY N*N: $' mess1 DB 13,10,'CREATE ARRAY...',13,10,10,'$' mess2 DB 13,10,'==========================' DB 13,10,'NEW ARRAY:',13,10,10,'$' crlf DB 13,10,'$' buff DB 256 DUP(0) arrN DW 0 start: MOV AH,9 ; MOV DX,mess0 ; INT 21h ; MOV AH,1 ; вводим кол-во строк/столбцов массива INT 21h ; AND AX,0Fh ; MOV [arrN],AX ; запоминаем их как цифру MOV AH,9 ; MOV DX,mess1 ; INT 21h ; MOV DI,buff ; приёмник для STOSB MOV BX,[arrN] ; макс.кол-во столбцов MOV DX,[arrN] ; ..и строк create: ; MOV CX,2 ; числа будут двух/значные @1: ; MOV AH,1 ; заполняем массив INT 21h ; STOSB ; с сохранением его в DI LOOP @1 ; MOV AL,' ' ; после каждого числа, вставляем пробел INT 29h ; STOSB ; DEC BX ; OR BX,BX ; одна строка заполнилась? JNE create ; нет - продолжаем заполнять MOV BX,[arrN] ; да - восстановим счётчик колонок PUSH DX MOV DX,crlf ; MOV AH,9 ; INT 21h ; перевод строки POP DX DEC DX ; OR DX,DX ; последняя строка? JNE create ; MOV AH,9 ; MOV DX,mess2 ; INT 21h ; MOV SI,buff ; настраиваем SI для LODSB MOV BX,[arrN] ; кол-во строк newArray: ; MOV DX,[arrN] ; IMUL DX,3 ; смещение от начала массива, для сл.пары цифр MOV CX,6 ; сколько символов выводить @2: ; LODSB ; INT 29h ; LOOP @2 ; выводим на экран 2 столбца ADD SI,DX ; смещаемся на сл.строку SUB SI,6 ; переходим на начало этой строки MOV DX,crlf ; MOV AH,9 ; INT 21h ; перевод строки DEC BX ; OR BX,BX ; все строки вывели? JNZ newArray ; exit: XOR AX,AX ; выход! INT 16h INT 20h