1. Заголовок или название темы должно быть информативным 2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE] 3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора. 5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM! 6. Проверяйте программы перед тем, как выложить их на форум!!
Работа со структурами.сортировка., обрезать программу.
Вот исходник,он не совсем корректно работает .ПОчему?я не могу сказать,комплится с предупреждениями,но без ошибок,когда запускаю exe файл выдает ошибку DOs-приложения. Прощу вам,те кто знает ассемблер в разы лучше меня,убрать из этой программы всяческий вывод данных на экран,оставить их дампе и не выводить.Просто убрать процедуры вывода и процедуры модуля io.asm.Что бы так : в исходном файле просто задаешь начальные значения,они не выводятся и не вводятся вручную,а результат потом в дебагере в дампе потом посмотреть можно было.
; ЗАДАНИЕ ;Даны сведения о результатах сдачи сессии в группе ;в виде таблицы: ; - фамилия студента и инициалы (16 символов); ; - оценки по каждому из четырех экзаменов; ;Сформировать упорядоченный по фамилии список студентов, ;сдавших сессию без троек и двоек. ;В список включить фамилию студента, оценки и сумму баллов. ;Подсчитать количество и средний балл выбранных студентов. ;================================================================== include io.asm .model small ; Формат исходной таблицы tabl1 STRUC fam db 16 dup(' '),'$' ball1 dw ? ball2 dw ? ball3 dw ? ball4 dw ? sum dw ? tabl1 ENDS ; Формат результиующей таблицы tabl2 STRUC fam2 db 16 dup(' '),'$' b1 dw ? b2 dw ? b3 dw ? b4 dw ? sum2 dw ? tabl2 ENDS ;----------------------------------------------------- ;Макрокоманда сравнения цепочек на совпадение ;Вызов: cmpstr src,dest,len ;Параметы: ; src - идентификатор источника (в ds - сегмент источника) ; dest - идентификатор приемника (в es - сегмент приемника) ; len - число сравниваемых байт ; Результат определяется по значению флага ZF
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 - число пересылаемых байт
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 ;----------------------------------------------------- .stack 256 ;----------------------------------------------------- .data N equ 7 ;количество элементов исходной таблицы lens equ type tabl1 ;длина записи исходной таблицы lenr equ type tabl2 ;длина записи результир. таблицы ; Определение и инициализация исходных данных stabl tabl1 <'Иванчук',4,4,4,4> tabl1 <'Сидорко',4,4,4,2> tabl1 <'Варнахин',5,4,5,5> tabl1 <'Шавлев',2,3,4,5> tabl1 <'Яганов',4,5,4,5> tabl1 <'Ковригин',3,3,3,3> tabl1 <'Рыжков',5,4,4,4> rtabl tabl2 N dup (<>) ;определение результир. таблицы buf tabl2 <> ;вспомогательный буфер для сортировки результир. таблицы db 10,13 ;ограничитель строки (для вывода на экан) ;10,13 - коды перевода стоки и возвата каретки predbal equ 4 ;балл для отбора студентов NResult dw ? ;число отобранных студентов totalsum dw ? ;общая сумма баллов str1 db 'Общая сумма баллов: ','$' str2 db 'Количество студентов: ','$' str3 db 'Сpедний балл: ','$' titlestr db callstr db ' *** РЕЗУЛЬТИРУЮЩАЯ ТАБЛИЦА ***','$' ;================================================================ .code start: mov ax,@data mov ds,ax ;настройка ds mov es,ax ;и es на сегмент данных cld ;сброс флага DF (направление обработки элементов строк-вперед)
mov cx, N ;счетчик строк исходной таблицы mov dx, 0 ;счетчик строк результир. таблицы lea si, stabl ;адрес первой строки исходной таблицы lea di, rtabl ;адрес первой строки результир. таблицы mov totalsum, 0 ;totalsum:=0 ;================================================================ next: ;сравнить сумму баллов с заданной cmp [si].ball1, predbal ;если балл меньше заданного, jl string ;перейти к следующей строке исходной таблицы cmp [si].ball2, predbal jl string cmp [si].ball3, predbal jl string cmp [si].ball4, predbal jl string ;================================================================ ;находим общую сумму баллов mov ax, [si].ball1 add ax, [si].ball2 add ax, [si].ball3 add ax, [si].ball4 add totalsum,ax ;================================================================ ;строка выбрана, пересылка данных из исходн. в рез. табл. ;пересылка поля fam -> fam2 movstr [si].fam,[di].fam2, 10 ;пересылка поля ball1 -> b1 movstr [si].ball1,[di].b1,2 movstr [si].ball2,[di].b2,2 movstr [si].ball3,[di].b3,2 movstr [si].ball4,[di].b4,2 ;завершение блока пересылки inc dx ;увеличить на 1 счетчик строк результир. табл. add di,lenr ;установить в di адрес начала следующей строки рез. табл. ;================================================================= string: ;переход к следующей строке исх.табл. add si, lens ;в si - адрес начала следующей строки исх.табл. loop METKA ;перейти на метку, если cx<>0 mov NResult,dx ;число отобранных студентов в рез.табл.
cmp dx,1 ;если найдено более одного студента jg beg ;перейти к сортировке je print ;если только один студент - на вывод jmp quit ;в противном случае завершить работу ;(jmp дает длинный переход!) METKA: jmp next ;повтоить цикл
;================================================================= ; Сортировка результ. таблицы (метод парных сравнений) beg: mov cx,NResult dec cx ;в сх - число циклов сравнения (NResult-1) mov dx, 0 ;в dx - число перестановок пар (пока 0) mov bx, 0 ;в bx - смещение текущего элемента (строки) результир. табл. round: mov al,(rtabl[bx+lenr]).fam2 ;сравнить 1-й символ следующего (в al) cmp (rtabl[bx]).fam2,al ;и текущего элементов jle string1 ;если меньше - выбрать следующую пару (перестановки нет) ; перестановка ; 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 ;увеличить на единицу счетчик перестановок string1: add bx,lenr ;следующий элемент loop round ;если cx <> 0, подолжить сравнение след. пары
cmp dx, 0 ;если зафиксирована хотя бы одна перестановка, jnz beg ;повторить все сначала ;=================================================================== ; Вывод строковых полей результ. таблицы на экан print: mov cx, NResult ;в cx - число элементов в рез. таблице mov bx, 0 ;в bx - смещение текущего элемента (строки) результ. таблицы
newline newline newline newline
outstr titlestr newline ;переход на новую строку outstr callstr ;вывод названия таблицы newline ;переход на новую строку newline ;переход на новую строку new: movstr (rtabl[bx]).fam2,buf,17;пересылка текущего элемента в буфер outstr buf ;вызов макроса вывода outword (rtabl[bx]).b1,2 outword (rtabl[bx]).b2,2 outword (rtabl[bx]).b3,2 outword (rtabl[bx]).b4,2 newline add bx,lenr ;смещение следующего элемента РТ loop new ;если cx <> 0, продолжить вывод ;конец блока вывода newline ;перейти на новую строку outstr str1 ;вывод "Общая сумма баллов: " outword totalsum ;вывод общей суммы newline ;переход на новую строку outstr str2 ;вывод "Количество студентов: " outword Nresult ;вывод кол-ва студентов newline ;переход на новую строку outstr str3 ;вывод "Средний балл: "
push ax ;спасение ax push dx ;спасение dx mov ax, totalsum ;запись в ax суммы баллов всех студентов cwd ;увеличиваем значение общей суммы до двойного слова div Nresult ;деление ax на число выбранных студентов outword ax ;вывод неполного частного cmp dx,0 ;сравниваем остаток с нулем je endic ;если 0, то на конец блока outch ' ' ;вывод пробела outword dx ;вывод остатка outch '/' ;вывод / outword Nresult ;вывод кол-ва выбранных студентов pop dx ;восстановление dx pop ax ;восстановление ax endic: newline ;=================================================================== quit: finish
end start
Добавлено через 17 мин. Вроде сделал.Проверьте,кому не лень
; ЗАДАНИЕ ;Даны сведения о результатах сдачи сессии в группе ;в виде таблицы: ; - фамилия студента и инициалы (16 символов); ; - оценки по каждому из четырех экзаменов; ;Сформировать упорядоченный по фамилии список студентов, ;сдавших сессию без троек и двоек. ;В список включить фамилию студента, оценки и сумму баллов. ;Подсчитать количество и средний балл выбранных студентов. ;================================================================== include io.asm .model small ; Формат исходной таблицы tabl1 STRUC fam db 16 dup(' '),'$' ball1 dw ? ball2 dw ? ball3 dw ? ball4 dw ? sum dw ? tabl1 ENDS ; Формат результиующей таблицы tabl2 STRUC fam2 db 16 dup(' '),'$' b1 dw ? b2 dw ? b3 dw ? b4 dw ? sum2 dw ? tabl2 ENDS ;----------------------------------------------------- ;Макрокоманда сравнения цепочек на совпадение ;Вызов: cmpstr src,dest,len ;Параметы: ; src - идентификатор источника (в ds - сегмент источника) ; dest - идентификатор приемника (в es - сегмент приемника) ; len - число сравниваемых байт ; Результат определяется по значению флага ZF
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 - число пересылаемых байт
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 ;----------------------------------------------------- .stack 256 ;----------------------------------------------------- .data N equ 7 ;количество элементов исходной таблицы lens equ type tabl1 ;длина записи исходной таблицы lenr equ type tabl2 ;длина записи результир. таблицы ; Определение и инициализация исходных данных stabl tabl1 <'Барышников',5,4,4,3> tabl1 <'Гандарев',4,5,4,2> tabl1 <'Дубенский',5,2,5,5> tabl1 <'Шммырев',2,3,4,5> tabl1 <'Ваганов',4,5,3,5> tabl1 <'Курамшин',3,3,3,3> tabl1 <'Батурин',5,3,4,4> rtabl tabl2 N dup (<>) ;определение результир. таблицы buf tabl2 <> ;вспомогательный буфер для сортировки результир. таблицы db 10,13 ;ограничитель строки (для вывода на экан) ;10,13 - коды перевода стоки и возвата каретки predbal equ 4 ;балл для отбора студентов NResult dw ? ;число отобранных студентов totalsum dw ? ;общая сумма баллов str1 db 'Общая сумма баллов: ','$' str2 db 'Количество студентов: ','$' str3 db 'Сpедний балл: ','$' titlestr db callstr db ' *** РЕЗУЛЬТИРУЮЩАЯ ТАБЛИЦА ***','$' ;================================================================ .code start: mov ax,@data mov ds,ax ;настройка ds mov es,ax ;и es на сегмент данных cld ;сброс флага DF (направление обработки элементов строк-вперед)
mov cx, N ;счетчик строк исходной таблицы mov dx, 0 ;счетчик строк результир. таблицы lea si, stabl ;адрес первой строки исходной таблицы lea di, rtabl ;адрес первой строки результир. таблицы mov totalsum, 0 ;totalsum:=0 ;================================================================ next: ;сравнить сумму баллов с заданной cmp [si].ball1, predbal ;если балл меньше заданного, jl string ;перейти к следующей строке исходной таблицы cmp [si].ball2, predbal jl string cmp [si].ball3, predbal jl string cmp [si].ball4, predbal jl string ;================================================================ ;находим общую сумму баллов mov ax, [si].ball1 add ax, [si].ball2 add ax, [si].ball3 add ax, [si].ball4 add totalsum,ax ;================================================================ ;строка выбрана, пересылка данных из исходн. в рез. табл. ;пересылка поля fam -> fam2 movstr [si].fam,[di].fam2, 10 ;пересылка поля ball1 -> b1 movstr [si].ball1,[di].b1,2 movstr [si].ball2,[di].b2,2 movstr [si].ball3,[di].b3,2 movstr [si].ball4,[di].b4,2 ;завершение блока пересылки inc dx ;увеличить на 1 счетчик строк результир. табл. add di,lenr ;установить в di адрес начала следующей строки рез. табл. ;================================================================= string: ;переход к следующей строке исх.табл. add si, lens ;в si - адрес начала следующей строки исх.табл. loop METKA ;перейти на метку, если cx<>0 mov NResult,dx ;число отобранных студентов в рез.табл.
cmp dx,1 ;если найдено более одного студента jg beg ;перейти к сортировке jmp quit ;в противном случае завершить работу ;(jmp дает длинный переход!) METKA: jmp next ;повтоить цикл
;================================================================= ; Сортировка результ. таблицы (метод парных сравнений) beg: mov cx,NResult dec cx ;в сх - число циклов сравнения (NResult-1) mov dx, 0 ;в dx - число перестановок пар (пока 0) mov bx, 0 ;в bx - смещение текущего элемента (строки) результир. табл. round: mov al,(rtabl[bx+lenr]).fam2 ;сравнить 1-й символ следующего (в al) cmp (rtabl[bx]).fam2,al ;и текущего элементов jle string1 ;если меньше - выбрать следующую пару (перестановки нет) ; перестановка ; 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 ;увеличить на единицу счетчик перестановок string1: add bx,lenr ;следующий элемент loop round ;если cx <> 0, подолжить сравнение след. пары
cmp dx, 0 ;если зафиксирована хотя бы одна перестановка, jnz beg ;повторить все сначала ;===================================================================