Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 450
от 16.05.2006, 20:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 331, Экспертов: 23
В номере:Вопросов: 3, Ответов: 5


Вопрос № 42656: Вот купил книгу Калашникова "Ассемблер - это просто"; так, вроде все понятно до первого листинга: скачал с сайта MASM12, но не могу разобраться с установкой. Помогите с мануалом или типа такого описуйте как все запускать и т. д., Рахметский...
Вопрос № 42676: Здравствуйте эксперты, доброго времени вам суток . Мне бы хотелось разьяснить один вопрос ! При дальнем переходе используется написание jmp dword ptr cs:[ variable ] где variable=сегмент+смещение Почему так? Ведь зап...
Вопрос № 42689: Здраствуйте! Господа эксперты,при изучении Prog10.com и Test10.com из книги Калашникова не ясно, почему при входе в отладчике AFDPro "внутрь" прерывания 21h "Test10.com" нет адресов строк ds:dx(они нулевые) , тем самым не понятно,...

Вопрос № 42.656
Вот купил книгу Калашникова "Ассемблер - это просто"; так, вроде все понятно до первого листинга: скачал с сайта MASM12, но не могу разобраться с установкой. Помогите с мануалом или типа такого описуйте как все запускать и т. д., Рахметский заранее.
Отправлен: 10.05.2006, 21:32
Вопрос задал: Toti (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Пан Павел Константинович
Здравствуйте, Toti!

===========================================================
Этот вопрос звучит очень часто РЕКОМЕНДУЮ автору книги "Ассемблер - это просто" обратить внимание на этот вопрос и пренять определенные меры по устранению недачёта.
===========================================================
СОВЕТ: Если при инстоляции имеются установки по умолчанию, то лучше их не менять.
===========================================================
Этапы установки:

1. Распаковываем MASM.EXE(Запуск MASM.EXE --> Кнопка Извелчь)
2. После распаковки у вас появляется папка MASM 6.12, заходим в эту папку.
3. В папке DISK1, запускаем файл SETUP.EXE.
4. Знакомимся с программой установки и Нажимаем ENTER для продолжения.
5. Попадаем в Main Menu, выбераем пункт Install the Microsoft Macro Assembler, нажимаем ENTER.
6. Выбераем ОС для Запуска MASM(MS-DOS/Microsoft Windows) и нажимаем ENTER.
7. Install files for Microsoft Windows, выбераем YES.
8. Install PWB, выбераем YES.
9. Install Brief compatibility, выбераем NO НО! можно и YES.
10. Copy the Microsoft Mouse Drive, выбераем YES НО! можно и NO, это зависит от того хотите ли вы использовать мышку.
11. Install the MASM Utility, выбераем YES, может прегодится в будующем.
12. Copy the Help file, выбераем YES и только YES.
13. Copy the Sample Programs, выбераем YES.
14. Выбераем путьпапку для установки Исполняемых файлов(по умолчанию уже стоит путь и папка, лучше оставить без изменения данный путь и не менять имя данной папки) и НАЖИМАЕМ ENTER.
15. Выбераем путьпапку для установки файлов-библиотек(LIBIRY-FILE) и НАЖИМАЕМ ENTER.
16. Выбераем путьпапку для установки включаемых файлов или файлов-заголовков(INCLUDE FILE) и НАЖИМАЕМ ENTER.
17. Выбераем путьпапку для инициализации PWB и CodeView и НАЖИМАЕМ ENTER.
18. Выбераем путьпапку для Help files и НАЖИМАЕМ ENTER.
19. Выбераем путьпапку для Примеров(Samples) и НАЖИМАЕМ ENTER.
20. Confirm Your Choices, Выбераем пункт NO CHANGES и НАЖИМАЕМ ENTER.
21. Installation Complete(Инстолляция завершена), теперь нажмаем CTRL+C, для выхода.
22. ВСЁ пакет установлен.
===========================================================
Создание *.COM файла:

1. Запускаем Сеанс MS-DOS.
2. Переходим в папку C:MASM611BIN (путь к данной папке зависит от того что вы указывали при инсталоровнии пакета MASM611).
3. Запускаем ML.EXE так:
C:MASM611BINml.exe /AT file.asm
4. ВСЁ! теперь у нас есть file.com, он находится в папке C:MASM611BIN.
===========================================================

С, Уважением MnEm0n!C.

---------
Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 7-ой класс)
Ответ отправлен: 11.05.2006, 01:05


Вопрос № 42.676
Здравствуйте эксперты, доброго времени вам суток .

Мне бы хотелось разьяснить один вопрос !

При дальнем переходе используется написание
jmp dword ptr cs:[ variable ]
где variable=сегмент+смещение
Почему так?
Ведь запись cs:[...] означает что мы прыгаем на cs со смещением [...]
а тут получается что мы переходим на сегмент со смещением [сегмент+смещение].
Может дурацкий вопрос - тогда извините.... :)
Заранее спасибо .
И еще хотелось бы передать Mnemon!c`y thanks
за ответ на мой предыдущий вопрос .
Принял ответ через the Bat а там кнопочка "Отправить оценку" не жмалась. Поставил "5".Но не смог отправить .
Отправлен: 11.05.2006, 04:04
Вопрос задал: Moontain (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Пан Павел Константинович
Здравствуйте, Moontain!

> При дальнем переходе используется написание jmp dword ptr cs:[ variable ] где variable=сегмент+смещение Почему так?

>> Интересный вопрос. Регистр <cs>, очень кретичен к командам.

Например у команды MOV есть два исключения:

MOV Приёмник, Источник

1. В качестве приёмника НЕ! может выступать регистр <cs>.
2. Нельзя записать команду ПРЯМОЙ инициализации сегмента данных.

Привоже код и объясняю принцеп работы:

CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
Begin:
jmp dword ptr ds:[REG_CS_IP]

REG_CS_IP dw 0101h ;Смещение
dw 0102h ;Адрес сегмента

ret ;exit
CSEG ends
end Begin

И так. Мы имеем программу типа *.COM, этот тип специфичен, а именно все сегментные регистры равны между собой.

Матем-ки это выгледит так:
CS = DS = SS = ES

Мы имеем инструкцию jmp dword ptr ds:[REG_CS_IP], суть её работы следующая:

1. Перейти на сегмент, адрес которого находится в регистре <ds>.
2. В сегменте на который указывает регистре <ds> перейти по смещению REG_CS_IP.
3. Так как колличество считываемых быйт равно четырём(эту информацию говорит нам запись dword ptr), использовать дальний переход(far jmp).
4. Так как у нас дальний переход считать 4 байта который находятся по адресу dword ptr ds:[REG_CS_IP], при этом младшие 2 байта записать в регистр <ip>, а старшие в <cs>.
5. Перейти на сегмент который находится по адресу который указан в регистре <cs> и сделать в этом сегменте, смещение которое указано в регистре <ip>.
6. ВСЁ! теперь регистры выглядят так -> <cs> = 0102h, <ip> = 0101h.

Немного о jmp:

Инструкцию jmp dword ptr ds:[REG_CS_IP], можно записать и так:

jmp dword ptr cs:[REG_CS_IP], jmp dword ptr ss:[REG_CS_IP], jmp dword ptr es:[REG_CS_IP] ПОЧЕМУ? а потому, что работае, равенство CS = DS = SS = ES

Можно и без указания регистра:
jmp dword ptr [REG_CS_IP] - по умолчанию подрузумевается, что используется регистр <ds>.

СОВЕТ: Проделайте опыты c JMP в Turbo Debuger.

Восприятие коммпилятором разных записей:

0ff260401h - jmp word ptr [REG_CS_IP], короткий переход.
0ff2e0401h - jmp dword ptr [REG_CS_IP], дальний переход.
Как мы видим разници в использовании слов word и dword.

С, Уважением MnEm0n!C.

---------
Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 7-ой класс)
Ответ отправлен: 11.05.2006, 06:37
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое - Приочень благодарен !!!

Отвечает: Евгений Иванов
Здравствуйте, Moontain!
И здравствуйте Пан Павел Константинович.

Сначала отвечу первому.


    jmp dword ptr cs:[ variable ] - это переход по сегменту и смещению в нём, а сами эти величины находятся по адресу cs:[var].


Отвечаю второму:

  • Насчёт исключений у MOV. Их нет. В качестве приёмника может выступать регистр CS, что и делается с помощью команд JMP. Допустим, можно написать выше-названную команду так - CLI; MOV IP, [cs:var]; MOV CS, [cs:var+4]; STI;

  • Теперь насчёт прямой инициализации. Тоже есть такая команда.
    JMP FAR seg:addr
    Конкретно код её EAh. На примере MOV: CLI; MOV IP, first_val; MOV CS, second_val; STI;

    Если бы Пан внимательно читал рассылку и мои исходники, он бы видел этот код, который я довольно часто применяю (применял 8 лет назад, сейчас я их благополучно не использую с учётом использования win32). Но, к сожалению, этот "эксперт" не только не хочет учиться, но и не знает систему команд процессоров IA32, что крайне неприятно. Неприятно видеть, как он морочит людям голову, когда они хотят учиться и задают здесь вопросы.


---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Россия, Нижний Новгород
Тел.: +78313145721
Организация: M2Media.ru
Адрес: Нижний Новгород, ул.Малая Ямская
WWW: Eugene Ivanov
ICQ: 214;88;90;76
----
Ответ отправлен: 11.05.2006, 12:17
Оценка за ответ: 5
Комментарий оценки:
:) Мда хорошо что придупредил . Спасибо .

Отвечает: Ayl
Здравствуйте, Moontain!

Потому что эта запись обозначает не просто дальний переход (jmp far address), а косвенный дальний переход. То есть адрес перехода не записан непосредственно в коде программы, а располагается в виде длинного целого в памяти. И запись cs:[...] относится не к адресу перехода, а к адресу первой ячейки, в которой и записан реальный адрес перехода.

Сравни фазы выполнения команд:
jmp far address -> Взять КОП, получить адрес перехода (2 слова), записать старшее слово в CS, младшее в IP
jmp dword ptr cs:[offset] -> взять КОП, получить смещение операнда, взять из ячейки по адресу cs:[offset] адрес перехода (2 слова), записать старшее слово в CS, младшее в IP

---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Академик)
Россия, Санкт-Петербург
ICQ: 5163321
----
Ответ отправлен: 11.05.2006, 15:40
Оценка за ответ: 5
Комментарий оценки:
Большое спасиба


Вопрос № 42.689
Здраствуйте! Господа эксперты,при изучении Prog10.com и Test10.com из книги Калашникова не ясно, почему при входе в отладчике AFDPro "внутрь" прерывания 21h "Test10.com" нет адресов строк ds:dx(они нулевые) , тем самым не понятно,как заменяются адреса выводимой строки на экран. С уважением Бурматов.
Отправлен: 11.05.2006, 09:30
Вопрос задал: Бурматов Владимир Александрович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Пан Павел Константинович
Здравствуйте, Бурматов Владимир Александрович!

После захода в отладчике AFDPro "внутрь" прерывания 21h "Test10.com" т.е. нажимать F1 для захода внутрь, у меня вот какая картина:

<DS> = 1F13
<DX> = 0109

Делаем вывод. Если при прогоне программы "Test10.com", а именно после выполнения инструкции mov dx,0109, у вас регистры равны тем значениям которые я указал выше и после захода "внутрь" прерывания 21h, они меняются, значит проблема либо с отладчиком, либо с обработкой инструкции INT, что мало вероятно.
> тем самым не понятно,как заменяются адреса выводимой строки на экран.
>> В файле Prog10.asm найдите строки:

Ok_09:
push ds
push dx

push cs ;Ниже комментарии
pop ds ;Ниже комментарии

mov dx,offset My_string ;Ниже комментарии
pushf

call dword ptr cs:[Int_21h_vect] ;INT 21h

pop dx
pop ds
iret

Int_21h_vect dd ?
My_string db 'Моя Строка!$' ;Ниже комментарии

Как мы знаем что-бы вывести строку необходим адрес строки который находится в
<DS:DX>, исходя из этого у нас выше есть, такой код: push cs, pop ds и mov dx,offset My_string, так как данные, к которым можно обратиться с помощью метки My_string, находятся в пределах резидентной части они не будут затёрты. Следовательно эти данные можно вывести в данном случае мы выведим строку 'Моя Строка', но что-бы вевести необходимо указать как адрес сегмента строки так и смещение в нём, для указания адреса сегмента служат push cs, pop ds, ПОЧЕМУ!? регистр <CS>, а потому что, строка находится в пределах кодового сегмента она так же резидентна т.е. находится там где и остальные комманды резидента. НУ со смещением думаю вы поняли как обстоит дело.

Интересная вещь.
Даже если вы обнулите регистры <DS>, <DX> после захода в INT 21h всё равно в момент выполнения инструкции call dword ptr cs:[Int_21h_vect], у вас будет рабочая "картина" регистров.
С, Уважением MnEm0n!C.


---------
Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 7-ой класс)
Ответ отправлен: 12.05.2006, 03:49


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.32 от 03.05.2006
Яндекс Rambler's Top100

В избранное