format mz
macro gets str {
;============
mov dx, str
mov ah,3Fh
mov bx,0
mov cx,5; максимум символов
int 21h
;===============
add dx,ax ;???????????????????????????
sub dx,2 ;???????????????????????????
mov al,'$' ;???????????????????????????
mov bx,dx ;???????????????????????????
mov [bx],al ;???????????????????????????
}
macro mxchg i1,j1,i2,j2 {
;меняет занчение положение матрици между [x1,y1] [x2,y2]
;
xor dx,dx
mov ax,i1
xor bx,bx
mov bl,[n] ;???????????????????????????
mul bx
mov si,ax
mov bx,j1
mov ah,[si+bx+mass] ;???????????????????????????
push ax
mov ax,i2
mov bl,[n]
mul bx
mov di,ax
mov bx,j2
mov cl,[di+bx+mass]
pop ax
mov [di+bx+mass],ah
mov bx,j1
mov [si+bx+mass],cl
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;=======переменные ======================
msg db 56 dup (?) ;Set msg array
endl db 10,13,'$'
EnterN db "N=$"
n db 7; размер массива
mass db 1024 dup (?); начало масива и выделение места под него
i1 dw 0
j1 dw 0
i2 dw ?
j2 dw ?
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;==========================================
begin:
mov ax,cs
mov ds,ax
call VVOD
;DO
call vuvmass
mov ah,9
mov dx,endl
int 21h
;;;;;;;;;;;;;;
;------------------------
;Подготовка
;
xor cx,cx
mov cl,[n]
dec cx
mov [i1],0
mov [j1],1
mov [i2],1
mov [j2],cx
fcikl:
dec cx
push cx
cmp cx,0
jle next
push [j1]
push [i2]
@@:
push cx
;mxchg 0,1,1,2
mxchg [i1],[j1],[i2],[j2] ;???????????????????????????
inc [j1]
inc [i2]
pop cx
loop @r
pop [i2]
pop [j1]
inc [j1]
inc [i1]
dec [j2]
inc [i2]
next:
;------------------------
pop cx
dec cx ;???????????????????????????
cmp cx,0
jg fcikl
;==========================
;;;;;;;;;;;;;;;;;;;;;;;;;;;
call vuvmass
;;;;;;;;;;;;;;;;;;;;;
;====================
mov ax, 4c00h ;
int 21h
;==============
dgtTostr: ;число в строку
;ax=число
;si=строка
mov dl,'$'
push dx
vuv_chisla_s:
mov dx,0
mov bx,10
div bx
add dl,30h ;???????????????????????????
push dx
cmp ax,0
jne vuv_chisla_s
; ;теперь числа вынимаеи из стека
gopop:
pop dx
mov [si],dl ;???????????????????????????
cmp dl,'$'
pushf
inc si
popf
jne gopop
ret
;=====================
;процедура выводит массив на экран
vuvmass:
xor cx,cx
xor bx,bx
mov cl,[n]
;mov
.cikl:
push cx
xor cx,cx
mov cl,[n]
@@:
push cx
push bx
xor ax,ax
mov al,[mass+bx]
mov si,msg
call dgtTostr
mov ah,9
mov dx,msg
int 21h
mov ah,2
mov dl,9h
int 21h
pop bx
inc bx
pop cx
loop @r
push bx
mov ah,9
mov dx,endl
int 21h
pop bx
pop cx
loop .cikl
ret
;========================
;=========================
VVOD:
;воодим масив
mov ah,9
mov dx,EnterN
int 21h
gets msg
mov si,msg
call strTodgt
mov [n],al
;водим матрицу(массив)
xor bx,bx
;xor ax,ax
;mov al,[n]
mov bx,ax
mul bx
mov cx,ax
xor bx,bx
xor ax,ax
@@:
push cx
push bx
call vuvod_do
gets msg
mov si,msg
call strTodgt
pop bx
pop cx
mov [mass+bx],al ;???????????????????????????
inc al
inc bx
loop @r
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;===========================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
strTodgt: ; строку в число, принимает строку в si , вывод в ах
;метод который переводит с строки в числовой формат
mov dx,0
;mov si,%1
@@: ;начало цикла
mov ax,0
mov cx,0
mov al,[si] ;???????????????????????????
cmp al,'$' ;???????????????????????????
je @f
sub al,30h
mov cx,ax
mov bx,10 ;???????????????????????????
mov ax,0 ;???????????????????????????
mov ax,dx
mul bx
add ax,cx
mov dx,ax
inc si
jmp @r
@@:
mov ax,dx
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
vuvod_do:
;выводим инфу о том какой элемент массива вводим
;так же тут будем увеличивать индексы
mov ah,2
mov dl,'['
int 21h
mov ax,[i1]
mov si,msg
call dgtTostr
mov ah,9
mov dx,msg
int 21h
;---------------
mov ah,2
mov dl,',' ;???????????????????????????
int 21h
;---------------
mov ax,[j1]
mov si,msg
call dgtTostr
mov ah,9
mov dx,msg
int 21h
mov ah,2
mov dl,']'
int 21h
mov ah,2
mov dl,':'
int 21h
;-------------
inc [j1]
xor ax,ax
mov al,[n]
cmp [j1],ax ;???????????????????????????
jne @f
mov [j1],0 ;???????????????????????????
inc [i1]
@@:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|