.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
Вызов Win32 API функций и проблемы с tasm5+
Суть проблемы такова: имеется примитивный код
Код:
Компиляция и компоновка проходят без ошибок. А вот при запуске программы получаю сообщение о том что точка входа в процедуру 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"
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?
Насчёт GetWindowsDirectory:надо узнать максимальный размер буфера(читай MSDN) и просто выделить его в своей программе(типа [FONT="Courier New"]szWinBuf DD 65[/FONT]).Остальное,надеюсь,понятно
P.S.А ещё вместо ExitProcess можно использовать просто Ret(разумеется,при условии балансировки стека)
ExitProcess расположен не в user32.dll а в kernel32. MessageBox, тот, да.
Ну и имя imp32i.lib намекает... Не помню у тасма такой либы, другая была.
Цитата:
типа szWinBuf DD 65
Символ не занимает 4 байта. Если вы используете GetWindowsDirectoryW, то символы кодируются в Unicode и размер символа 2 байта => buffer dw 64 dup (?), а если GetWindowsDirectoryA, то ANSI и размер символа 1 байт => buffer db 64 dup (?)
Цитата: KIV
Символ не занимает 4 байта
Где я утверждал обратное?Правильно,нигде
ТС использует ANSI-версии функций,а Max_Path=260.Следовательно,надо резервировать 4·65 байт,что и написано
с параметрами командной строки все вроде впорядке, взял их из одной статьи об ассемблере на данном ресурсе вместе с исходным кодом =) а вот библиотека мне тоже не нравится. Она идет в составе тасма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 (?) :-)
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. Буду бесконечно благодарен :(
Код:
Invoke GetWindowsDirectory,Addr szWinBuff,SizeOf szWinBuff
Invoke MessageBox,0,Addr szWinBuf,0,0
Invoke MessageBox,0,Addr szWinBuf,0,0