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

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы