Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонимаю почему не происходит сравнение... 
:(
    Опции темы
i1uxa88
Дата 4.6.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.6.2007

Репутация: нет
Всего: нет



Здравствуйте, вот делаю курсовую по ассемблеру, и не понимаю, почему сравнивает как-то по кривому 2 строки типа dw. Подумал, может быть Вы мне обьясните в чем же тут дело ...
Само задание - такое:
Даны сведения о результатах соревнований:
•    фамилия спортсмена (10 символов);
•    код страны (3 символа);
•    балл за первую попытку;
•    балл за вторую попытку;
Сформировать упорядоченный по максимальному из двух попыток баллу список спортсменов
принадлежащих заданной стране;
В список включить фамилию спортсмена, страну и максимальный балл.
------------------------------------------------------------------------------------------------------------------------------
В результате работы программы - происходит следующее - при выборе максимального из 2х баллов, программа - выбирает всегда балл№1 не смотря на значение балла№2, хотя я сматрел в турбодебаггере все идет как я задумывал: максимальный балл - присваивается, тому баллу, который больше по своему значению.
Вот код(строки, которые я выделил красным - работают не правильно).

Код

;Курсовая работа по дисциплине "АССЕМБЛЕР"
;выполнил 
;вариант №2(c) 
;==================================================================
.model small
; Формат исходной таблицы 
tabl1 struc
      fam  db 10 dup(' ')
      codes dw ?
      bal1 dw ?
      bal2 dw ?
    
tabl1 ends
; Формат результирующей таблицы 
tabl2 struc
      fam2  db 10 dup(' ')
      cod   dw ?
      maxb  dw ?
tabl2 ends
;-----------------------------------------------------
;Макрокоманда сравнения цепочек на совпадение
;Вызов: cmpstr src,dest,len
;Параметры:
;src - идентификатор источника  (в ds - сегмент источника)
;dest - идентификатор приемника  (в es - сегмент приемника)
;len - число сравниваемых байт
;Результат определяется по значению флага ZF
;Ограничение: src при вызове не может определятся через di !!!
cmpstr macro src,dest,len
    push cx        ;спасти cx,si,di
    push si        ;
    push di        ;
    mov cx,len        ;размер цепочки в cx
    lea di,dest        ;адрес приемника в di
    lea si,src        ;адрес источника в si
    rep cmpsb        ;проверка пока не равно
                ;флаг ZF=0,если не равно
    pop di        ;восстановить cx,si,di 
    pop si        ;
    pop cx        ;
    endm        
;-----------------------------------------------------
;Макрокоманда пересылки цепочек
;Вызов: movstr src,dest,len
;Параметры:
;src - идентификатор источника  (в ds - сегмент источника)
;dest - идентификатор приемника  (в es - сегмент приемника)
;len - число пересылаемых байт
;Ограничение: src при вызове не может определяться через di !!!
movstr    macro src,dest,len
    push cx        ;спасти cx,si,di
    push si        ;
    push di        ;
    mov cx,len        ;размер цепочки в cx
    lea di,dest        ;адрес приемника в di 
    lea si,src        ;адрес источника в si 
    rep movsb        ;пересылка цепочки
    pop di        ;восстановить cx,si,di 
    pop si        ;
    pop cx        ;
    endm        
;-----------------------------------------------------
;Макрокоманда вывода строки ASCII символов на экран
;Вызов: outstr str
;Параметры:
;str - идентификатор строки (в ds д.б. сегмент строки)
;Ограничение: в конце строки д.б. символ $ (24h) !!!
outstr    macro str
    push ax        ;спасти ax,dx
    push dx        ;
    lea dx,str        ;адрес строки в dx
    mov ah,9        ;номер функции DOS в ax
    int 21h        ;вызов функции 9 DOS 
    pop dx        ;восстановить ax,dx 
    pop ax        ;
    endm        
;-----------------------------------------------------
include    io.asm    ;подключение операций ввода-вывода

.stack 256
;-----------------------------------------------------
.data

N     equ  8        ;количество элементов ИТ
lens equ  type tabl1    ;длина записи ИТ
lenr equ  type tabl2    ;длина записи РТ
; Определение и инициализация ИТ
stabl tabl1 <'Иванова',123,11,16>
      tabl1 <'Петров',124,11,14>
      tabl1 <'Сидорова',123,17,15>
      tabl1 <'Клементин',125,21,20>
      tabl1 <'Царев',127,9,17>
      tabl1 <'Гуськова',123,11,18>
      tabl1 <'Винилова',125,18,11>
      tabl1 <'Служаева',123,21,18>
rtabl tabl2 N dup (<>)    ;определение РТ
buf   tabl2 <>        ;вспомогательный буфер для сортировки РТ
      db '$'    ;ограничитель строки (для вывода на экран)
buf2  tabl1 <>
      db '$'      
strana   dw ?
cccc     dw ?           
NRez     dw ?        ;число отобранных сотрудников 
strSep1  DB '╔═══════════╦══════╦═════╦═════╗$'             ;разделители таблицы
strSep2  DB '╚═══════════╩══════╩═════╩═════╝$'
strSep3  DB '╔════════════╦════════╦═════╗$'
strSep4  DB '╚════════════╩════════╩═════╝$'
strGLs   DB '║  Фамилия  ║Страна║ Бал1║ Бал2║$'
strShp   DB '║   Фамилия  ║ Страна ║М Бал║$'
strZ     db 'Вывод всех спортсменов макс баллу: $'
strNo    db 'Нет такой страны $'
strInput db 'Введите код страны: $'
strsredb db 'Средний балл спортсменов: $'
strKol   db 'Количество выбранных спортсменов:$'
;================================================================
.code
start:
    mov ax,@data
    mov ds,ax    ;настройка ds    
    mov es,ax    ;и es на сегмент данных

          outstr strSep1
          newline
          outstr strGLs
          newline
          outstr strSep2
          newline

          MOV CX,8    ;в CX - число записей (строк) в РТ
          MOV BX,0    ;в BX - смещение текущей записи (строки) РТ
      new1:
          movstr (stabl[BX]).fam,buf2,10    ;пересылка тек. элемента в буфер
          outstr buf2            ;вызов макроса вывода
          MOV AX,(stabl[BX]).codes
          outint AX,3
          MOV AX,(stabl[BX]).bal1
          outint AX,6
        MOV AX,(stabl[BX]).bal2
          outint AX,6
        newline
          ADD BX,lens    ;смещение следующей записи (строки) РТ
          LOOP new1    ;если CX <> 0, продолжить вывод
          outstr strSep2

        newline
        flush
        outstr strInput
        inint strana

        cld        ;сброс флага DF (направление обработки строк-вперед)
    mov cx,N    ;счетчик строк ИТ 
    mov dx,0    ;счетчик строк РТ
    lea si,stabl    ;адрес первой строки ИТ    
    lea di,rtabl    ;адрес первой строки РТ         
;====================================================
next:    
;сравнить текущую страну с заданной
    mov bx,[si].codes            ;
    cmp bx,strana
    jne cont        ;перейти к следующей строке ИТ, 
                ;если страна не совпала
;[color=red]поиск лучшего из 2 выступлений
      mov bx,[si].bal1
    mov ax,[si].bal2
      cmp bx,ax    ;если бал1
      JAE bol        ;,больше бала2 то к метке bol
      movstr [si].bal2,[di].maxb,2    ;в maxb записываем значение бала2
      jmp Gonext                      ; переход к Gonext
bol:
    movstr [si].bal1,[di].maxb,2    ; в maxb записываем значение бала1[/color]
;----------------------------------
; строка выбрана, пересылка данных из ИТ в РТ
Gonext:
        movstr [si].fam,[di].fam2,10
        movstr [si].codes,[di].cod,3
        
       ; завершение блока пересылки
    inc dx        ;увеличить на 1 счетчик строк РТ
    add di,lenr    ;установить в di адрес начала следующей строки РТ
;------------------------------------
cont:            ;переход к следующей строке ИТ      
    add si,lens    ;в si - адрес начала следующей строки ИТ
    loop next    ;повторить цикл, если cx <> 0 
    mov NRez,dx    ;число отобранных спортсменов в РТ

    cmp dx,1    ;если найдено более одного спортсмена
    jg beg        ;перейти к сортировке
    je print    ;если только один спортсмен - на вывод
    newline
    outstr strNo
    newline
    jmp quit    ;в противном случае завершить работу
            ;(jmp дает длинный переход!" 
;===================================================    
; Сортировка РТ 
beg:
    mov cx,NRez    ;
    dec cx    ;в сх - число циклов сравнения (NRez-1)
    mov dx,0    ;в dx - число перестановок пар (пока 0)
    mov bx,0    ;в bx - смещение текущего элемента (строки) РТ
cycle:    
    mov ax,(rtabl[bx+lenr]).maxb    ;сравнить maxb (в al)
    cmp (rtabl[bx]).maxb,ax    ;и текущего элементов
    JGE cont1    ;если больше - выбрать следующую пару (перестановки нет)
; перестановка:
; 1-й (текущий)-> buf
    movstr rtabl[bx],buf,lenr
; 2-й (следующий)-> 1-й (текущий)
    movstr rtabl[bx+lenr],rtabl[bx],lenr
; buf -> 2-й
    movstr buf,rtabl[bx+lenr],lenr

    inc dx        ;увеличить на единицу счетчик перестановок
cont1:
    add bx,lenr    ;следующий элемент
    loop cycle    ;если cx <> 0, продолжить сравнение след. пары
                        
    cmp dx,0    ;если зафиксирована хотя бы одна перестановка,
    jnz beg        ;повторить все сначала
;===================================================
; Вывод строковых полей РТ на экран
print:
      newline 
      newline 
      outstr strZ 
      newline
    mov cx,NRez    ;в cx - число элементов в РТ
    mov bx,0    ;в bx - смещение текущего элемента (строки) РТ
    mov dx,0
    outstr strSep3
    newline
    outstr strShp
    newline
        outstr strSep4
    newline
new:    
    movstr rtabl[bx],buf,lenr-2    ;пересылка тек. элемента в буфер
      MOV (buf).cod,0
        MOV (buf).maxb,0
    outstr buf                      ;вызов макроса вывода
        MOV AX,(rtabl[BX]).cod
      outint AX,6
        MOV AX,(rtabl[BX]).maxb
        outint AX,6
      mov ax,0
      ADD AX,(rtabl[BX]).maxb
        Add dx,ax
      newline
    add bx,lenr        ;смещение следующего элемента РТ
    loop new        ;если cx <> 0, продолжить вывод
        outstr strSep4
        newline
        outstr strKol
        MOV AX,NRez
        outint AX,6
        newline
        outstr strsredb
        MOV AX,0
        MOV AX,DX
        MOV DX,0
        MOV BX,NRez
        DIV BX
        outword AX,6
        cmp dx,0      ;если остаток равен 0,то завершить 
                      ;программу
        je quit
        outch ' '     ;вывод остатка среднего балла
        outint dx
        outch '/'
        outint NRez
;===================================================
quit:       
    Newline
    inint cccc        
    finish
      end start


Также в программе используютс модули io.asm(он вызывается через #include) и ioproc.asm(с ним линкую)


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  IOPROC.ASM 6,92 Kb
PM MAIL   Вверх
i1uxa88
Дата 4.6.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.6.2007

Репутация: нет
Всего: нет



красным выделить не удалось, сравнение начинается с 162 строки - заканчивается 172
подключаемый модуль Io.asm

Это сообщение отредактировал(а) i1uxa88 - 4.6.2007, 16:41

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  IO.ASM 5,43 Kb
PM MAIL   Вверх
Mikl__
Дата 5.6.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 18.5.2007

Репутация: нет
Всего: 1



 Я бы сделал так, чуть меняю твою структуру bal1,bal2,cod,family
шаг 1-ый
      mov di,addr;начало записей
      mov cx,N;кол-во записей 
a0: mov ax,[di]
      cmp ax,[di+2]
      jae a1
      xchg ax,[di+2]
      mov [di],ax
      a1: add di,15
      loop a0
шаг 2-ой - сортировка по коду страны
шаг 3-ий - сортировка внутри страны по первому (максимальному баллу)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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