Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: sortirovka massiva  (Прочитано 9371 раз)
0 Пользователей и 1 Гость смотрят эту тему.
rapa
Гость
« : 02-09-2004 10:52 » 

Код:
.model small
        .stack  64
        .data
array       db     7,-6,2,8,12,-9,6,-11
n           db              8
;---------------------------------
        .code
begin   proc    far
        mov     ax,@data
        mov     ds,ax    
        mov     es,ax
;----                        
        lea     si,array
        mov     di,si
        xor     bx,bx        
        mov     cx,8
bck1{   mov     al,[si+bx(
        xor     dx,dx
bck2{   cmp     al,[di(
        ja      exchange
        jmp     kadima
exchange{
        xchg    al,[di(
        mov     [si+bx(,al
kadima{
        inc     di
        inc     dl
        cmp     dl,n
        jne     bck2
        dec     n
        inc     bx
        loop    bck1                  
;----        
        mov     ax,4c00h
        int     21h
begin   endp
;----------------------------------------------------------------------
        end  begin
Narod pomogite plz.nujno otsortirovat' massiv i eto to chto sdelal.Po moemu goljno rabotat' no sho to ne to...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 02-09-2004 15:38 » 

rapa, попробуй реализовать вот это (почти си++ Улыбаюсь )

Код:

   si=1; // Array+1
   di=0; // Array
   for);si<N;si++:
   |
      if)A[si(<A[di(: //по возрастанию
      |
         A[si( <-> A[di(  // обмен местами
         if)di:di--;
         si=di;
      "
      else
      |
         di++;
      "
   "


на ассемблере (в голом виде) что-то вроде:

        .data
array       db     7,-6,2,8,12,-9,6,-11
n           db              $-array
;---------------------------------

    lea    si,array+1
    mov    di,array

go:
    mov    al,[si]
    cmp    al,[di]
    jnc    else

    xchg    al,[di]

    inc    [di]
    dec    [di]
    jz    next_si

    dec    [di]
    mov    si,di

else:
    inc    di
   
next_si:
    inc    si
    cpi    si,N
    jnz    go

    ;конец


не пробовал - работает или нет Улыбаюсь
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 02-09-2004 16:10 » 

rapa,  Если нет у тебя нормального трасировшика, то воспользуйся стандартным простым трасировшиком который встроен в Windows. Называется он Debug.
При первом взгляде.
1.
Код:

kadima{
        inc     di
        inc     dl
        cmp     dl,n
        jne     bck2
        dec     n
        inc     bx
        loop    bck1    

У тебя происходит итерация DI, но не происходит возрат на массив. И так di у тебя будет бежать дальше. Переворачивая соседние данные. т.е. теоритически портя твою же программу.
2.
Код:

bck1{   mov     al,[si+bx(
        xor     dx,dx
bck2{   cmp     al,[di(
        ja      exchange
        jmp     kadima

Здесь может происходить чистая логическая ошибка. Когда ты сравниваеш положительные и отрицательные числа.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 02-09-2004 18:36 » 

вот, блин, я же написал для типа UCHAR - без учёта знака,  :new_shot:  :new_shot:

вот эти строки (в моём коде) надо изменить

Цитата

go:
mov al,[si]
cmp al,[di]
jnc else ; переход, если [si]>=[di]



на сравнение чисел со знаком

Цитата

go:
mov al,[si]
cmp al,[di]
jge else ; переход, если [si]>=[di]
Записан

rapa
Гость
« Ответ #4 : 02-09-2004 19:40 » 

vsem spasibo.Ya uje spravilsya.Esli kogo-to interesuet to vot kod:
        .model small
        .stack  64
        .data
array       db     7,-6,2,8,12,-9,6,-11
n           db              8
;---------------------------------
        .code
begin   proc    far
        mov     ax,@data
        mov     ds,ax    
        mov     es,ax
;----                        
        lea     si,array        
        xor     bx,bx        
        mov     cx,8
bck1:   mov     al,[si]
        xor     dx,dx
        mov     di,si
bck2:   cmp     al,[di]
        jg      exchange
        jmp     kadima
exchange:
        xchg    al,[di]
        mov     [si],al
kadima:
        inc     di
        inc     dl
        cmp     dl,n
        jne     bck2
        dec     n
        inc     si
        loop    bck1                  
;----        
        mov     ax,4c00h
        int     21h
begin   endp
;----------------------------------------------------------------------
        end  begin
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 02-09-2004 20:15 » 

rapa, длину массива можно вычислять автоматом -

Цитата

array db 7,-6,2,8,12,-9,6,-11
n db $-array
Записан

rapa
Гость
« Ответ #6 : 03-09-2004 09:32 » 

Алексей1153,
Цитата

n db $-array

Eta stroka vychislyaet dlinu massiva avtomatom???
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 03-09-2004 10:51 » 

$ - это смещение в сегменте текущей строки кода (в данном случае - смещение n).

Возможно надо написать так:

n db $-offset(array)

короче, нужно, чтобы от $ отнялось смещение начала массива.

если , к примеру, смещение array равно 1, байт_в_массиве=8, то смещение n равно 9
следовательно $-offset(array) = 9-1=8 байт
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines