Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Простой вопрос по асму, int 21h 
V
    Опции темы
DigitSphinx
Дата 17.6.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Я полный нуб по асму поэтому объясните что к чему :
Код

#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
    char * msgg = "My Message";
    __asm
    {

        lea dx, msgg
        mov ah,9
        int 0x21
    }
    printf("\n%s", msgg);
    _getch();
    return 0;
}

Выскакивает ошибка “Unhandled exception at 0x0041302b in asmik.exe: 0xC0000005: Access violation reading location 0xffffffff.”



--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
W4FhLF
Дата 17.6.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



ДОС-прерывания на win32 не работают. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
DigitSphinx
Дата 17.6.2007, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Ок, я открыл Turbo C++ и написал следующее
Код

int main()
{
    char * msgg = "My Message";
    asm  mov dx, [msgg]
    asm  mov ah,9
    asm  int 0x21
    return 0;
}

Откомилилось без проблем , exe’шник получился 6 кб ДОСовский 
Запустил , на консоль стал выводиться всякой мусор + динамик запищал !
А своей "My Message" я так и не увидел !
Да еще заменил int 0x21 на int 21h и на int 33 результат такой же
+ в exe’шнике лишний мусор типа :
Borland C++ - Copyright 1991 Borland Intl. Null pointer assignment
Divide error
Abnormal program termination

Это сообщение отредактировал(а) DigitSphinx - 17.6.2007, 14:22


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
Sartorius
Дата 17.6.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата

Откомилилось без проблем , exe’шник получился 6 кб ДОСовский 
Запустил , на консоль стал выводиться всякой мусор + динамик запищал !


Если не изменяет память мне, то в этой функции 21-го прерывания признак конца стороки не 0, а $ 

Цитата

+ в exe’шнике лишний мусор типа :
Borland C++ - Copyright 1991 Borland Intl
  smile  smile 

Это сообщение отредактировал(а) Sartorius - 17.6.2007, 14:39
PM MAIL ICQ   Вверх
DigitSphinx
Дата 17.6.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Sartorius, Спасибо я как-то перепутал в силу малого опыта .
Код

char * msgg = "My Message$"; // работает

для загрузки адреса в регистр я использую
Код

asm  mov dx, [msgg]

но обычно в примерах
Код

asm lea dx, msgg

правда там и строка объявляется как 
Код

msg db ‘……’,’$’

можешь объяснить на пальцах разницу ?!
P.S. Как же откомпилить чтобы мусор убрать ?

Это сообщение отредактировал(а) DigitSphinx - 17.6.2007, 15:22


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
vinter
Дата 17.6.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(DigitSphinx @  17.6.2007,  16:22 Найти цитируемый пост)
для загрузки адреса в регистр я использую

это неверно, если через mov то
Код

asm  mov dx,offset msgg

а через lea будет лучше, писанины меньше)


--------------------
Мой блог
PM MAIL WWW   Вверх
DigitSphinx
Дата 17.6.2007, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Я не пишу на асме а использую асм вставки в Turbo C++ , тем более что msgg у меня обявлена как 
Код

char * msgg = “My Message$”;
 так что На 
Код

asm  mov dx,offset msgg

Он не ругается но эффект такой же как и при 
Код

asm lea dx, msgg

а 
Код

asm mov dx, [msgg]

работает правильно !



--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
vinter
Дата 17.6.2007, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(DigitSphinx @  17.6.2007,  19:53 Найти цитируемый пост)
Он не ругается но эффект такой же как и при 

и тем не менее это правильно, 9 функция выводит строку оканчивающуюся знаком '$', по адресу который находится в dx/.
Цитата(DigitSphinx @  17.6.2007,  19:53 Найти цитируемый пост)
работает правильно !

очень странно т.к ты помещаешь в dx слово из памяти с адрессом msgg, т.е это у тя указывет черти куда. Верный вариант с Lea Или с offset, твой вариант не корректен, и даже если ты получаешь то что нуно, то это чистая случайность


Это сообщение отредактировал(а) vinter - 17.6.2007, 20:21


--------------------
Мой блог
PM MAIL WWW   Вверх
MAKCim
Дата 17.6.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



vinter, 
твой вариант неправильный
у DigitSphinx адрес строки храниться в msgg
через mov dx, [msgg] мы его получаем
варианты с mov dx, offset msgg и lea dx, msgg не дают адреса строки, а они дают адрес переменной msgg в стеке 
Код

push bp
mov bp, sp
sub sp, 2 ; место под msgg
; если делаем через lea, получим
lea dx, word ptr [bp - 2] ; адрес переменной
; а если через mov
mov dx, word ptr [bp - 2] ; получаем значение переменной, т. е искомый адрес
...


Это сообщение отредактировал(а) MAKCim - 17.6.2007, 20:49


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
DigitSphinx
Дата 17.6.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Цитата(MAKCim @  17.6.2007,  20:28 Найти цитируемый пост)
vinter, твой вариант неправильный

Именно это я и хотел сказать  smile 
Так какая разница между TC++
Код

char * msg = “My Message$”;

И masm
Код

msg db “My Message$”

В первом случае надо mov dx, [msg]
Во втором lea dx, msg или mov dx, offset msg

Это сообщение отредактировал(а) DigitSphinx - 17.6.2007, 21:17


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
vinter
Дата 17.6.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



точно, че то я решил что msgg это и есть адрес. Извиняюсь

Добавлено через 2 минуты и 25 секунд
Цитата(DigitSphinx @  17.6.2007,  22:13 Найти цитируемый пост)
Так какая разница между TC++char * msg = “My Message$”;И masmmsg db “My Message$”

разница в том что при Сишном обьявлении у тебя адрес строки помещается в переменную указатель, т.е физически строка хранится в памяти на которую указывает адрес который содержиться в msgg,а во втором случае ты имеешь имя переменной которое само по себе уже адрес строки в памяти поэтому надо юзать offset Или lea


--------------------
Мой блог
PM MAIL WWW   Вверх
DigitSphinx
Дата 17.6.2007, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Всем огромное спасибо !  smile 


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
MAKCim
Дата 17.6.2007, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(DigitSphinx @  17.6.2007,  21:13 Найти цитируемый пост)
В первом случае надо mov dx, [msg]
Во втором lea dx, msg или mov dx, offset msg

напиши в TC++
Код

char msg[] = "My message$"

int main() {
...
    return 0;
}

и разницы никакой не будет
vinter уже сказал почему


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
DigitSphinx
Дата 17.6.2007, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Спасибо MAKCim, именно это меня и интересовало .



--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.