Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вызов Win32 API функций и проблемы с tasm5+

47K
23 сентября 2010 года
Cka3o4HuK
31 / / 21.10.2009
Доброго времени суток.
Суть проблемы такова: имеется примитивный код
Код:
.386                                
.model  flat

extrn ExitProcess:PROC     
extrn MessageBoxA:PROC

.data    

Ttl db "First ASSEMBLER program",0h
Msg db 'Hello, World!!!!',0h

.code

start:
    push 0h
    push offset Msg
    push offset Ttl
    push 0h
    call MessageBoxA
    push 0h
    call ExitProcess
end     start

Компиляция и компоновка проходят без ошибок. А вот при запуске программы получаю сообщение о том что точка входа в процедуру ExitProcess не найдена в библиотеке DLL USER32.DLL
Если убрать ExitProcess то получаю такое же сообщение для MessageBox.
Для компиляции использую bat-файл примерно такого содержания (у меня пути к тасму другие)
 
Код:
cls
echo off
d:\tasm_5\BIN\tasm32 /m3 /ml %1,,;
d:\tasm_5\BIN\tlink32 /Tpe /aa %1,%1,,d:\TASM_5\Lib\imp32i.lib
echo "Succesful"

tasm5+ взял тут
Как мне заставить все это работать? И еще вопрос в догонку. Мне нужно использовать функцию GetWindowsDirectory которая в качестве параметра должна получать буфер, в который скопирует путь к папке виндовс. Как на ассемблере нужно объявить такой буфер и как из него потом вывести путь до папки виндовс например через тот же MessageBox?
7
23 сентября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Ох уж мне этот TAsm…Лень разбираться:) Попробуй для начала разобраться с ключами командной строки(и сюда описание того,что получилось,выведи).Как вариант,можно попытаться подключить нужные библиотеки,а не ту сразу(BTW,ExitProcess в User32.dll никогда и не было;))

Насчёт GetWindowsDirectory:надо узнать максимальный размер буфера(читай MSDN) и просто выделить его в своей программе(типа [FONT="Courier New"]szWinBuf DD 65[/FONT]).Остальное,надеюсь,понятно

P.S.А ещё вместо ExitProcess можно использовать просто Ret(разумеется,при условии балансировки стека)
14
24 сентября 2010 года
Phodopus
3.3K / / 19.06.2008
Чета у тебя с библиотекой импорта.
ExitProcess расположен не в user32.dll а в kernel32. MessageBox, тот, да.
Ну и имя imp32i.lib намекает... Не помню у тасма такой либы, другая была.
399
24 сентября 2010 года
KIV
432 / / 20.01.2009
Никогда не понимал зачем нужны lib-файлы. Намного удобнее, когда импорт описывается с исходном тексте (возможно, во включаемом файле) как это делают прочие ассемблеры вроде fasm.
Цитата:
типа szWinBuf DD 65


Символ не занимает 4 байта. Если вы используете GetWindowsDirectoryW, то символы кодируются в Unicode и размер символа 2 байта => buffer dw 64 dup (?), а если GetWindowsDirectoryA, то ANSI и размер символа 1 байт => buffer db 64 dup (?)

7
24 сентября 2010 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: KIV
Символ не занимает 4 байта

Где я утверждал обратное?Правильно,нигде
ТС использует ANSI-версии функций,а Max_Path=260.Следовательно,надо резервировать 4·65 байт,что и написано

47K
29 сентября 2010 года
Cka3o4HuK
31 / / 21.10.2009
Простите за долгое отсутствие :rolleyes:
с параметрами командной строки все вроде впорядке, взял их из одной статьи об ассемблере на данном ресурсе вместе с исходным кодом =) а вот библиотека мне тоже не нравится. Она идет в составе тасма5 по дефолту (по крайней мере если качать его с wasm.ru). В описании к ней сказано следующее:
Цитата:
im32i.lib is a multi-purpose library for TASM5
and has been build from the following Win32 dlls:

kernel32.dll
gdi32.dll
user32.dll
shell32.dll
advapi32.dll
Msvcrt.dll
Comctl32.dll
Comdlg32.dll
winmm.dll

For most Win32 applications this should be enough (?) :-)


Как объявить переменную под буфер это понятно, не понятно как мне потом его использовать. Если не сложно набросайте код, как результат работы функции GetWindowsDirectoryA передать функции MessageBoxA. Буду бесконечно благодарен :(

7
29 сентября 2010 года
@pixo $oft
3.4K / / 20.09.2006
 
Код:
Invoke GetWindowsDirectory,Addr szWinBuff,SizeOf szWinBuff
Invoke MessageBox,0,Addr szWinBuf,0,0
Как-то так.Правда,это писалось для MAsm,а в TAsm может отсутствовать Invoke.Это решается простой заменой оного на Push параметров и Call функции
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог