Вывод на экран только первых двух столбцов матрицы - 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