Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2012, 21:35   #1
Ciaran
 
Регистрация: 04.02.2012
Сообщений: 3
По умолчанию [TASM]как работает этот код для сортировки знаков методом подсчета

Здраствуйте! Мне нужна срочно помощь. Можно сказать что эта программа решает мое будущее. Я знаю, что программа сортирует знаки методом подсчёта и знаю как этот метод работает, но не вижу это в программе.
Код:
dosseg
.model small
.stack 100h
org 100h
.data
maxlen  db 254
len     db 0
array   db 255 dup(0)   
count   db 256 dup(0)   
survey  dw ?
txt     db  10, 13, "Eta programma sortiruet vse metodom podscheta: ",0
UNGR = 041h
OBGR = 05Ah
ESCt = 1Bh

jumps
include macros.mac
.code
	start:

mov ax,@DATA
mov ds,ax
mov es,ax                


	prog:
writes txt              
nl
mov ah,0ah              
mov dx,offset array-2    
int 21h



xor si,si
xor ax,ax
mov al,[len] 		
	
	sort:
xor bx,bx
mov bl,byte ptr [array+si]   
inc   [count+bx]             


inc   si                  
cmp   si,ax		   
jne   sort

xor si,si
mov di,offset array	  


	
how:

xor cx,cx
mov cl, [count+si]         

test cx,cx
jz increm

mov   ax,si
rep   stosb


	increm:
inc   si
cmp   si, 256
jne how
mov byte ptr es:[di],'$'

;-----Vyvod

mov ah,9
mov dx,offset array
int 21h
mov ah,7
int 21h
nl
cmp al,1
jnz again
ret


again:
print "again(y/n): ?"
nl
reads survey
cmp survey, 59h 
je start
cmp survey, 4eh
je quit
cmp survey, 79h
je start
cmp survey, 6eh
je quit
jne again


	quit:

mov ah,4ch
int 21h
end start
Ciaran вне форума Ответить с цитированием
Старый 05.02.2012, 14:07   #2
alexey2
Пользователь
 
Регистрация: 27.01.2012
Сообщений: 37
По умолчанию

попытаюсь помочь если еще не поздно ;-)
начало-данные и вывод строки

Код:
mov ah,0ah              
mov dx,offset array-2    
int 21h
считывание данных от пользователя

Код:
	sort:
xor bx,bx
mov bl,byte ptr [array+si]   
inc   [count+bx]             
inc   si                  
cmp   si,ax		   
jne   sort
массив array просматривается побайтно, значение из array увеличивает счетчик в count по смещению, равному значению, т.е. если пользователь ввел символ с кодом 30h, то значение в count[30h] увеличится на 1.

Код:
how:
xor cx,cx
mov cl, [count+si]         
test cx,cx
jz increm
mov   ax,si
rep   stosb
	increm:
inc   si
cmp   si, 256
jne how
mov byte ptr es:[di],'$'
теперь просматривается массив count побайтно с начала. нулевые значения (т.е. пользователь не вводил символа с таким кодом - равного смещению в count, или по коду =si) пропускаются, ненулевые пишутся в array столько раз, сколько их вводил юзер. В конец добавляется $ для печати

далее этот массив печатается и делаются попытки повторить.

да, заметил пару ошибок:
Код:
jnz again
ret
я бы заменил на jz quit

и, если вызывать again, то массив count нужно заполнять нулями, иначе правильно работать не будет ))
alexey2 вне форума Ответить с цитированием
Старый 07.02.2012, 02:15   #3
Ciaran
 
Регистрация: 04.02.2012
Сообщений: 3
По умолчанию

Спасибо, ты мне очень помог. Пока срок еще не кончился. А в "inc" просто обрабатывается каждый элемент в массиве count. Правильно?
Ciaran вне форума Ответить с цитированием
Старый 07.02.2012, 09:29   #4
alexey2
Пользователь
 
Регистрация: 27.01.2012
Сообщений: 37
По умолчанию

inc увеличивает на единицу значение в регистре или памяти.
inc si это si=si+1
inc [count+bx] это count[bx]=count[bx]+1
alexey2 вне форума Ответить с цитированием
Старый 08.02.2012, 01:54   #5
Ciaran
 
Регистрация: 04.02.2012
Сообщений: 3
По умолчанию

Не правильно вопрос поставил. Я имел в виду "increm:".
Ciaran вне форума Ответить с цитированием
Старый 08.02.2012, 09:39   #6
alexey2
Пользователь
 
Регистрация: 27.01.2012
Сообщений: 37
По умолчанию

дак это метка в коде, такая же как и how, again, sort...
alexey2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировки одномерного массива целых чисел методом подсчета сравнений [Паскаль] sm0ker Помощь студентам 13 16.12.2010 22:40
Алгоритм сортировки методом подсчета и распределения.С++ Mashul'ka Помощь студентам 0 02.11.2009 22:23
этот код первый раз то окно сначала сворачивается, а потом сразу восстанавливается, а когда вызываешь второй, окно сворачивается? Аlex Общие вопросы Delphi 4 16.08.2008 11:51