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...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
Спокойный
Администратор
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
Здесь может происходить чистая логическая ошибка. Когда ты сравниваеш положительные и отрицательные числа.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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???
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 03-09-2004 10:51 » |
|
$ - это смещение в сегменте текущей строки кода (в данном случае - смещение n).
Возможно надо написать так:
n db $-offset(array)
короче, нужно, чтобы от $ отнялось смещение начала массива.
если , к примеру, смещение array равно 1, байт_в_массиве=8, то смещение n равно 9 следовательно $-offset(array) = 9-1=8 байт
|
|
|
Записан
|
|
|
|
|