1. Заголовок или название темы должно быть информативным 2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE] 3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора. 5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM! 6. Проверяйте программы перед тем, как выложить их на форум!!
Ниже реализуется сортировка массива чисел по возрастанию. Но мне требуется сортировать не сами элементы, а произвести сортировку по возрастанию ASCII кода символа. Объясните пожалуста, как это реализовать?
assume CS: code, DS: data code segment begin: mov AX, data mov DS, AX
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.
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