![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 | |
Участник клуба
Регистрация: 30.07.2009
Сообщений: 1,601
|
![]()
Добрый день. Недавно я узнал, что NASM не определяет, какой произошел вызов: ближний или дальний. Я начал гулить, понял в чем суть, но так и не нашел примера из-за такого отношения:
Цитата:
asm.asm Код:
Код:
Код:
Заранее спасибо Последний раз редактировалось _PROGRAMM_; 16.07.2013 в 19:30. |
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
сомневаюсь что линух плодит кучу сегментов для разных модулей приложения.
вообще проверить легко, так как если не тот тип возврата, то приложение улетит ![]() Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#3 | ||
Участник клуба
Регистрация: 30.07.2009
Сообщений: 1,601
|
![]() Цитата:
Цитата:
Вот еще один вопрос без решения которого не получится легко проверить вышеприведенный код. Сначала я хотел создать отдельную ветку в "Общих вопросах С++" но вызовы были в приоритете. Дело вот в чем. Сразу скажу, что косяк при сборке проекта и в моем непонимании С++ соглашения. Компилируя asm.asm я получаю объектный файл asm.o. C main.cpp все происходит точно так же (я в первом посте описал сборку). Выполняя третью команду я хватаю ошибку Код:
nm asm.o Код:
Код:
P.S. я когда переносил asm.asm в сообщение он был слегка изменен в ходе эксперимента. Функция называлась не _AsmPrint, а AsmPrint. Исправил. Результаты nm актуальны для исходников в первом посте. Добавлено: Изменил в asm исходнике с Код:
Код:
Код:
т.к Код:
Последний раз редактировалось _PROGRAMM_; 16.07.2013 в 19:59. |
||
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,370
|
![]()
Дальний вызов нужен для того, чтоб менят сегмент. В современных ОС это в основном нужно самой ОС.
Процедуры в asm можно определять являются ли они near или far, соответствено будет генерится правильный ret и правильный call. Прежде, чем писать на ассемблере, уясните понятие calling convention и name mangling - тогда многие вопросы отпадут. |
![]() |
![]() |
![]() |
#5 | ||
Участник клуба
Регистрация: 30.07.2009
Сообщений: 1,601
|
![]() Цитата:
Цитата:
|
||
![]() |
![]() |
![]() |
#6 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ближний ближнему | Natali.ru | Помощь студентам | 9 | 18.01.2012 16:11 |
Дальний косвенный вызов | Kenny McCormick | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 17.11.2010 00:59 |
CR-Team ищет программистов для проeкта "Дальний Свет" | Ha3aP | Фриланс | 6 | 22.10.2009 19:28 |
Дальний рубеж треугольника Паскаля | NecRomant | Общие вопросы Delphi | 3 | 05.11.2008 17:03 |
вызов | Iceman | Софт | 7 | 24.02.2008 07:30 |