Мне в программе надо вызвать примерно вот что: sprintf(buf,"%i.%i.%i %i:%i:%i"... А вот описать sprintf не получается... А ОЧЧЕНЬ неохота ручками форматированный вывод изобретать... Если у кого-то получалось, напишите, как описать сию функцию. Я пробовал
Здравствуйте, __kain, Вы писали:
__>Мне в программе надо вызвать примерно вот что: sprintf(buf,"%i.%i.%i %i:%i:%i"... А вот описать sprintf не получается... А ОЧЧЕНЬ неохота ручками форматированный вывод изобретать... Если у кого-то получалось, напишите, как описать сию функцию. Я пробовал __>
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, __kain, Вы писали:
__>Чем не подходит? Да мне в обще-то без разницы. Просто раньше на ассемблере не приходилось ничего писать. Спасибо, сегодня попробую.
Если подходит, тогда вот Вам примерчик:
.586
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
;--------------------------------------------------------------------------------
;creates string in .data section & returns pointer to it
;--------------------------------------------------------------------------------
$db macro arg:vararg
LOCAL data_ptr
.DATA
data_ptr db arg
.CODE
exitm <offset data_ptr>
endm
.code
start:
main proc
local buf [256]:byte
invoke wsprintfA, addr buf, $db ("%i.%i.%i %i:%i:%i", 0), 1, 2, 3, 4, 5, 6
.if eax
invoke MessageBoxA, 0, addr buf, $db ("wsprintf test", 0), MB_OK
.endif
invoke ExitProcess, eax
main endp
end start
Компилируется так:
ml /coff wsprintf.asm /link /subsystem:windows kernel32.lib user32.lib
Если будет ругаться на wsprintfA, добавте прототип
CRT лучше не использовать — нужной версии msvcrt.dll может не быть в старых виндовсах.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, __kain, Вы писали:
__>Спасибо за пример!!! Правда не пойму, для какого это ассемблера? для MASM?
Да, для масм. Я понял что Вам нужен он, по extrn __imp__sprintf20:dword
__>У меня дока такая, которая может компилиться на всех видах ассемблера...
На всех вряд ли диалекты сильно различаются. Или что за дока, я не совсем понял
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Дока у меня электронная — "Ассемблер для Unix, Dos, Windows". Выразился я немного неточно, там в .inc файлах различие есть, а в целом программы построены без специфических наворотов.
Кстати, компиль ругается: Syntax Error: PROTO.
P.S.
Компиль у меня ml.exe. Нашел я его в пакете с Visual Studio .NET 2003...
Здравствуйте, __kain, Вы писали:
__>Мне в программе надо вызвать примерно вот что: sprintf(buf,"%i.%i.%i %i:%i:%i"... А вот описать sprintf не получается... А ОЧЧЕНЬ неохота ручками форматированный вывод изобретать... Если у кого-то получалось, напишите, как описать сию функцию. Я пробовал
> __imp__sprintf@20
Хм, а откуда вот это взялось? sprintf ни разу ни stdcall.
(тоесть в процедурах, объявленных как extrn он разрешает вызов таких-же extrn процедру, но переходить по меткам и на описанные мной процедуры всеравно нельзя)
Здравствуйте, __kain, Вы писали:
__>Здравствуйте, vvotan
__>Ура, заработало!!! Оч большое спасибо.... Если позволите,
Лучше будет на "ты" __> я задам еще 2 вопроса: __>1)
add esp, 16
Это очистка стека после вызова процедуры?
Да. sprintf использует соглашение о вызове cdecl, по которому очищать стек обязана вызывающая процедура. __>2) Почему компилятор мне запрещает вызовы процедур и переход по меткам внутри процедур?
Ничего не понял. Приведи кусок кода.
Здравствуйте, __kain, Вы писали:
__>Дока у меня электронная — "Ассемблер для Unix, Dos, Windows". Выразился я немного неточно, там в .inc файлах различие есть, а в целом программы построены без специфических наворотов.
По программированию под Win32 лучше Icazelion'а почитать, он для С программистов пишет, там и примеры есть. Ну а сам асм можно и по Зубкову изучать.
__>Кстати, компиль ругается: Syntax Error: PROTO. __>Компиль у меня ml.exe. Нашел я его в пакете с Visual Studio .NET 2003...
У меня такой же, а что за полный текст ошибки-то? Вероятно проблемы с отсутствием хидеров Вам мешают, можно взять готорвые из дистрибутива hutch здесь. Компилятор там старый вроде, можно новый оставить. Или можно fasm там же посмотреть, с ним идут примеры. Это хороший (нет оверхеда в синтаксисе вроде offset) ассемблер, у Зубкова он не описан, но подробно документирован в отличие от других (на английском).
Вот как на нём может выглядеть использование CRT — описание таблицы импорта PE файла сразу в исходнике, никакие линкеры и либы не нужны
format pe
;; mov ebp,esp
push read_mode
push source_name
call [fopen]
test eax, eax
jz not_found
add esp, 2*4
xchg eax, esi
@@: push 0
mov edi, esp
push esi
push 1
push 1
push edi
call [fread]
add esp, 4*4
test eax, eax
jz close
push edi
push form
call [printf]
add esp, (2+1)*4
;; mov esp,ebp
jmp @b
close: push esi
call [fclose]
add esp, (1+1)*4
exit: ;; mov esp,ebp
ret
not_found:
push error_message
call [printf]
add esp, (2+1)*4
jmp exit
error_message db "coudn't open file `%s'.",0
form db "%s",0
read_mode db "r",0
source_name db "crt.asm",0
align 4
data import
dd 0,0,0,rva kernel_name,rva kernel_table
dd 0,0,0,rva msvcrt_name,rva msvcrt_table
dd 0,0,0,0,0
; 2K needs this to load PE
kernel_table: dd 0
msvcrt_table:
fclose dd rva fclose$
fread dd rva fread$
fopen dd rva fopen$
printf dd rva printf$
dd 0
kernel_name db'KERNEL32.DLL',0
msvcrt_name db'MSVCRT.DLL',0
fclose$ db 0,0,'fclose',0
fread$ db 0,0,'fread',0
fopen$ db 0,0,'fopen',0
printf$ db 0,0,'printf',0
end data
Но очень неудобно будет руками считать байты на стеке, лучше макросы всё же использовать типа invoke. Хотя, смотря чему учиться хотите win32 или asm
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, __kain, Вы писали:
__>Здравствуйте, gear nuke.
__>Спасибо за пример!!! Правда не пойму, для какого это ассемблера? для MASM? У меня дока такая, которая может компилиться на всех видах ассемблера...
fasm можно. впрочем, у masm32 от версии к версии изменений не много...
Здравствуйте, __kain, Вы писали:
__>Мне в программе надо вызвать примерно вот что: sprintf(buf,"%i.%i.%i %i:%i:%i"...
Можно дурацкий вопрос? Какой смысл писать на ассемблере код, нуждающийся в такой "тяжелой" сишной функции, как sprinf? Ладно бы это был какой-нибудь сверхбыстрый или сверхкомпактный код, а так...
Здравствуйте, emusic, Вы писали:
E>Можно дурацкий вопрос? Какой смысл писать на ассемблере код, нуждающийся в такой "тяжелой" сишной функции, как sprinf? Ладно бы это был какой-нибудь сверхбыстрый или сверхкомпактный код, а так...
Ответ простой: необходимо сдать курсовую работу. Написанную на ассемблере
Здравствуйте, __kain, Вы писали:
__>Странно, на 2 прмера выдает одну и туже ошибку: can't jump near of far label
__>.model flat
__>.data
__>.386
__> proc_1 proc
__> cmp eax, 6
__> je m1
__> jmp m2
__> m1:
__> ; some code
__> m2:
__> ; some code
__> ret
__> proc_1 endp
__>.code
Вполне логично — masm считает что выполнять данные нельзя. Поставте перед кодом директиву .code
Кстати, все предложенные здесь варианты такой ошибки не имеют.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, emusic, Вы писали:
E>Здравствуйте, __kain, Вы писали:
__>>Мне в программе надо вызвать примерно вот что: sprintf(buf,"%i.%i.%i %i:%i:%i"...
E>Можно дурацкий вопрос? Какой смысл писать на ассемблере код, нуждающийся в такой "тяжелой" сишной функции, как sprinf? Ладно бы это был какой-нибудь сверхбыстрый или сверхкомпактный код, а так...
А если в сверхбыстро-сверхкомпактной программе где-нибудь в одном-двух местах или вообще для отладки надо что-нибудь напечатать, ты предлагаешь все на С переписывать? Не говоря уже о курсовых