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

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

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

 
 Ответить  Открыть новую тему 
> Сортировка в соответствии с ASCII кодом
сообщение
Сообщение #1


Профи
****

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

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


Ниже реализуется сортировка массива чисел по возрастанию. Но мне требуется сортировать не сами элементы, а произвести сортировку по возрастанию ASCII кода символа. Объясните пожалуста, как это реализовать?


assume CS: code, DS: data
code segment
begin:
	mov AX, data
	mov DS, AX
	
	mov AH, 09h
	mov DX, offset mes1
	int 21h

	mov cx,10
	mov si,0
	
show_primary:
	mov dx,mas[si]
	add dl,30h
	mov ah,02h
	int 21h
	add si,2
	loop show_primary

internal:
	mov j,9
	jmp cycl_j
exchange:
	mov bx,i
	shl bx,1
	mov ax,mas[bx]
	mov bx,j
	shl bx,1
	cmp ax,mas[bx]
	jle lesser
	
	mov bx,i
	shl bx,1
	mov temp,ax
	
	mov bx,j
	shl bx,1
	mov ax,mas[bx]
	mov bx,i
	shl bx,1
	mov mas[bx],ax
	
	mov bx,j
	shl bx,1
	mov ax,temp
	mov mas[bx],ax
lesser:
	dec j
cycl_j:
	mov ax,j
	cmp ax,i
	jg exchange
	
	inc i
	cmp i,n
	jl internal
	
	mov AH, 09h
	mov DX, offset mes2
	int 21h

	mov cx,10
	mov si,0
	
show:
	mov dx,mas[si]
	add dl,30h
	mov ah,02h
	int 21h
	add si,2
	loop show
	
	mov AH, 08h
	int 21h
	
	mov AH, 4Ch
	mov AL, 00h
	int 21h


	code ends

data segment
	mes1 db 'Primary Massiv:$',10,13	
	mes2 db 'Massiv After Sorted:$'
	n equ 9
mas dw 2,7,4,0,1,9,3,6,5,8
i dw 0
j dw 0
temp dw 0
data ends

stk segment stack
	dw 128 dup (0)
stk ends

end begin






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


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

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


Непонятно, в чем проблема, т.к. ASCII-код - это тоже число (байт), поэтому сортировка по нему ничем не отличается от сортировки чисел.

PS. Код не смотрел, т.к. вообще обычно не смотрю исходники, которые их авторы забывают снабжать комментариями.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


N337
****

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

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


18192123, поясни пожалуйста, что имеется в виду (можно на примере).


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

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

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


Цитата(xds @ 16.03.2008 11:46) *

18192123, поясни пожалуйста, что имеется в виду (можно на примере).

есть последовательность символов (НЕОБЯЗАТЕЛЬНО числа), мы их должны отсортировать по их ASCII кодам.
и у меня не получается провести аналогию символа с его кодом программно, на ассемблере.

дано: 2 5 * ! :
в итоге, после сортировки: ! * 2 5 :

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


N337
****

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

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


Тебе надо просто заменить массив слов на массив байтов. Символы при компиляции будут автоматически преобразовываться в числа-байты с соответствующим кодом ASCII.

Т. е., земеняешь
Код
mas dw 2,7,4,0,1,9,3,6,5,8
на
Код
mas db 'SoMeChArS.'
,
Код
mov dx,mas[si]
add dl,30h
...
add si,2
на
Код

mov dl,max[si]
...
inc si
и так далее.

Т. е., везде работу со словами заменяешь на работу с байтами.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

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

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


Цитата(xds @ 17.03.2008 6:24) *

Т. е., везде работу со словами заменяешь на работу с байтами.

Спасибо большое! Теперь понятно!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

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

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


Появился вопросик...

Цитата(xds @ 17.03.2008 6:24) *


Т. е., земеняешь

а на что заменить такие строчки:

mov bx,i
shl bx,1
mov ax,mas[bx]
mov bx,j
shl bx,1

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


N337
****

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

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


mov bx,i
shl bx,1
mov ax,mas[bx]
mov bx,j
shl bx,1
shl bx,1 - это bx = bx * 2, т. е. подготовка к индексации слов размером 2 байта. Поскольку мы работаем с байтами, просто убираем умножение на 2, а пересылку заменяем на байтовую (хотя, в данном случае не обязательно - нужный байт по адресу mas[bx] все равно попадет в al). От shl bx,1 надо избавится во всей программе.

Указанный участок заменяется на
mov bx,i
mov al,mas[bx]
mov bx,j
или
mov bx,i
mov ax,mas[bx]
mov bx,j


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






а даите код как это будет выглядить в конечном виде я малость не понял
и еще как это будет выглядеть если наоборот сортировка идет (с большего)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






а даите код как это будет выглядить в конечном виде я малость не понял
и еще как это будет выглядеть если наоборот сортировка идет (с большего)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Профи
****

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

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


Так я до конца и не разобралась...Что-то упустила...Не работает у меня программа...Объясните пожалуста...

assume CS: code, DS: data
code segment
begin:
	mov AX, data
	mov DS, AX
	
	mov AH, 09h
	mov DX, offset mes1
	int 21h

	mov cx,10
	mov si,0
	
show_primary:
	mov dl,mas[si]
	add dl,30h
	mov ah,02h
	int 21h
	inc si
	loop show_primary

internal:
	mov j,9
	jmp cycl_j
exchange:
	mov ax,mas[bx]
	mov bx,j
	cmp ax,mas[bx]
	jle lesser
	
	mov bx,i
	mov temp,ax
	
	mov bx,j
	mov ax,mas[bx]
	mov bx,i
	mov mas[bx],ax
	
	mov bx,j
	mov ax,temp
	mov mas[bx],ax
lesser:
	dec j
cycl_j:
	mov ax,j
	cmp ax,i
	jg exchange
	
	inc i
	cmp i,n
	jl internal
	
	mov AH, 09h
	mov DX, offset mes2
	int 21h

	mov cx,10
	mov si,0
	
show:
	mov dl,mas[si]
	add dl,30h
	mov ah,02h
	int 21h
	inc si
	loop show
	
	mov AH, 08h
	int 21h
	
	mov AH, 4Ch
	mov AL, 00h
	int 21h


	code ends

data segment
	mes1 db 'Primary Massiv:$',10,13	
	mes2 db 'Massiv After Sorted:$'
	n equ 9
mas db 'qwertydfgh'
i dw 0
j dw 0
temp dw 0
data ends

stk segment stack
	dw 128 dup (0)
stk ends

end begin

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


N337
****

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

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


Там мелкие синтаксические ошибки: TASM все-таки ругается на несоответствие размеров операндов, поэтому лучше делать mov al,mas[bx], чем дописывать byte ptr. Кроме того, что-то глючило в цикле сортировки. Он он был плохо читаем, поэтому я его переписал с комментариями (метод - "пузырек"). Кроме того, прибавлять 30h к коду символа не нужно, т. к. мы работаем уже не с десятичными цифрами, а со всеми символами ASCII.

assume CS: code, DS: data
code segment
begin:
    mov AX, data
    mov DS, AX
    
    mov AH, 09h
    mov DX, offset mes1
    int 21h

    mov cx,10
    mov si,0
    
show_primary:
    mov dl,mas[si]
    ;add dl,30h     ;! работаем уже с самими символами
    mov ah,02h
    int 21h
    inc si
    loop show_primary

    lea dx,nl           ;переход на новую строку
    mov ah,9
    int 21h

    mov i,0             ;for i := 0 to n - 1 do
i_loop:
    mov j,1             ;  for j := 1 to n - 1 do
j_loop:                 ;    begin
    mov bx,j            ;      
    mov al,mas[bx-1]    ;      al := mas[j - 1];
    mov ah,mas[bx]      ;      ah := mas[j];
    cmp al,ah           ;      if al >= ah then
    jb next_j           ;        begin
    mov mas[bx],al      ;          a[j] := al;
    mov mas[bx-1],ah    ;          a[j - 1] := ah;
next_j:                 ;        end;
    inc j
    cmp j,n
    jb j_loop           ;    end;
    inc i
    cmp i,n
    jb i_loop
    
    mov AH, 09h
    mov DX, offset mes2
    int 21h

    mov cx,10
    mov si,0
    
show:
    mov dl,mas[si]
    ;add dl,30h     ;! работаем уже с самими символами
    mov ah,02h
    int 21h
    inc si
    loop show
    
    lea dx,nl           ;переход на новую строку
    mov ah,9
    int 21h
    
    mov AH, 08h
    int 21h
    
    mov AH, 4Ch
    mov AL, 00h
    int 21h


    code ends

data segment
    mes1 db 'Primary Massiv: $'
    mes2 db 'Massiv After Sorted: $'
    nl db 13,10,'$'
    n equ 10
mas db 'qwertydfgh'
i dw 0
j dw 0
temp db 0
data ends

stk segment stack
    dw 128 dup (0)
stk ends

end begin


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Prix Du Viagra
 К началу страницы 
+ Ответить 

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

 



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