Ниже реализуется сортировка массива чисел по возрастанию. Но мне требуется сортировать не сами элементы, а произвести сортировку по возрастанию 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
Непонятно, в чем проблема, т.к. ASCII-код - это тоже число (байт), поэтому сортировка по нему ничем не отличается от сортировки чисел.
PS. Код не смотрел, т.к. вообще обычно не смотрю исходники, которые их авторы забывают снабжать комментариями.
18192123, поясни пожалуйста, что имеется в виду (можно на примере).
Тебе надо просто заменить массив слов на массив байтов. Символы при компиляции будут автоматически преобразовываться в числа-байты с соответствующим кодом ASCII.
Т. е., земеняешь
Появился вопросик...
mov bx,i
shl bx,1
mov ax,mas[bx]
mov bx,j
shl bx,1
mov bx,ishl bx,1 - это bx = bx * 2, т. е. подготовка к индексации слов размером 2 байта. Поскольку мы работаем с байтами, просто убираем умножение на 2, а пересылку заменяем на байтовую (хотя, в данном случае не обязательно - нужный байт по адресу mas[bx] все равно попадет в al). От shl bx,1 надо избавится во всей программе.
shl bx,1
mov ax,mas[bx]
mov bx,j
shl bx,1
mov bx,iили
mov al,mas[bx]
mov bx,j
mov bx,i
mov ax,mas[bx]
mov bx,j
а даите код как это будет выглядить в конечном виде я малость не понял
и еще как это будет выглядеть если наоборот сортировка идет (с большего)
а даите код как это будет выглядить в конечном виде я малость не понял
и еще как это будет выглядеть если наоборот сортировка идет (с большего)
Так я до конца и не разобралась...Что-то упустила...Не работает у меня программа...Объясните пожалуста...
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
Там мелкие синтаксические ошибки: 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
Prix Du Viagra