|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Assm - ASSM | Моё первое ассемблироание |
|
|
Assm - ASSM | Моё первое ассемблироание
|
![]() Старожил Сообщения: 169 |
при ассемблировании проги, простенькой т.к. только учусь вылетает ошибка если не использовать параметр /AT link: warning L4021: no stack segment.
почему её не получается сделать exe? при использовании \AT создается com и без каких либо ошибок. |
|
Отправлено: 21:07, 22-06-2006 |
![]() Старожил Сообщения: 169
|
Профиль | Отправить PM | Цитировать на конец -то разабрался с этим циклом. теперь работает и вот этот вариант:
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 за метку. вот и вся проблема. всем спасибо за помощь в этом не легком труде(учебе)!!! |
------- Отправлено: 13:23, 17-07-2006 | #21 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать Доброе время суток народ.
Есть следующий код. ;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е. Кто знает отпишитесь. |
Отправлено: 05:54, 28-11-2006 | #22 |
![]() Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Admiral
Для начала одна неувязочка(то ли я туплю с утра,то ли...): ArraySize DW 20 DUP(0) ...это ж массив,состоящий из двадцати нулевых слов(WORD),а ты его используешь как двухбайтовую величину,характеризующую общий размер массива... Цитата:
|
|
------- Отправлено: 12:45, 28-11-2006 | #23 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать Благодарю за ответ DillerInc
Цитата:
Это по аналоги с С где (при работе с массивами) один раз пишем 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):
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 ;Конец файла Всё же, что за Цитата:
P.S В приведённом примере в указанном участке кода используется Естественно, что в процессе выполнения, выведенные на экран массивы, будут одинаковыми Но если написать следующие , а в шапке данных указать то результат работы программы будет следующим Цитата proga.ехе:
|
||||
Отправлено: 04:12, 06-12-2006 | #24 |
![]() Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Admiral
Цитата:
Цитата:
![]() Тогда уж лучше используй такой вариант: Цитата:
И если ты задал массив байт,то тогда тебе необходимо использовать команду: Цитата:
Цитата:
Например,ты открыл какой-то файл с помощью функции CreateFileA,узнал его размер(GetFileSize).Далее в соответствии с размером выделил нужную память(VirtualAlloc),чтобы считать туда этот файл(ReadFile).И после ты хочешь допустим считать заголовок файла -- вот и начинаешь обрабатывать ту память,которая была выделена функцией VirtualAlloc и куда был считан файл функицей ReadFile.Тогда указатель,возвращённый функцией VirtualAlloc,и будет твоим source. Это всё так -- например. |
|||||
------- Отправлено: 16:53, 06-12-2006 | #25 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать Благодарю 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 По сути код был рабочий и в прошлой реализации за исключением не верной инициализации размерности и самого массива по типу данных. Что натолкнуло меня на правильный ход мысли? Как раз Цитата DillerInc:
Так что Цитата:
А разница между тем какой массив (байтовый или словный) будет проявляться в реализации программы и в допустимых числовых значениях элементов: Цитата ASM Glossary:
А вообше бывают ли масивы Цитата ASM Glossary:
Итог Цитата Proga.exe;1,50 KB (1*539 bytes):
А как насчёт следующих алгоритмов: быстрого сортирования и методом линейного отбора. ;*************************************************** ; ;Сортирование массива методом быстрого сортирования ; ;*************************************************** ;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)? Какие будут комментарии по поводу данных алгоритмов и их реализации на ассемблере? И в общем реакция на написанное. |
|||||
Отправлено: 23:44, 06-12-2006 | #26 |
![]() Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Цитата:
...ArrayLen будет равен 14h(двадцать) байт,а не 0Ah(десять).Можно конечно в коде поизвращаться,например: Насчёт быстродействия и размера кода я как-то сильно сомневаюсь,что ты заметишь что-либо,или даже что эта разница вообще присутствует.По-любому,работая в win32,тебе придётся использовать массивы,состоящие из двойных слов(DWORD),например массив адресов чего-либо. Цитата:
![]() Шелл-код(shellcode) -- это эксплойт,вредоносный байт-код,который внедряется в тело чужой программы с целью получения контроля над ней.Одной из распространнёных ошибок,использующихся для внедрения шеллкода,является переполнение буфера. Цитата:
Цитата:
Цитата В.И.Юров:
|
||||||
------- Отправлено: 21:23, 07-12-2006 | #27 |
Старожил Сообщения: 407
|
|
Отправлено: 23:26, 23-12-2006 | #28 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Видео под моё железо | kul | Видеокарты | 33 | 26-01-2008 13:23 | |
Assm - ASSM | Непонятки с irq в защищенном режиме | LeonidPr | Программирование и базы данных | 3 | 22-07-2006 15:18 | |
Assm - *ASSM* | Как написать bootsector | Steps | Программирование и базы данных | 2 | 07-07-2005 15:31 | |
Где моё пустое место? | vovixxx | Хочу все знать | 9 | 16-02-2004 21:05 |
|