Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка массива, Перекодировать Delphi -> ASM 
V
    Опции темы
Pakshin A. S.
Дата 5.5.2007, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Вот тут все мучаемся с сортировкой массивов...

Что есть сейчас:
Код

.386

.model flat, stdcall

option      casemap:none

include     windows.inc
include     kernel32.inc
include     user32.inc
includelib  kernel32.lib
includelib  user32.lib 

.data
     hStdOut   dd ?
     hStdIn    dd ?
     mes       db "Enter elements (separator - space): ",0Dh,0Ah
     ent       db 0Dh,0Ah
     kol_chars dd 1
     stroka    db 1 dup (?)
     massiv    dw 100 dup (?)
     buf       dw ?
     count1    dw ?
     ten         dw 10
      cont        dw 0
      pt         dw ?
      maska        dw ?     
     i        dw ?
     j        dw ?
     k        dw ?
  
.code
start:
    
    ;--------------
    ; Получение идентификаторов ввода-вывода
    ;--------------
    push    STD_OUTPUT_HANDLE
    call    GetStdHandle         
    mov     hStdOut, eax

    push    STD_INPUT_HANDLE
    call    GetStdHandle         
    mov     hStdIn, eax
    
            
    ;;;--------------;;;
    ;;;   Поехали!   ;;;
    ;;;--------------;;;
     
    ;--------------
    ; Вывод приглашения ввода последовательности
    ;--------------
    invoke WriteConsole, hStdOut, offset mes, sizeof mes, offset kol_chars, 0       

    xor     esi, esi
    xor     ax, ax
    mov     count1, 0
    while1:
        invoke  ReadConsole, hStdIn, offset stroka, 1, offset kol_chars, 0          

        cmp     stroka, 13
        je      end_enter
        cmp     stroka, 32
        je      l1     
        mov     ax, cont
        shl     ax, 3
        mov     cont, ax
        mov     bl, stroka
        sub     bl, 30h
        xor     bh, bh
        mov     ax, cont
        add     ax, bx
        mov     cont, ax
        jmp     while1
        l1:
            mov     ax, cont
            mov     massiv[esi], ax
            xor     ax, ax
            mov     cont, 0
            inc     count1
            movzx   esi, count1
            jmp     while1   
    end_enter:
        
    mov     ax, cont
    mov     massiv[esi], ax
    inc     count1
    
; сортировка по паскалевскому образцу    
;i:=1
;repeat
   ;j:=count1;
   ;j:=j-1;
   ;repeat
      ;if a[j-1] > a[j] then
         ;begin
            ;buf:=a[j];
            ;a[j]:=a[j-1];
            ;a[j-1]:=buf
         ;end;
      ;dec(j);
   ;until j < i;
   ;inc(i);
;until i = count1;

    xor        ecx, ecx
    mov        cx, count1
    mov        i, 1
    f1:
        mov        j, cx
        dec        j
        f2:
            movzx    edi, j
            movzx    esi, j
            dec        esi
            mov        ax, massiv[esi]
            mov        bx, massiv[edi]
            xor        ah, ah
            xor        bh, bh
            cmp        ax, bx
            jbe        next1
                    mov        massiv[esi], bx
                    mov        massiv[edi], ax
            next1:
            dec        j
            movzx    edi, j    
            movzx    esi, i
            cmp        edi, esi
            jae        f2
        end_f2:
        inc        i
        movzx    esi, i
        cmp        esi, ecx
        jb        f1
    end_f1:
    
; вывод массива
    xor     esi, esi
    mov        i, 0
    mov     cx, count1    
    movzx   edi, count1
    show:
        call    MyProc
        invoke  WriteConsole, hStdOut, offset ent, sizeof ent, offset kol_chars, 0 
        inc     i
        movzx    esi, i
        movzx    edi, count1
        cmp     esi, edi
        jb      show
     ret
     
     MyProc proc
        mov      bx, 56
        mov      maska, bx
        mov      ax, massiv[esi]
        xor      ah,ah
        and      ax, maska
        shr      ax, 3
        mov      pt, ax
        add      pt, 30h
        invoke WriteConsole, hStdOut, offset pt, sizeof pt, offset kol_chars, 0 
     
        mov      bx, 7
        mov      maska, bx
        mov      ax, massiv[esi]
        xor      ah,ah
        and      ax, maska
        mov      pt, ax
        add      pt, 30h
        invoke WriteConsole, hStdOut, offset pt, sizeof pt, offset kol_chars, 0 
        
        ret
     MyProc endp
end start


Достоинство поледней версии - не трогается массив, котрый уже отсортирован

Но неотсортированный массив 4 3 2 1
превращается в 1 0 0 4

И почему? Ума не приложу...
PM   Вверх
anwe
Дата 5.5.2007, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 8
Всего: 23



Pakshin A. S., а если паскалевский посмотреть в отладчике?
PM MAIL   Вверх
Pakshin A. S.
Дата 5.5.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Была попытка так сделать... Все равно не получилось сортировать...
Выяснено одно: не верно происходит обмен между элементами массива.
PM   Вверх
Pakshin A. S.
Дата 6.5.2007, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Вопрос решен... Умножал индексы массива на 2... Заработало...

Получилось вот так:

Код

.386

.model flat, stdcall

option      casemap:none

include     windows.inc
include     kernel32.inc
include     user32.inc
includelib  kernel32.lib
includelib  user32.lib 

.data
     hStdOut   dd ?
     hStdIn    dd ?
     mes       db "Enter elements (separator - space): ",0Dh,0Ah
     ent       db 0Dh,0Ah
     kol_chars dd 1
     stroka    db 1 dup (?)
     massiv    dw 100 dup (?)
     buf       dw ?
     count1    dw ?
     ten         dw 10
      cont        dw 0
      pt         dw ?
      maska        dw ?     
     i        dw ?
     j        dw ?
     k        dw ?
  
.code
start:
    
    ;--------------
    ; Получение идентификаторов ввода-вывода
    ;--------------
    push    STD_OUTPUT_HANDLE
    call    GetStdHandle         
    mov     hStdOut, eax

    push    STD_INPUT_HANDLE
    call    GetStdHandle         
    mov     hStdIn, eax
    
            
    ;;;--------------;;;
    ;;;   Поехали!   ;;;
    ;;;--------------;;;
     
    ;--------------
    ; Вывод приглашения ввода последовательности
    ;--------------
    invoke WriteConsole, hStdOut, offset mes, sizeof mes, offset kol_chars, 0       

    xor     esi, esi
    xor     ax, ax
    mov     count1, 0
    while1:
        invoke  ReadConsole, hStdIn, offset stroka, 1, offset kol_chars, 0          

        cmp     stroka, 13
        je      end_enter
        cmp     stroka, 32
        je      l1     
        mov     ax, cont
        shl     ax, 3
        mov     cont, ax
        mov     bl, stroka
        sub     bl, 30h
        xor     bh, bh
        mov     ax, cont
        add     ax, bx
        mov     cont, ax
        jmp     while1
        l1:
            mov     ax, cont
            mov     massiv[esi*2], ax
            xor     ax, ax
            mov     cont, 0
            inc     count1
            movzx   esi, count1
            jmp     while1   
    end_enter:
        
    mov     ax, cont
    mov     massiv[esi*2], ax
    inc     count1


    xor        ecx, ecx
    mov        cx, count1
    cmp           cx, 1
    je           end_f1
    mov        i, 1
    f1:
        mov        j, cx
        dec        j
        f2:
            movzx    edi, j
            movzx    esi, j
            dec        esi
            mov        ax, massiv[esi*2]
            mov        bx, massiv[edi*2]
            xor        ah, ah
            xor        bh, bh
            cmp        ax, bx
            jbe        next1
                    mov        massiv[esi*2], bx
                    mov        massiv[edi*2], ax
            next1:
            dec        j
            movzx    edi, j    
            movzx    esi, i
            cmp        edi, esi
            jae        f2
        end_f2:
        inc        i
        movzx    esi, i
        cmp        esi, ecx
        jb        f1
    end_f1:
    
; вывод массива
    xor     esi, esi
    mov        i, 0
    mov     cx, count1    
    movzx   edi, count1
    show:
        call    MyProc
        invoke  WriteConsole, hStdOut, offset ent, sizeof ent, offset kol_chars, 0 
        inc     i
        movzx    esi, i
        movzx    edi, count1
        cmp     esi, edi
        jb      show
     ret
     
     MyProc proc
        mov      bx, 56
        mov      maska, bx
        mov      ax, massiv[esi*2]
        xor      ah,ah
        and      ax, maska
        shr      ax, 3
        mov      pt, ax
        add      pt, 30h
        invoke WriteConsole, hStdOut, offset pt, sizeof pt, offset kol_chars, 0 
     
        mov      bx, 7
        mov      maska, bx
        mov      ax, massiv[esi*2]
        xor      ah,ah
        and      ax, maska
        mov      pt, ax
        add      pt, 30h
        invoke WriteConsole, hStdOut, offset pt, sizeof pt, offset kol_chars, 0 
        
        ret
     MyProc endp
end start

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0797 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.