Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на Ассемблере как общего так и конкретного характера.
 
важное примечание
для тех кто считает, что здесь место халявных исполнений курсовых и лабораторных работ.
тут обычно помогают тем, кто сам хоть что-то пытается понять и сделать, но что-то не понимает, что-то не получается...
ведь ассемблер изучают и задачки на нём дают обычно не менеджерам по продажам и даже не всем физ.-мат. специальностям
вы сами избрали этот путь? вот и идите по нему сами, ножками... с ручками и с головой...
 
короче, тут не сборище придурков-альтруистов, которым нечего делать и они ждут-не дождутся когда вы их попросите
что-то сделать _за_ вас
если позарез надо и вы даже готовы заплатить, тогда вам сюда
удачи
 
некоторые ресурсы
http://www.wasm.ru/ Самый популярный русскоязычный ресурс. https://wasm.in/
Ассемблер - книги (ASM, Assembler)
 
Просьба все большие листинги оформлять тегом more.
 
если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:42 29-11-2006 | Исправлено: akaGM, 17:44 11-06-2020
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
я пока 0 и в асемблере и в си,  

наверно надо поставить задачу попроще и продвигаться будет легче, чем двигаться втемноте полной на догадках на 99% неправильных.

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 22:45 07-03-2013
inf158704

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
код рабочий
могу бросить суюда если интересно он толко на СИ несовсем будет по теме
а слабо через INT21  прерывание написать?

Всего записей: 921 | Зарегистр. 21-08-2011 | Отправлено: 22:52 07-03-2013 | Исправлено: inf158704, 22:59 07-03-2013
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
.386
 
.model flat, stdcall  
option casemap :none  
 
include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\user32.inc
include \MASM32\INCLUDE\kernel32.inc
includelib \MASM32\LIB\user32.lib
includelib \MASM32\LIB\kernel32.lib
 
.data
mestitle    db "Hello",0
message        db "Hello World",0
.data?
buffer        db 512 dup(?)
 
.code
start:
invoke MessageBox,0,ADDR buffer,ADDR mestitle,MB_ICONASTERISK
invoke ExitProcess,0
end start

ввот рабочий код, разбери его скомпиль на масме и вперед

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 22:55 07-03-2013
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:

Цитата:
 Лучше собирать куски asm кода в lib при помощи MASM

 
чем мне может помоч этот способ?  

 
Не надо будет разбиратся, почему не работает mov edi, [ebp+arg_4], слинкуешь готовый asm код с Сишным.
 
А не работает он потому, что ebp нужен C компилятору для конструкции stack frame. И дело тут вовсе и не в arg_0 = dword ptr 8, он будет ругатся и если mov edi, [ebp] написать. Также ненадо соxранять esi, edi, ebx и ret  в конце ставить.

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 23:26 07-03-2013
inf158704

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ne_viens
Тоесть проблему сохранения и востановления состояний регистров для амсемблерной вставки кампилятор берет на себя. Я вас правильно понимаю?
Вы действительно правы в таком случае, проще всего собирать код при линковке. Только вот у меня нет ни одного примера как это делать. И опыта работы с масмом пока нет.
Если можно подскажите чтобы мне можно было посмотреть для примера. Пока незнаю чем отличаеться компилячия в библиотеку от исполняемого файла.  

Всего записей: 921 | Зарегистр. 21-08-2011 | Отправлено: 00:07 08-03-2013
vjick

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz
почему кстати нельзя иклудить? у меня в VS 2008 все ок подхватывается - файлы с процедурками

Всего записей: 1809 | Зарегистр. 29-01-2002 | Отправлено: 00:54 08-03-2013
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну может я ошибаюсь.

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 00:57 08-03-2013
vjick

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bomzzz
все ок инклудится. повыносил процедуры в отдельный файл. норм подхватываются но масм тоже понравился. в нем счас и пишу. менее громозкий, маленький и шустренький.

Всего записей: 1809 | Зарегистр. 29-01-2002 | Отправлено: 01:00 08-03-2013
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
мне он самому понравился. большая удача, что я его случайно выбрал положившись на марку микрософта. сейчас бы с фасмом каким нибудь мучался

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 01:07 08-03-2013
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
>inf158704
 
Да, о сохранении регистров компилятор позаботится.
 
Пример вызова куска asm кода из C:
 
1. Собираем obj файл из твоего примера выше с "ml /c ndis.asm"
Код надо чуть поправить:
;----------------------------------------------------
;ml /c ndis.asm
.486
.model flat, stdcall
option casemap:none
externdef ExAllocatePoolWithTag@12 ROC
 
.code
NdisInitializeString@8 proc C
 
    arg_0 = dword ptr 8
    arg_4 = dword ptr 0Ch
      
    mov    edi, edi
    push    ebp
...
        call    ExAllocatePoolWithTag@12
...
    retn    8
 
NdisInitializeString@8    endp
;----------------------------------------------------
 
2. Пишем прогу на C:
//===================================================
// cl linktest.c ndis.obj
#pragma comment(lib, "C:\\WinDDK\\7600.16385.1\\lib\\wxp\\i386\\ntoskrnl.lib")
 
typedef struct {
    short len;
    short len2;
    short* Name;
} UNICODE_STRING;
 
 
void __stdcall NdisInitializeString(UNICODE_STRING*, char*);
 
main()
{
    UNICODE_STRING str;
    char buf[16];
    
    NdisInitializeString(&str, buf);
}
//===================================================
 
3. Собираем C прогу вместе с ndis.obj "cl linktest.c ndis.obj"
 
Запустится она конечно незапустится, так как с ntoskrnl.exe слинкована, но идею понять можно.
 

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 01:33 08-03-2013
inf158704

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вопрос снял, нашел свою ошибочку, но пока некомпилируется до конца ошибка такая в логе
 
ndis.asm(81) : error A2088: END directive required at end of file
что значит пока непонимаю
 
retn    8
NdisInitializeString@8    endp
end NdisInitializeString@8
так компиляция проходит успешно, хорошобы мне только знать насколько это корректно
 
подскажите еще что значит @12 да и в принципе PROC  для чего здесь
недолжно ли быть чтото типа этого:
 externdef _imp__MessageBoxA@16:DWORD
     MessageBox equ <_imp__MessageBoxA@16>

Всего записей: 921 | Зарегистр. 21-08-2011 | Отправлено: 13:33 13-03-2013 | Исправлено: inf158704, 09:14 14-03-2013
delover

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сорри за немного флуд.
 
Самый лучший ассемблер который я видел это компьютер ДВК. Он умел делать такие инструкции которых не умеет нынешний Pentium. Я имею ввиду типа
 
MOV AX, DI + [CX+DX+[EI+SP]]
 
Интересно ваксы сейчас умеют такое? Однажды человечество пошло путём интел.

Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 09:00 14-03-2013
bomzzz



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
если бы ему для этого нужно было пол такта, был бы повод для обсуждений. посмотри команду lea

Всего записей: 13343 | Зарегистр. 13-01-2008 | Отправлено: 09:46 14-03-2013
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
inf158704

Цитата:
подскажите еще что значит @12
где?
если здесь, то это для восстановления стека, "снять со стека @N байт":
Цитата:
retn    8
NdisInitializeString@8

Всего записей: 24055 | Зарегистр. 06-12-2002 | Отправлено: 11:26 14-03-2013
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
ndis.asm(81) : error A2088: END directive required at end of file
что значит пока непонимаю
 
retn    8
NdisInitializeString@8    endp
end NdisInitializeString@8
так компиляция проходит успешно, хорошобы мне только знать насколько это корректно

 
Это значит, что я с ctrl-c, ctrl-v последнюю строчку не скопировал (END NdisInitializeString@8).
 

Цитата:
 
подскажите еще что значит @12 да и в принципе PROC  для чего здесь
недолжно ли быть чтото типа этого:
 externdef _imp__MessageBoxA@16:DWORD
     MessageBox equ <_imp__MessageBoxA@16>

 
@12 - Это так называемая декорация названия функции.
У C функции добавляется "_" в начале, у __stdcall тоже добавляется "_" в начале а в конце "@" и число, которое равно количеству аргументов умноженное на 4, а C++ вообще кошмарные названия получаются.
Таким образом ndis.lib будет импортировать _ExAllocatePoolWithTag@12 из ntoskrnl.lib, a експортировать _NdisInitializeString@8, которую в свою очередь будет импортировать linktest.c  Хексредактором можно посмотреть libы и называть ф-ии так, чтобы получался подсмотренный результат.
 
ROC - это просто ещё один способ вызвать внешнюю ф-ю.
В этом случае код будет:
 
        CALL _jmp
_jmp:
        JMP DWORD PTR[<&user32.MessageBoxA>]  
 
 
А с TR сразу:
 
        CALL DWORD PTR[<&user32.MessageBoxA>]
 
 

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 11:47 14-03-2013
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ne_viens

Цитата:
У C функции добавляется "_" в начале, у __stdcall тоже добавляется "_" в начале а в конце "@" и число, которое равно количеству аргументов умноженное на 4
нет, ты ошибаешься, -- всё-таки _количество байт_, передаваемых в функу...

Код:
void __stdcall test(double aa)
{
  a = 20.;
}
void main() {
  test(10.);
}

 
а код у тя ну очень красивый получился, Шрека пересматриваешь?  :)

Всего записей: 24055 | Зарегистр. 06-12-2002 | Отправлено: 14:04 14-03-2013 | Исправлено: akaGM, 18:06 14-03-2013
inf158704

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
насчет кода значения неимеет просто пример мне он более менее понятен...
а вот собрать 2 в одном я так и несмог
при cl linktest.c ndis.obj > txt.txt
ошибка
ndis.obj : error LNK2019: unresolved external symbol _ExAllocatePoolWithTag@12 referenced in function _NdisInitializeString@8
тут похоже как раз проблема с именами получаеться пока читаю но тут до макросов FAR аж дело дошло  
получилось толко когда в linktest.c добавил следующее:
 
#pragma comment(lib, "C:\\WinDDK\\2600\\lib\\wxp\\i386\\ntoskrnl.lib")  
#pragma comment(lib, "C:\\WinDDK\\2600\\lib\\wxp\\i386\\ndis.lib")  
так собираеться линкером
если  
 #pragma comment(lib, "C:\\WinDDK\\2600\\lib\\wxp\\i386\\ndis.lib")  
можно собрать чарез  cl linktest.c без ndis.obj тотол командер правда показывает при этом что функции ndis нет в системе и файл получаеться 14кВ вместо 2 при первом варианте да и из kernel32 пытается кучу импорта получить...
поэтому вопрос задам глупый а что такого береться из библиотек?
 

Всего записей: 921 | Зарегистр. 21-08-2011 | Отправлено: 14:16 14-03-2013 | Исправлено: inf158704, 15:13 14-03-2013
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
насчет кода значения неимеет просто пример мне он более менее понятен...

я только хотел сказать, что граф.смайлы -- маздай и больше ничего...

Всего записей: 24055 | Зарегистр. 06-12-2002 | Отправлено: 14:51 14-03-2013 | Исправлено: akaGM, 14:57 14-03-2013
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
нет, ты ошибаешься, -- всё-таки _количество байт_, передаваемых в функу...  

 
Да, так будет правильней.
 

Цитата:
если  
 #pragma comment(lib, "C:\\WinDDK\\2600\\lib\\wxp\\i386\\ndis.lib")  
можно собрать чарез  cl linktest.c без ndis.obj тотол командер правда показывает при этом что функции ndis нет в системе и файл получаеться 14кВ вместо 2 при первом варианте да и из kernel32 пытается кучу импорта получить...
поэтому вопрос задам глупый а что такого береться из библиотек?  

 
Если линковать с C:\WinDDK\2600\lib\wxp\i386\ndis.lib, то linktest.exe будет искать код, который в \system32\drivers\ndis.sys, a не тот, который специально для него написан в ndis.asm У тебя WINDDK вообще установлен? Вообще-то с не хорошего примера начали, так как пользовательский код и код ядра отделены, и один к другому не обращаются.
 
Из kernel32.dll? Ф-ии (HeapAlloc(), GetCommandLine(), итд), необходимые для stdlib. Если stdlib не требуется, надо линковать с ключами /NOSTANDARTLIB /ENTRY:main

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 21:57 14-03-2013 | Исправлено: ne_viens, 21:59 14-03-2013
inf158704

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ddkXP, ddk98 и VC++ 6 использую
готовые настройки проекта взял из книги Walter Oney да и разбираю его проет  WDMSTUB
оставил 4 экспортируемые функции для шаблона а остальные удалил, пытаюсь теперь добавить свою
да из kernel32.dll берет именно эти функции ну и еще штук 30
сделать просто LINK несмогу слижком уж там все наворочено поэтому постараюсь вставить в си  
для размышления себе нашол щас это:

Цитата:
 
При линковке asm функций в С программу следует учесть следующие моменты:
 транслятор ассемблера по умолчанию переводит все имена в верхний регистр, myfunc станет MYFUNC;
 компилятор С и линковщик могут различать или не различать символы верхнего и нижнего регистра, что собственно зависит от настроек;
 компилятор С (не С++!) к имени функции добавляет подчеркивание в начале, вызываешь функцию func(), линковщик будет искать _func();
 при вызове функции С/С++ программа размещает параметры в стеке и чистит стек после завершения функции, возвращаемое значение берется из регистра AX (EAX),  
 
Объявлять функции в asm коде необходимо таким образом (чтоб можно было вызвать из С)
PUBLIC _MYFUNC
_MYFUNC PROC C FAR
где PUBLIC открывает доступ к функции из других модулей, подчеркивание перед _MYFUNC приводит имя к С виду, PROC C сообщает транслятору asm что твоя функция предназначена для вызова из С, FAR размещает функцию в отдельном сегменте данных, что позволяет получить доступ к функции если размер программы в памяти больше 64К (необходимо для больших моделей памяти)
Кроме этого в masm-е и tasm-е есть множество макросов предназначенных для работы с параметрами как в С.
 
Для вызова asm функции _MYFUNC из С потребуется:
 создать прототип функции
extern far int MYFUNC();
 включить поддержку линковщиком символов в верхнем регистре;  
 подключить obj или lib (если сделал) к проекту.
 


Всего записей: 921 | Зарегистр. 21-08-2011 | Отправлено: 11:48 15-03-2013 | Исправлено: inf158704, 11:50 15-03-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru