Гм. Ну давайте попробую. Вспомню институт...
Итак:
Так пишут студенты (и простой компилятор языка высокого уровня):
А так пишут настоящие "гуру астмы". Суть та же, но нифига не понятноКод:; это запихать в сегмент данных s dw ? a dw 4 DUP(?) dw 4 DUP(?) dw 4 DUP(?) dw 4 DUP(?) ; а это в сегмент кода mov ax,0 ; инициализация суммы mov cx,0 ; цикл по строкам for1: test cx,1 ; проверка на четность строки jz chet ; если чет, то цикл строки начинаем с 0, иначе с 1 nechet: mov dx,1 jmp for2 chet: mov dx,0 for2: ; цикл по столбцам mov si,cx shl si,3 ; умножаем на 8 - размер строки массива mov bx,dx shl bx,1 ; умножаем на 2 - размер элемента add ax, [a+si+bx] inc dx ; пропускаем элемент cmp dx, 4 jb for2 inc cx cmp cx,4 jb for1 mov [s],ax ; записываем сумму
Код:; вставить в сегмент данных s dw ? a dw 16 dup(?) ; зачем изображать двумерный массив, ; если в памяти он все равно одномерный? ; вставить в сегмент кода mov bx,0 ; инициализация суммы mov si, offset a ; начало массива cld ; направление перемещения - увеличение (для команды lodsw) mov cx, 8 ; элементов 16, но т.к. "скачем" через один - то остается 8 циклов for1: lodsw ; загрузка в ax слова из адреса ds:si, увеличение si на размер слова cmp cx, 5 ; проверка на необходимость убирания пропуска je not4 test cx, 011b ; проверка на необходимость добавления пропуска jz mor1 inc si inc si mor1: inc si ; пропускаем элемент, для "шахматного" порядка inc si ; два раза, потому что размер элемента - 2 байта not4: loop for1 mov [s],bx ; записываем сумму





Ответить с цитированием