???
Математика на уровне МГУ

Показано с 1 по 13 из 13

Тема: Ассемблер. Нужна помощь.

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #8
    Офицер Форума Аватар для Zorge
    Регистрация
    06.03.2004
    Адрес
    Байконур
    Возраст
    43
    Сообщений
    2,893
    Images
    10

    Ответ: Ассемблер. Нужна помощь.

    Гм. Ну давайте попробую. Вспомню институт...
    Итак:
    Так пишут студенты (и простой компилятор языка высокого уровня):
    Код:
    ; это запихать в сегмент данных
    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 ; записываем сумму
    Крайний раз редактировалось Zorge; 11.06.2009 в 18:31.
    // 地辟于丑 - Земля рождена в час Быка

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •