1. Заголовок или название темы должно быть информативным 2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE] 3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора. 5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM! 6. Проверяйте программы перед тем, как выложить их на форум!!
Ниже реализуется сортировка массива чисел по возрастанию. Но мне требуется сортировать не сами элементы, а произвести сортировку по возрастанию ASCII кода символа. Объясните пожалуста, как это реализовать?
18192123, поясни пожалуйста, что имеется в виду (можно на примере).
есть последовательность символов (НЕОБЯЗАТЕЛЬНО числа), мы их должны отсортировать по их ASCII кодам. и у меня не получается провести аналогию символа с его кодом программно, на ассемблере.
дано: 2 5 * ! : в итоге, после сортировки: ! * 2 5 :
Тебе надо просто заменить массив слов на массив байтов. Символы при компиляции будут автоматически преобразовываться в числа-байты с соответствующим кодом 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
и так далее.
Т. е., везде работу со словами заменяешь на работу с байтами.
shl bx,1 - это bx = bx * 2, т. е. подготовка к индексации слов размером 2 байта. Поскольку мы работаем с байтами, просто убираем умножение на 2, а пересылку заменяем на байтовую (хотя, в данном случае не обязательно - нужный байт по адресу mas[bx] все равно попадет в al). От shl bx,1 надо избавится во всей программе.
Там мелкие синтаксические ошибки: TASM все-таки ругается на несоответствие размеров операндов, поэтому лучше делать mov al,mas[bx], чем дописывать byte ptr. Кроме того, что-то глючило в цикле сортировки. Он он был плохо читаем, поэтому я его переписал с комментариями (метод - "пузырек"). Кроме того, прибавлять 30h к коду символа не нужно, т. к. мы работаем уже не с десятичными цифрами, а со всеми символами ASCII.
assumeCS: code, DS: datacodesegment
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 siloop 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 siloop show
lea dx,nl ;переход на новую строку
mov ah,9
int 21h
mov AH, 08h
int 21h
mov AH, 4Ch
mov AL, 00h
int 21h
codeendsdatasegment
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
dataends
stk segmentstackdw 128 dup (0)
stk endsend begin