IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> Работа со структурами.сортировка., обрезать программу.
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Вот исходник,он не совсем корректно работает .ПОчему?я не могу сказать,комплится с предупреждениями,но без ошибок,когда запускаю 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 мин.
Вроде сделал.Проверьте,кому не леньsmile.gif


; ЗАДАНИЕ
;Даны сведения о результатах сдачи сессии в группе
;в виде таблицы:
; - фамилия студента и инициалы (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 ;повторить все сначала
;===================================================================

;===================================================================
quit: finish

end start

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.10.2020 12:17
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name