Гм. Ну давайте попробую. Вспомню институт...
Итак:
Так пишут студенты (и простой компилятор языка высокого уровня):
Код:
; это запихать в сегмент данных
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 ; записываем сумму