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