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

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

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

 
 Ответить  Открыть новую тему 
> Работа со структурами.сортировка., обрезать программу.
Andrewshkovskii
сообщение 10.06.2008 20:05
Сообщение #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

 

- Текстовая версия 8.08.2025 9:01
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"