![]() |
|
|
![]()
|
|
| suvolod |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 20.8.2005 Репутация: нет Всего: 1 |
Недавно начал читать самоучитель, в котором используются в основном
упрощенные директивы описания сегментов (типа .data, .code и т.д). И никак не могу с ними разобраться: Ниже привожу пример, написанный мной с "полными" директивами. Все работает, программа приглашает нажать клавишу и после выводит сообщение, что клавиша нажата...
После этого я попробовал описать ту-же задачу упрощенными директивами - примерно вот так: .386 .model large, C .data var dd 33333333h Mess1 db 'Enter any key...$' Mess2 db 'You have pressed the key!$' .code assume CS:@code, DS:@data Out_string proc NEAR mov ah,9 int 21h ret Out_string endp Wait_key proc NEAR mov ah,10h int 16h ret Wait_key endp BEGIN: mov eax, @data mov ds, eax LEA dx, Mess1 call Out_string call Wait_key LEA dx, Mess2 call Out_string call Wait_key mov ah, 4ch int 21h End BEGIN Сразу же возникли проблемы: //1 Я не понимаю, как мне спозиционировать сегменты. Например, сегмент данных я пытался установить вот так:
Программа понимает такие инструкции (с префиксом @), только если включить директиву .386 Но после включения этой директивы у меня не работают вызовы фций... - то есть программа просто завершается, не выводя никаких диалоговых сообщений в консоли... Подозреваю, что это связано с тем, что директива .386 предполагает уже оперирование 32-х разрядными регистрами/операндами. Но что-где не стыкуется, никак не могу понять, хотя пытаюсь разобраться уже 2 дня. Пожалуйста, накидайте рабочий пример с использованием упрощеных директив, и поясните хотя-бы коротко, в чем заключалась моя ошибка.... Я меня смущает еще одна вещь. Я нашел в своей электронной библиотеке несколько примеров с использованием упрощенных директив, и очень много примеров, где нет никакого "ручного" позиционирования на сегмент данных... Получается, что использование .code/.data предполагает, что ассемблер сам автоматом разрулит где код, а где данные, и найдет соотвествующие метки-переменные. Но на практике это у меня не подтвердилось... Написал примерно следующее:
...и просмотрел это дело через отладчик CodeView. В eax грузиться какой-то мусор, причем CodeView вообще подменяет команду "mov eax, var" на нечто вроде "mov ax, WORD PTR [0008]", то есть мало того что сегмент данных не спозиционирован, он еще и 32-разрядные регистры подменяет на 16-разрядные... |
||||||
|
|||||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |