Новичок
Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.12.2013
Репутация: нет Всего: нет
|
Задача: поменять местами в двумерном массиве всё, что выше главной и побочной диагоналей, с тем, что ниже их. Ввод, вывод работает. Цикл по меткам calc1 и calc2 должны определять верхний треугольник, не определяют. Макрос replace должен автоматом менять определенную ячейку на ячейку из нижнего треугольника. Код | .model small .stack 100h .data mysize dw ? array db 10*10 dup (?) ;mysize * mysize crlf db 13,10,'$' buf db 3,0,3 dup ('$'),'$' msgPress db 13,10,'Press any key...$' msgmysize db 'Input size: $' msgEl db 13,10,'Input elements: ',13,10,'$' msgMax db 13,10,'MAX = $' msgCountMax db 13,10,'Count of MAX = $' .code ;макрос вывода на экран текстового сообщения ;str - стока для вывода 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 replace macro local @lp push ax push bx push cx push dx push si mov ax,bx mov cx,mysize sub cx,dx sub cx,dx add cx,1 @lp: add ax,mysize loop @lp push [bx][si] xchg bx,ax push [bx][si] xchg bx,ax pop [bx][si] xchg bx,ax pop [bx][si] pop si pop dx pop cx pop bx pop ax endm start: mov ax,@data mov ds,ax write msgmysize indigit mov mysize,ax write crlf ;принудительно переводим курсор на след. строкy write msgEl ;ввод массива lea bx,array mov cx,mysize in1: ;цикл по строкам push cx mov cx,mysize mov si,0 in2: ;цикл по колонкам indigit ;макрос ввода числа mov [bx][si],al inc si write crlf loop in2 add bx,mysize pop cx loop in1 ;вывод массива на экран lea bx,array mov cx,mysize out1: ;цикл по строкам push cx mov cx,mysize mov si,0 write crlf out2: ;цикл по колонкам xor ax,ax mov al,[bx][si] ;Выводимое число в регисте AL putdigit ;макрос вывода inc si loop out2 add bx,mysize pop cx loop out1 cmp mysize,2 ;не надо менять если размер меньше 3х jna result ;вычисления lea bx,array mov dx, 0 mov cx,mysize calc1: ;цикл по строкам push cx mov cx,mysize mov si,0 calc2: ;цикл по колонкам ;поиск необходимых ячеек cmp dx,si jnb endcalc mov ax,si sub ax,mysize cmp dx,ax ja endcalc replace;макрос обмена endcalc: inc si loop calc2 add bx,mysize inc dx pop cx loop calc1 ;вывод резульата result: write crlf lea bx,array mov cx,mysize out1r: ;цикл по строкам push cx mov cx,mysize mov si,0 write crlf out2r: ;цикл по колонкам xor ax,ax mov al,[bx][si] ;Выводимое число в регисте AL putdigit ;вывод inc si loop out2r add bx,mysize pop cx loop out1r ;press any key write msgPress mov ah,0 int 16h ;exit mov ax,4c00h int 21h end start
|
|