Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двумерный массив, Поменять местами элементы массива 
:(
    Опции темы
Xavr
Дата 5.12.2013, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.1063 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.