Ниже реализуется сортировка массива чисел по возрастанию. Но мне требуется сортировать не сами элементы, а произвести сортировку по возрастанию ASCII кода символа. Объясните пожалуста, как это реализовать?
assume CS: code, DS: data code segment begin: mov AX, data mov DS, AX
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
andriano
16.03.2008 15:30
Непонятно, в чем проблема, т.к. ASCII-код - это тоже число (байт), поэтому сортировка по нему ничем не отличается от сортировки чисел.
PS. Код не смотрел, т.к. вообще обычно не смотрю исходники, которые их авторы забывают снабжать комментариями.
xds
16.03.2008 15:46
18192123, поясни пожалуйста, что имеется в виду (можно на примере).
18192123
17.03.2008 2:48
Цитата(xds @ 16.03.2008 11:46)
18192123, поясни пожалуйста, что имеется в виду (можно на примере).
есть последовательность символов (НЕОБЯЗАТЕЛЬНО числа), мы их должны отсортировать по их ASCII кодам. и у меня не получается провести аналогию символа с его кодом программно, на ассемблере.
дано: 2 5 * ! : в итоге, после сортировки: ! * 2 5 :
xds
17.03.2008 10:24
Тебе надо просто заменить массив слов на массив байтов. Символы при компиляции будут автоматически преобразовываться в числа-байты с соответствующим кодом 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
и так далее.
Т. е., везде работу со словами заменяешь на работу с байтами.
18192123
18.03.2008 1:17
Цитата(xds @ 17.03.2008 6:24)
Т. е., везде работу со словами заменяешь на работу с байтами.
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
GriNDeR
18.03.2008 20:34
а даите код как это будет выглядить в конечном виде я малость не понял и еще как это будет выглядеть если наоборот сортировка идет (с большего)
GriNDeR
18.03.2008 20:35
а даите код как это будет выглядить в конечном виде я малость не понял и еще как это будет выглядеть если наоборот сортировка идет (с большего)
18192123
19.03.2008 3:45
Так я до конца и не разобралась...Что-то упустила...Не работает у меня программа...Объясните пожалуста...
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
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
xds
19.03.2008 21:21
Там мелкие синтаксические ошибки: 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
hydroxychloroquine for sale over
5.12.2021 0:45
Prix Du Viagra
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.