Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   ASSM | Моё первое ассемблироание (http://forum.oszone.net/showthread.php?t=67595)

AnGel_of_Death 22-06-2006 21:07 453808

ASSM | Моё первое ассемблироание
 
при ассемблировании проги, простенькой т.к. только учусь вылетает ошибка если не использовать параметр /AT link: warning L4021: no stack segment.
почему её не получается сделать exe?
при использовании \AT создается com и без каких либо ошибок.

Arrest 22-06-2006 21:59 453821

Чем компилишь? TASM?

Используй модель памяти tiny. Или small.

AnGel_of_Death 23-06-2006 00:07 453852

Вложений: 1
я использую masm611, извините что ранее не указал.
и еще обясните пожалуйста то что на скрине обведено красным, а то не ясно, зачем и что это дальше выполняется. моя пробная программа кончается до линии.

DillerInc 23-06-2006 00:31 453862

AnGel_of_Death
INT 20 -- прерывание с номером 20 -- выход из программы и передача управления операционной системе.
Только вот использовалось это,по-моему,ещё во времена DOS и COM-форматов.
Насчёт компиляции в MASM я не курсе.Попробуй ещё почитать что-нибудь тут.

AnGel_of_Death 23-06-2006 00:44 453866

ну про int я знаю что это прерывание, но там ещё очень много чего. типа byte ptr [bx+si], ah - что это значит? byte ptr это вроде преобразование типа, но причем тут ah, или я по синтаксису не прав?

DillerInc 23-06-2006 00:52 453874

AnGel_of_Death
А почему ты решил,что это код и что он должен выполняться??
Может это данные,может просто какой-то мусор.
Выполнение команды INT20 завершает программу -- она дальше не выполняется.
Читай ссылку на WASM'e -- там и на MASM походу примеры есть.

AnGel_of_Death 23-06-2006 01:13 453881

общее по asm
 
ну вот так бы сразу и сказал что это мусор, я до этого не знал такого понятия. я понял сам что она(прога) реально заканчивает свое выполнение на int 20. Спасибо ! не закрывайте пожалуйста тему, я буду к ней обращатся чтобы не создавать новые.

hasherfrog 23-06-2006 11:13 453984

> ну вот так бы сразу и сказал что это мусор,
:lol:
Это "Hello, world!"
:lol:

DillerInc 23-06-2006 12:14 454014

hasherfrog
Ну я ж говорил,что это могут быть данные :) ...просто не вглядывался тогда в значения байтов.
Angel_of_Death
В таких случаях пользуйся в отладчике окном дампа памяти.Тогда можно легко определить,данные(строка) это или нет.

AnGel_of_Death 23-06-2006 20:01 454226

а не подскажешь где оно?
и как понять что там написано??? как поняли что там написано Hello, world!

DillerInc 24-06-2006 00:58 454318

AnGel_of_Death
Цитата:

а не подскажешь где оно?
...в данном случае там указано: [5] memory1 b DS:0.
К примеру,в SoftIce это команда "d address|register",чтобы вывести дамп памяти определённого адреса.
Цитата:

и как понять что там написано???
...различные символы имеют свои шестнадцатиричные представления,например:
48 65 6С 6С 6F -- есть Hello.

AnGel_of_Death 24-06-2006 01:25 454322

я подумал, что вы использовали ASCII коды но был не уверен поэтому спросил. а другого способа распознать нет?

DillerInc 24-06-2006 13:12 454441

Цитата:

а другого способа распознать нет?
...что ты имеешь ввиду??
Взгляни на окно дампа:
* слева там указаны адреса в памяти
* посредине -- hex-представления байтов
* справа же -- символьное представление этих байтов
Вот по символьному представлению и распознавай.

AnGel_of_Death 01-07-2006 14:06 456711

появился еще один вопросик. есть вот такой исходник :
CSEG segment
org 100h
_beg:
mov ah, 9
mov dx,string ;(я знаю что для правельной работы нужно offset)
int 21h
mov ah, 10h
int 16h
int 20h
string db 'hellow, world!$'
CSEG ends
end _beg
но в примере написано что должно работать и так только уместятся не все символы, а у меня ошибка что-то на вроде :
"error A4910: can't open file : $\masm611\bin\ml.err
m\name.asm(5):error A2070 - это понятно строка в которой ошибка, но почему ошибка???
или это ошибка в учебнике(обучаюсь по рассылкам Калашникова)
за ранее спасибо!

DillerInc 01-07-2006 14:30 456715

Цитата:

я знаю что для правельной работы нужно offset
...ну,так а в чём проблема -- добавь offset, т.к. тут надо передавать не сами данные,а указатель на них.
Цитата:

или это ошибка в учебнике
...всё может быть.

AnGel_of_Death 01-07-2006 19:24 456785

ладно будем считать это опчаткой.
другой вопрос. хочу задать цикл, простенький чтоб повторил пять раз одну и ту же строчку такого вида(подскажите что не так делаю):
lesson segment

org 100h

mov cx, 5

start:

mov ah,9
mov dx, offset string
int 21h
loop start
jmp start2
start2:
int 20h
string db 'hello, WORLD!!!$'
lesson ends
end start2
end start
Вот примерно так.

DillerInc 02-07-2006 01:28 456850

AnGel_of_Death
Оформляешь код ты немного странно.
Точкой входа в программу по идее должно быть start:,у тебя до этого стоит команда MOV.
Далее в данном случае совсем не обязателен переход jmp start2,потому что команда int 20h всё равно получит управление,когда счётчик цикла CX станет равным нулю,т.к. находится она сразу за циклом.
start2 походу является меткой(иными словами просто адресом в коде),поэтому её не надо закрывать связкой end start2.
Поэтому:

Код:

lesson segment

org 100h

start:

mov cx, 5
cycle:
mov ah,9
mov dx, offset string
int 21h
loop cycle
int 20h
string db 'hello, WORLD!!!$'
lesson ends
end start

Вот примерно так...

Ты уж определись,где ты будешь задавать такие вопросы -- на том форуме тематика несколько иная.

Cyberhawk 02-07-2006 19:32 456996

Хм... когда-то и я так начинал... разбирался тоже по Калашникову вначале... но лучше достать хороший справочник по прерываниям + командам. Недавно вот виндусовского сапера (аналог "Новичка") на ассемблере написал... аж горжусь! ;)

AnGel_of_Death 06-07-2006 00:41 458275

этот код тоже не пашет пашет вот этот и пока только он!

lesson segment
org 100h

start:

mov cx, 5
printloop:
push cx
mov ah,9
mov dx, offset string
int 21h
pop cx
loop printloop
int 20h
string db 'hello, WORLD!!!$'
lesson ends
end start

в том коде я сам не понимаю почему, он первую метку не выполняет никак, он как будто её вообще не видит!
т.о. в сх ничего не попадает. и отсчет идет от FFFF, т.к какая-то команда изменяет значение этого регистра(кроме loop),
на другом форуме сказали что прерывания биос могут влиять на этот регистр.

DillerInc 06-07-2006 01:31 458294

Цитата:

пашет вот этот
...потому что на том форуме правильно сказали -- прерывания DOS'а могут изменять регистры.Поэтому посоветовали сохранять значение регистра в стеке.Вообще,в таких случаях нужно пользоваться отладкой,чтобы разобраться в чём причина ошибки.
Цитата:

он первую метку не выполняет никак, он как будто её вообще не видит!
...потому что в твоём первом варианте команда MOV стоит до точки входа в программу(с неё начинается исполнение кода) -- ясен перец,что команда не выполнится при таком раскладе.

AnGel_of_Death 17-07-2006 13:23 462107

на конец -то разабрался с этим циклом. теперь работает и вот этот вариант:
look segment
org 100h
begin:
mov cx, 5
looop:
mov ah,9
mov dx,offset Ha
int 21h
loop looop
int 20h
Ha db 'hi all :P!!!!! $ '
look ends
end begin
в прошлых у меня была ошибка что я заканчиваю не только begin, а до этого еще looop. он почему-то не считал begin за метку. вот и вся проблема. всем спасибо за помощь в этом не легком труде(учебе)!!!

Admiral 28-11-2006 05:54 517785

Доброе время суток народ.

Есть следующий код.
Код:

;DS:DI - адрес массива

TITLE The bubble way of sorting the array       

SSEG SEGMENT PARA STACK 'STACK'                        ;
        DB 256 DUP(0)
SSEG ENDS

DSEG SEGMENT PARA PUBLIC 'DATA'                       
ArraySize DW 20 DUP(0)                        ;MAX-65535
DSEG ENDS                                      ;DB/DW - Define Bytes/Words

CSEG SEGMENT PARA PUBLIC 'CODE'                   
        ASSUME CS:CSEG,DS:DSEG,SS:SSEG

BUBBLE_SORT PROC NEAR                                ;Procedure Definition (32-FAR)
                        push ds               
                        sub ax,ax               
                        push ax               
                        mov ax,DSEG                ;инициализируем адреса сегментов
                        mov ds,ax               
                       
Start:                        mov dx,ArraySize        ; ArraySize в DX
                        cld                        ;установим в ноль флаг направления DF                     
                        cmp dx,1                ;сравниваем dx с 1
                        jbe sort_exit        ;выйти, если нечего сортировать
                        dec dx                  ;уменьшит значение dx на единицу
sb_loop1:                mov cx,dx                ;установить длину цикла
                        xor bx,bx                ;BX будет флагом обмена
                        mov si,di                ;SI – указатель на текущий элемент
sb_loop2:                lodsw                        ;считать следующий элемент
                        cmp ax,word ptr [si]
                        jbe no_swap               
                        xchg ax,word ptr [si]       
                        mov word ptr [si-2],ax
                        inc bx                       
no_swap:                loop sb_loop2
                        cmp bx,0                ;если сортирование не закончилось
                        jne sb_loop1        ;перейти к следующему элементу
sort_exit:                pop ax                       
                        pop ds                       
                        ret                       
BUBBLE_SORT ENDP                               
CSEG ENDS                                     
        END BUBBLE_SORT

Задача кода – инициализировать массив, заполнить его и сортировать методом пузырька.
На текущий момент код умеет задавать размерность массива в шапке.
Необходимо разместить адрес массива в DS:DI и заполнить элементы массива случайными величинами (например считать данные с памяти).

Пишу на TASMе.

Кто знает отпишитесь.

DillerInc 28-11-2006 12:45 517937

Admiral
Для начала одна неувязочка(то ли я туплю с утра,то ли...):

ArraySize DW 20 DUP(0)

...это ж массив,состоящий из двадцати нулевых слов(WORD),а ты его используешь как двухбайтовую величину,характеризующую общий размер массива...

Цитата:

Необходимо разместить адрес массива в DS:DI и заполнить элементы массива случайными величинами (например считать данные с памяти).
...указатели на массивы заносятся в регистры обычно с помощью команды LEA:

Код:

      cld
      lea    si, source      ; источник = какой-нибудь адрес в памяти
      lea    di, ArraySize  ; приёмник
      mov  cx, 20h          ; размер массива
rep movsw                  ; пересылаем из источника в приёмник двадцать слов


Admiral 06-12-2006 04:12 521392

Благодарю за ответ DillerInc

Цитата:

Для начала одна неувязочка(то ли я туплю с утра,то ли...):

ArraySize DW 20 DUP(0)

...это ж массив,состоящий из двадцати нулевых слов(WORD),а ты его используешь как двухбайтовую величину,характеризующую общий размер массива...
В новом варианте кода понятие размерность и память под эту размерность организовано как ArraySize и Array. И нет необходимости в коде программы использовать mov cx, 20h ведь можно написать следующие mov cx, ArraySize.
Это по аналоги с С где (при работе с массивами) один раз пишем const int n=10 а далее везде по коду ссылаемся на n.
Захотели поменять размерность массива - так поменяли её сразу в шапке, а не по всему коду.

Я немного структурировал код

Код:

;DS:DI – адрес массива должен быть здесь

TITLE The bubble way of sorting the array       

SSEG SEGMENT PARA STACK 'STACK'                       
        DB 16 DUP(0)
SSEG ENDS

DSEG SEGMENT PARA PUBLIC 'DATA'                       
Msg1        DB 0dh,' Массив не упорядоченных данных - ','$'
Msg2        DB 0ah,0dh,' Массив упорядоченных данных - ','$'
ArraySize DW 10                                  ;задаём размерность массива
Array DB 2,9,3,8,4,7,6,5,0,1                ;заполняем массив
i DB 0
DSEG ENDS                                       

CSEG SEGMENT PARA PUBLIC 'CODE'
        ASSUME CS:CSEG,DS:DSEG,SS:SSEG

PROC MAIN NEAR                        ;главная процедура программы (по аналоги с С)
                mov ax,DSEG       
                mov ds,ax       
                mov        ax,0

                mov        cx,ArraySize       
                mov        si,0
                mov        ah,09h
                lea        dx,Msg1
                int        21h
                call SHOW               

                call BUBBLE_SORT                ;вызываем процедуру сортирования

                mov        cx,ArraySize       
                mov        si,0
                mov        ah,09h
                lea        dx,Msg2
                int        21h
                call SHOW

exit:
                mov        ax,4c00h        ;стандартное завершение программы
                int        21h
MAIN ENDP

BUBBLE_SORT PROC NEAR               
                       
                cld                       
                lea si,Array        ;source
                lea di,Array        ;destany
                mov cx,ArraySize       
                rep movsw
                               
                mov dx,ArraySize
                cmp dx,1               
                jbe sort_exit       
                dec dx                       
sb_loop1:
                mov cx,dx       
                xor bx,bx               
                mov si,di               
sb_loop2:
                lodsw               
                cmp ax,word ptr [si]
                jbe no_swap               
                xchg ax,word ptr [si]       
                mov word ptr [si-2],ax
                inc bx                       
no_swap:
                loop sb_loop2
                cmp bx,0               
                jne sb_loop1       
sort_exit:                       
                ret                       
BUBBLE_SORT ENDP       

PROC SHOW NEAR                                ;процедура вывода на экран массива до и после сортировки
                mov        ah,02h       
                mov        dl,Array[si]
                add        dl,30h       
                int        21h
                inc        si
                loop show
                ret
SHOW ENDP                       

CSEG ENDS                                       
        END MAIN

Сразу хочу отметить, что работает вывод на экран, однако нет сортировки ... И всё зависит как раз от подсказанного участка кода
Цитата:

Цитата DillerInc (11:45, 28-11-2006)
Код:

    cld
      lea    si, source      ; источник = какой-нибудь адрес в памяти
      lea    di, ArraySize  ; приёмник
      mov  cx, 20h          ; размер массива
rep movsw                  ; пересылаем из источника в приёмник двадцать слов


А всё таки смысл в этих строчка кода? По сути, копируем из одного источника в другой? Или здесь более сложный подход - они разрешают корректную работу lodsw. Так я нашёл код (Только заполнения и вывода на экран элементов массива) где обходятся без данного оператора и все последующие элементы читают посредством INC SI + Array[si]
Код:

TITLE Initialization massive

SSEG SEGMENT PARA STACK 'STACK'                        ;Сегмент стека. SSEG - это имя
        DB 32 DUP(0)
SSEG ENDS

DSEG SEGMENT PARA PUBLIC 'DATA'                        ;Сегмент данных
Msg1        DB 0dh,' Массив не упорядоченных данных - ','$'
Msg2        DB 0ah,0dh,' Массив упорядоченных данных - ','$'
ArraySize DW 10                                  ;Размер под массив
Array DB 9,2,3,8,4,7,6,5,0,1                        ;Память под массив элементов
i DB 0
DSEG ENDS                                        ;DB/DW - Define Bytes/Words
CSEG SEGMENT PARA PUBLIC 'CODE'
        ASSUME CS:CSEG,DS:DSEG,SS:SSEG

MASSIVE PROC NEAR                                ;Procedure Definition

main:
        mov        ax,DSEG
        mov        ds,ax
       
;вывод на экран получившегося массива
       
        mov        cx,ArraySize        ;значение счетчика цикла в cx
        mov        si,0
        mov        ah,09h
        lea        dx,Msg1
        int        21h
        call        show
         
       
        mov        cx,ArraySize        ;значение счетчика цикла в cx
        mov        si,0
        mov        ah,09h
        lea        dx,Msg2
        int        21h
        call        show

exit:
        mov        ax,4c00h        ;стандартный выход
        int        21h

MASSIVE ENDP                                ;Конец программы

PROC show        NEAR
        mov        ah,02h        ;функция вывода значения из al на экран
        mov        dl,Array[si]
        add        dl,30h        ;преобразование числа в символ
        int        21h
        inc        si
        loop        show
        ret
show ENDP

CSEG ENDS                                ;Конец сегмента
        END MASSIVE ;Конец файла

Однако предполагаю, что в случаи с сортированием связка INC SI + Array[si] утруднить процесс кодирования, что не совсем хорошо.

Всё же, что за
Цитата:

source ; источник = какой-нибудь адрес в памяти
нужно указывать?

P.S
В приведённом примере в указанном участке кода используется
Код:

          lea si,Array        ;source 
          lea di,Array        ;destany

Естественно, что в процессе выполнения, выведенные на экран массивы, будут одинаковыми
Но если написать следующие
Код:

          lea si,Array        ;source 
          lea di,buff                ;destany

,
а в шапке данных указать
Код:

DSEG SEGMENT PARA PUBLIC 'DATA'                       
.....
.....
buff DW 10 DUP(?)
.....
.....
DSEG ENDS

то результат работы программы будет следующим
Цитата:

Цитата proga.ехе
Массив не упорядоченных данных- 2938476501
Массив не упорядоченных данных - ш001654738

ш - это не опечатка, это программа взяла из памяти

DillerInc 06-12-2006 16:53 521606

Admiral
Цитата:

ArraySize DW 10 ;задаём размерность массива
Array DB 2,9,3,8,4,7,6,5,0,1 ;заполняем массив
...ей,богу,глаз режит.У тебя получается массив Array,состоящий из десяти байт,а размер ты выставляешь в словах -- десять слов,что соответствует двадцати байтам!И чем интересно будут заполнены лишние десять байт??Шелл-кодом??
Цитата:

Это по аналоги с С
...не надо пока смешивать низкоуровневый асм с языком высокого уровня ;)
Тогда уж лучше используй такой вариант:
Код:

Array      DB    2,9,3,8,4,7,6,5,0,1
ArrayLen =      $-Array

Цитата:

А всё таки смысл в этих строчка кода? По сути, копируем из одного источника в другой?
...смысл обычно в том,что мы получаем копию данных,с которой потом оперируем,не трогая при этом оригинальные данные.
И если ты задал массив байт,то тогда тебе необходимо использовать команду:
Код:

rep  movsb ; для пересылки байт
Цитата:

Однако предполагаю, что в случаи с сортированием связка INC SI + Array[si] утруднить процесс кодирования, что не совсем хорошо.
...ничего она не затруднит.Такой вариант вполне возможен,если ты хочешь просто вытащить поочерёдно каждый элемент массива(байт).Тут надо смотреть,что тебе нужно...
Цитата:

Всё же, что за нужно указывать?
...зависит от обстоятельств.
Например,ты открыл какой-то файл с помощью функции CreateFileA,узнал его размер(GetFileSize).Далее в соответствии с размером выделил нужную память(VirtualAlloc),чтобы считать туда этот файл(ReadFile).И после ты хочешь допустим считать заголовок файла -- вот и начинаешь обрабатывать ту память,которая была выделена функцией VirtualAlloc и куда был считан файл функицей ReadFile.Тогда указатель,возвращённый функцией VirtualAlloc,и будет твоим source.
Это всё так -- например.

Admiral 06-12-2006 23:44 521734

Благодарю DillerInc что так оперативно смог ответить на моё сообщение
По сложившейся традиции для начала приведу обновлённый код, который сразу отмечу, работает, как требовалось постановкой задачи!
Код:

TITLE The bubble way of sorting the array       

SSEG SEGMENT PARA STACK 'STACK'                       
        DB 16 DUP(0)
SSEG ENDS

DSEG SEGMENT PARA PUBLIC 'DATA'                       
Msg1        DB 0dh,' Массив не упорядоченных данных - ','$'
Msg2        DB 0ah,0dh,' Массив упорядоченных данных - ','$'
ArraySize DW 10
buff DW 10 DUP(?)
Array DW 2,9,3,8,4,7,6,5,0,1
DSEG ENDS                                       

CSEG SEGMENT PARA PUBLIC 'CODE'
        ASSUME CS:CSEG,DS:DSEG,SS:SSEG

PROC MAIN NEAR
                mov ax,DSEG       
                mov ds,ax       
                mov        ax,0
       
                mov        cx,ArraySize
                mov        si,0
                mov        ah,09h
                lea        dx,Msg1
                int        21h
                call SHOW               

                call BUBBLE_SORT

                mov        cx,ArraySize
                mov        si,0
                mov        ah,09h
                lea        dx,Msg2
                int        21h
                call SHOW

exit:
                mov        ax,4c00h       
                int        21h
MAIN ENDP

BUBBLE_SORT PROC NEAR               
                push ax       
                cld                       
                lea si,Array        ;source
                lea di,buff        ;destany
                mov        cx,ArraySize
                rep movsw
                               
                mov dx,ArraySize
                cmp dx,1               
                jbe sort_exit       
                dec dx                       
sb_loop1:
                mov cx,dx       
                xor bx,bx               
                mov si,di               
sb_loop2:
                lodsw               
                cmp ax,word ptr [si]
                jbe no_swap               
                xchg ax,word ptr [si]       
                mov word ptr [si-2],ax
                inc bx                       
no_swap:
                loop sb_loop2
                cmp bx,0               
                jne sb_loop1
sort_exit:       
                pop ax               
                ret                       
BUBBLE_SORT ENDP       

PROC SHOW NEAR
                mov        ah,02h       
                mov        dx,Array[si]
                add        dl,30h       
                int        21h
                inc        si
                inc        si
                loop show
                ret
SHOW ENDP                       

CSEG ENDS                                       
        END MAIN

Из изменений исправлено типы данных в шапке, а также самое главное как для переменных слов в подпрограмме выводе на экран добавлен ещё один inc si (поскольку работаем со словами, а между ними разность не si+1, а si+2).
По сути код был рабочий и в прошлой реализации за исключением не верной инициализации размерности и самого массива по типу данных.

Что натолкнуло меня на правильный ход мысли? Как раз

Цитата:

Цитата DillerInc
..ей,богу,глаз режит.У тебя получается массив Array,состоящий из десяти байт,а размер ты выставляешь в словах -- десять слов,что соответствует двадцати байтам!И чем интересно будут заполнены лишние десять байт??Шелл-кодом??

Я откорректировал код в сторону слов, а не байт, так как большая часть кода ориентировано на слова, хотя надо будет попробовать поработать и с байтами. Теоретически файл должен стать меньше, а код быстрее. Не только movsb, но и lodsb будет для байт масива будет присутствовать в коде вместо movsw и lodsw соответственно.
Так что
Цитата:

Array DB 2,9,3,8,4,7,6,5,0,1
ArrayLen = $-Array
ещё по используем. А какой аналог для слов?

А разница между тем какой массив (байтовый или словный) будет проявляться в реализации программы и в допустимых числовых значениях элементов:
Цитата:

Цитата ASM Glossary
db — резервирование памяти для данных размером 1 байт.
для чисел со знаком –128...+127;
для чисел без знака 0...255;
а для слов
dw — резервирование памяти для данных размером 2 байта.
для чисел со знаком –32 768...32 767;
для чисел без знака 0...65 535

а также как я предположил уменьшением увиличением файла, изминением быстродействием алгоритма?

А вообше бывают ли масивы
Цитата:

Цитата ASM Glossary
dd — резервирование памяти для данных размером 4 байта.
df — резервирование памяти для данных размером 6 байт;
dp — резервирование памяти для данных размером 6 байт.
dq — резервирование памяти для данных размером 8 байт.
dt — резервирование памяти для данных размером 10 байт.

После корректировки на вывод выдавалось только половина массива через нули, которые и есть так называемый Шелл-код. То есть неправильно выдавался массив на экран, значит и недочёт в подпрограмме вывода. Добавил ещё inc si и всё пошло как по маслу!

Итог
Цитата:

Цитата Proga.exe;1,50 KB (1*539 bytes)
Массив не упорядоченных данных - 2938476501
Массив упорядоченных данных - 0123456789

P.S
А как насчёт следующих алгоритмов: быстрого сортирования и методом линейного отбора.

Код:

;***************************************************
;
;Сортирование массива методом быстрого сортирования
;
;***************************************************
;DS:DI – адреса массива
;DX – размер массива

quick_sort                proc        near
                cmp        dx,1
                jle        qsort_done
                xor        di,di
                mov        si,dx
                dec        si
                shl        si,1
                mov        ax,word ptr [bx]
step_2:                        cmp        word ptr [bx+si],ax
                jle        step_3
                sub        si,2
                jmp        short step_2
step_3:                        cmp        si,di
                je        step_5
                add        di,2
                cmp        word ptr [bx+di],ax
                jl        step_3
step_4:                        mov        cx,word ptr [bx+di]
                xchg        cx,word ptr [bx+si]
                mov        word ptr [bx+di],cx
                jmp        short step_2
step_5:                        xchg        ax,word ptr [bx+di]
                mov        word ptr [bx],ax
                push        dx
                push        di
                push        bx
                mov        dx,di
                shr        dx,1                ;загрузка длины массива
                call        quick_sort        ;сортирование
                pop        bx
                pop        di
                pop        dx
                add        bx,di
                add        bx,2                ;загрузка начала массива
                shr        di,1
                inc        di
                sub        dx,di                ;загрузка длины массива
                call        quick_sort        ;сортирование
qsort_done:        ret
quick_sort        endp

а также

Код:

;***************************************************
;
;Сортирование массива методом линейного отбора
;
;***************************************************
;DS:DI (ES:SI) – адреса массивов
;DX – количество элементов массива
do_swap:                lea        bx,word ptr [di-2]
                mov        ax,word ptr [bx]        ;новое наименьше число
                dec        cx                        ;если поиск минимального завершён
                jcxz        tail                        ;перейти в конец
loop1:                        scasw                                ;сравнить минимальное в AX
;со следующим элементом
                ja        do_swap
                loop        loop1                        ;продолжить сравнение
tail:                        xchg        ax,word ptr [si-2]
                mov        word ptr [bx],ax

linear_sel_sort:        proc        near                        ;точка входу в процедуру
                mov        bx,si
                lodsw
                mov        di,si
                dec        dx
                mov        cx,dx
                jg        loop1
                ret
linear_sel_sort:        endp


Заменив подпрограмму, на один из указанных алгоритмов получил ошибку исполняемого файла. Для данных алгоритмов необходимо писать свою шапку инициализации массива?
И что за новенькое DS:DI (ES:SI)?

Какие будут комментарии по поводу данных алгоритмов и их реализации на ассемблере?

И в общем реакция на написанное.

DillerInc 07-12-2006 21:23 522123

Цитата:

Так что
Цитата:

Array DB 2,9,3,8,4,7,6,5,0,1
ArrayLen = $-Array
ещё по используем. А какой аналог для слов?
...сейчас проверял -- размер в таком варианте высчитывается как для байтов.Т.е. при словах:
Код:

Array DW 2,9,3,8,4,7,6,5,0,1
ArrayLen = $-Array

...ArrayLen будет равен 14h(двадцать) байт,а не 0Ah(десять).Можно конечно в коде поизвращаться,например:
Код:

cld
lea  esi, Array
mov ecx, ArrayLen
shr  ecx, 1      ;    делим содержимое ECX на два

Насчёт быстродействия и размера кода я как-то сильно сомневаюсь,что ты заметишь что-либо,или даже что эта разница вообще присутствует.По-любому,работая в win32,тебе придётся использовать массивы,состоящие из двойных слов(DWORD),например массив адресов чего-либо.
Цитата:

есть так называемый Шелл-код
...ладно :) насчёт шеллкода я тут походу переборщил,но чисто для справки:
Шелл-код(shellcode) -- это эксплойт,вредоносный байт-код,который внедряется в тело чужой программы с целью получения контроля над ней.Одной из распространнёных ошибок,использующихся для внедрения шеллкода,является переполнение буфера.
Цитата:

Для данных алгоритмов необходимо писать свою шапку инициализации массива?
...ну,да.Тут дан только код с комментариями,что в регистрах SI и DI находятся указатели на массивы.Тебе нужно организовать какую-то память под эти массивы.Будь то твоя секция данных или ещё что-то в этом роде.А то иначе приложение запросто упадёт с ошибкой доступа.
Цитата:

И что за новенькое DS:DI (ES:SI)
...у Юрова написано следующее:
Цитата:

Цитата В.И.Юров
Цепочка-источник,адресуемая операндом source,может находится в текущем сегменте данных,определяемом регистром DS. Цепочка-приёмник,адресуемая операндом destination,должна быть в дополнительном сегменте данных,алресуемым сегментным регистром ES.

В общем,не забивай голову.Надо лишь точно знать какие регистры(ESI, EDI, EAX)используются в конкретных цепочечных командах,а для этого надо просто почитать какой-нибудь справочник по ассемблеру.

bes1de 23-12-2006 23:26 528404

имееца блок схема ..помогите написать код на batronix для 8051.mc




Время: 21:11.

Время: 21:11.
© OSzone.net 2001-