Показать полную графическую версию : ASSM | Моё первое ассемблироание
AnGel_of_Death
22-06-2006, 21:07
при ассемблировании проги, простенькой т.к. только учусь вылетает ошибка если не использовать параметр /AT link: warning L4021: no stack segment.
почему её не получается сделать exe?
при использовании \AT создается com и без каких либо ошибок.
Чем компилишь? TASM?
Используй модель памяти tiny. Или small.
AnGel_of_Death
23-06-2006, 00:07
я использую masm611, извините что ранее не указал.
и еще обясните пожалуйста то что на скрине обведено красным, а то не ясно, зачем и что это дальше выполняется. моя пробная программа кончается до линии.
DillerInc
23-06-2006, 00:31
AnGel_of_Death
INT 20 -- прерывание с номером 20 -- выход из программы и передача управления операционной системе.
Только вот использовалось это,по-моему,ещё во времена DOS и COM-форматов.
Насчёт компиляции в MASM я не курсе.Попробуй ещё почитать что-нибудь тут (http://www.wasm.ru/publist.php?list=22).
AnGel_of_Death
23-06-2006, 00:44
ну про int я знаю что это прерывание, но там ещё очень много чего. типа byte ptr [bx+si], ah - что это значит? byte ptr это вроде преобразование типа, но причем тут ah, или я по синтаксису не прав?
DillerInc
23-06-2006, 00:52
AnGel_of_Death
А почему ты решил,что это код и что он должен выполняться??
Может это данные,может просто какой-то мусор.
Выполнение команды INT20 завершает программу -- она дальше не выполняется.
Читай ссылку на WASM'e -- там и на MASM походу примеры есть.
AnGel_of_Death
23-06-2006, 01:13
ну вот так бы сразу и сказал что это мусор, я до этого не знал такого понятия. я понял сам что она(прога) реально заканчивает свое выполнение на int 20. Спасибо ! не закрывайте пожалуйста тему, я буду к ней обращатся чтобы не создавать новые.
hasherfrog
23-06-2006, 11:13
> ну вот так бы сразу и сказал что это мусор,
:lol:
Это "Hello, world!"
:lol:
DillerInc
23-06-2006, 12:14
hasherfrog
Ну я ж говорил,что это могут быть данные :) ...просто не вглядывался тогда в значения байтов.
Angel_of_Death
В таких случаях пользуйся в отладчике окном дампа памяти.Тогда можно легко определить,данные(строка) это или нет.
AnGel_of_Death
23-06-2006, 20:01
а не подскажешь где оно?
и как понять что там написано??? как поняли что там написано Hello, world!
DillerInc
24-06-2006, 00:58
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
я подумал, что вы использовали ASCII коды но был не уверен поэтому спросил. а другого способа распознать нет?
DillerInc
24-06-2006, 13:12
а другого способа распознать нет?
...что ты имеешь ввиду??
Взгляни на окно дампа:
* слева там указаны адреса в памяти
* посредине -- hex-представления байтов
* справа же -- символьное представление этих байтов
Вот по символьному представлению и распознавай.
AnGel_of_Death
01-07-2006, 14:06
появился еще один вопросик. есть вот такой исходник :
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
я знаю что для правельной работы нужно offset
...ну,так а в чём проблема -- добавь offset, т.к. тут надо передавать не сами данные,а указатель на них.
или это ошибка в учебнике
...всё может быть.
AnGel_of_Death
01-07-2006, 19:24
ладно будем считать это опчаткой.
другой вопрос. хочу задать цикл, простенький чтоб повторил пять раз одну и ту же строчку такого вида(подскажите что не так делаю):
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
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
Хм... когда-то и я так начинал... разбирался тоже по Калашникову вначале... но лучше достать хороший справочник по прерываниям + командам. Недавно вот виндусовского сапера (аналог "Новичка") на ассемблере написал... аж горжусь! ;)
AnGel_of_Death
06-07-2006, 00:41
этот код тоже не пашет пашет вот этот и пока только он!
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
пашет вот этот
...потому что на том форуме правильно сказали -- прерывания DOS'а могут изменять регистры.Поэтому посоветовали сохранять значение регистра в стеке.Вообще,в таких случаях нужно пользоваться отладкой,чтобы разобраться в чём причина ошибки.
он первую метку не выполняет никак, он как будто её вообще не видит!
...потому что в твоём первом варианте команда MOV стоит до точки входа в программу(с неё начинается исполнение кода) -- ясен перец,что команда не выполнится при таком раскладе.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.