![]() |
ASSM | Моё первое ассемблироание
при ассемблировании проги, простенькой т.к. только учусь вылетает ошибка если не использовать параметр /AT link: warning L4021: no stack segment.
почему её не получается сделать exe? при использовании \AT создается com и без каких либо ошибок. |
Чем компилишь? TASM?
Используй модель памяти tiny. Или small. |
Вложений: 1
я использую masm611, извините что ранее не указал.
и еще обясните пожалуйста то что на скрине обведено красным, а то не ясно, зачем и что это дальше выполняется. моя пробная программа кончается до линии. |
AnGel_of_Death
INT 20 -- прерывание с номером 20 -- выход из программы и передача управления операционной системе. Только вот использовалось это,по-моему,ещё во времена DOS и COM-форматов. Насчёт компиляции в MASM я не курсе.Попробуй ещё почитать что-нибудь тут. |
ну про int я знаю что это прерывание, но там ещё очень много чего. типа byte ptr [bx+si], ah - что это значит? byte ptr это вроде преобразование типа, но причем тут ah, или я по синтаксису не прав?
|
AnGel_of_Death
А почему ты решил,что это код и что он должен выполняться?? Может это данные,может просто какой-то мусор. Выполнение команды INT20 завершает программу -- она дальше не выполняется. Читай ссылку на WASM'e -- там и на MASM походу примеры есть. |
общее по asm
ну вот так бы сразу и сказал что это мусор, я до этого не знал такого понятия. я понял сам что она(прога) реально заканчивает свое выполнение на int 20. Спасибо ! не закрывайте пожалуйста тему, я буду к ней обращатся чтобы не создавать новые.
|
> ну вот так бы сразу и сказал что это мусор,
:lol: Это "Hello, world!" :lol: |
hasherfrog
Ну я ж говорил,что это могут быть данные :) ...просто не вглядывался тогда в значения байтов. Angel_of_Death В таких случаях пользуйся в отладчике окном дампа памяти.Тогда можно легко определить,данные(строка) это или нет. |
а не подскажешь где оно?
и как понять что там написано??? как поняли что там написано Hello, world! |
AnGel_of_Death
Цитата:
К примеру,в SoftIce это команда "d address|register",чтобы вывести дамп памяти определённого адреса. Цитата:
48 65 6С 6С 6F -- есть Hello. |
я подумал, что вы использовали ASCII коды но был не уверен поэтому спросил. а другого способа распознать нет?
|
Цитата:
Взгляни на окно дампа: * слева там указаны адреса в памяти * посредине -- hex-представления байтов * справа же -- символьное представление этих байтов Вот по символьному представлению и распознавай. |
появился еще один вопросик. есть вот такой исходник :
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 - это понятно строка в которой ошибка, но почему ошибка??? или это ошибка в учебнике(обучаюсь по рассылкам Калашникова) за ранее спасибо! |
Цитата:
Цитата:
|
ладно будем считать это опчаткой.
другой вопрос. хочу задать цикл, простенький чтоб повторил пять раз одну и ту же строчку такого вида(подскажите что не так делаю): 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 Вот примерно так. |
AnGel_of_Death
Оформляешь код ты немного странно. Точкой входа в программу по идее должно быть start:,у тебя до этого стоит команда MOV. Далее в данном случае совсем не обязателен переход jmp start2,потому что команда int 20h всё равно получит управление,когда счётчик цикла CX станет равным нулю,т.к. находится она сразу за циклом. start2 походу является меткой(иными словами просто адресом в коде),поэтому её не надо закрывать связкой end start2. Поэтому: Код:
lesson segment Ты уж определись,где ты будешь задавать такие вопросы -- на том форуме тематика несколько иная. |
Хм... когда-то и я так начинал... разбирался тоже по Калашникову вначале... но лучше достать хороший справочник по прерываниям + командам. Недавно вот виндусовского сапера (аналог "Новичка") на ассемблере написал... аж горжусь! ;)
|
этот код тоже не пашет пашет вот этот и пока только он!
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), на другом форуме сказали что прерывания биос могут влиять на этот регистр. |
Цитата:
Цитата:
|
на конец -то разабрался с этим циклом. теперь работает и вот этот вариант:
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 за метку. вот и вся проблема. всем спасибо за помощь в этом не легком труде(учебе)!!! |
Доброе время суток народ.
Есть следующий код. Код:
;DS:DI - адрес массива На текущий момент код умеет задавать размерность массива в шапке. Необходимо разместить адрес массива в DS:DI и заполнить элементы массива случайными величинами (например считать данные с памяти). Пишу на TASMе. Кто знает отпишитесь. |
Admiral
Для начала одна неувязочка(то ли я туплю с утра,то ли...): ArraySize DW 20 DUP(0) ...это ж массив,состоящий из двадцати нулевых слов(WORD),а ты его используешь как двухбайтовую величину,характеризующую общий размер массива... Цитата:
Код:
cld |
Благодарю за ответ DillerInc
Цитата:
Это по аналоги с С где (при работе с массивами) один раз пишем const int n=10 а далее везде по коду ссылаемся на n. Захотели поменять размерность массива - так поменяли её сразу в шапке, а не по всему коду. Я немного структурировал код Код:
;DS:DI – адрес массива должен быть здесь Цитата:
Код:
TITLE Initialization massive Всё же, что за Цитата:
P.S В приведённом примере в указанном участке кода используется Код:
lea si,Array ;source Но если написать следующие Код:
lea si,Array ;source а в шапке данных указать Код:
DSEG SEGMENT PARA PUBLIC 'DATA' Цитата:
|
Admiral
Цитата:
Цитата:
Тогда уж лучше используй такой вариант: Код:
Array DB 2,9,3,8,4,7,6,5,0,1 Цитата:
И если ты задал массив байт,то тогда тебе необходимо использовать команду: Код:
rep movsb ; для пересылки байт Цитата:
Цитата:
Например,ты открыл какой-то файл с помощью функции CreateFileA,узнал его размер(GetFileSize).Далее в соответствии с размером выделил нужную память(VirtualAlloc),чтобы считать туда этот файл(ReadFile).И после ты хочешь допустим считать заголовок файла -- вот и начинаешь обрабатывать ту память,которая была выделена функцией VirtualAlloc и куда был считан файл функицей ReadFile.Тогда указатель,возвращённый функцией VirtualAlloc,и будет твоим source. Это всё так -- например. |
Благодарю DillerInc что так оперативно смог ответить на моё сообщение
По сложившейся традиции для начала приведу обновлённый код, который сразу отмечу, работает, как требовалось постановкой задачи! Код:
TITLE The bubble way of sorting the array По сути код был рабочий и в прошлой реализации за исключением не верной инициализации размерности и самого массива по типу данных. Что натолкнуло меня на правильный ход мысли? Как раз Цитата:
Так что Цитата:
А разница между тем какой массив (байтовый или словный) будет проявляться в реализации программы и в допустимых числовых значениях элементов: Цитата:
А вообше бывают ли масивы Цитата:
Итог Цитата:
А как насчёт следующих алгоритмов: быстрого сортирования и методом линейного отбора. Код:
;*************************************************** Код:
;*************************************************** Заменив подпрограмму, на один из указанных алгоритмов получил ошибку исполняемого файла. Для данных алгоритмов необходимо писать свою шапку инициализации массива? И что за новенькое DS:DI (ES:SI)? Какие будут комментарии по поводу данных алгоритмов и их реализации на ассемблере? И в общем реакция на написанное. |
Цитата:
Код:
Array DW 2,9,3,8,4,7,6,5,0,1 Код:
cld Цитата:
Шелл-код(shellcode) -- это эксплойт,вредоносный байт-код,который внедряется в тело чужой программы с целью получения контроля над ней.Одной из распространнёных ошибок,использующихся для внедрения шеллкода,является переполнение буфера. Цитата:
Цитата:
Цитата:
|
|
Время: 21:11. |
Время: 21:11.
© OSzone.net 2001-