szformat db "%u",0
Теперь вы должны знать, что вы должны вставить формат,конечно же, в раздел .data .
Хорошо, если вы хотите конвертировать что-то в что-то иное, нам нужен буфер, чтобы хранить строку, которая получилась в результате конвертирования, не так ли? Значит нам нужен тип объявления данных:
bufferforstring db 10 dup(0)
Эта строка не значит ничего, но "bufferstring" состоит из 10-и байт со значением ноль.Вы также например можете исполбзовать:
anotherbuffer db 50 dup("?"),0
Эта строка заполнит буфер 50-ю "?".Но мы не должны забывать конец- ноль, в конце строки! Мы заполнили наш буфер "bufferstring" нолями, т.к. там будет строковая форма числа, так, что буфер должен быть пуст. Вот небольшое объяснение "dup", чтоб вы могли полностью это понять:
nameofvar db 40 dup(0)
^ ^ ^ ^ ^
1 2 3 4 5
1) Имя переменной
2) Это переменная байтов
3) Для этой пуременной зарезервированно 40 байт
4) Переменная собирается полностью заролниться...
5) ...по ASCII значение в ()
Пожалуйста не думайте, что в буфере теперь много "0". Как я уже сказал, есть разница между 0 и "0". Надеюсь теперь вы это понимаете. Вот пример как заполнить буфер строкой нолей:
nameofvar db 50 dup("0"),0
В этой переменной теперь будет 50 нолей. Но здесь ноль это строка, так, что нам надо закончить строку тоесть поставить ,0. Но я уже объяснил это в первой части:
В этой программе мы проделаем некоторые математические действия и выведим результат вычислений при помощи всплывающего окна:
mov eax,5 ;вставить 5 в eax
mov ecx,3 ;вставить 3 в ecx
mul ecx ;умножение 5 и 3 (результат в eax)
add eax,50 ;добавить 50 к результату (в eax)
xor edx,edx ;очистить edx (установить на 0)
div ecx ;разделить значение в eax на ecx(5)
Результат теперь хранится в ЕАХ. Мы хотим показать результат во всплывающем окне. Сначала мы должны переконвертировать его:
invoke wsprintf,addr bufferforstring,addr szformat,eax
Первый параметр wsprintf это буфер, который получит переконвертированное значение(число).Первые два параметра должны иметь ADDR перед ними т.к. они являются строками. Второй параметр это просто число, так, что нам не нужно ADDR.
Результат теперь в "bufferstring", переконвертированный в строку. Теперь мы можем показать результат:
invoke MessageBox,0,addr bufferforstring,addr titlestring,MB_OK
Весь исходник теперь должен выглядеть так:
.386
.model flat, stdcall
option casemap :none
include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\masm32.inc
include \MASM32\INCLUDE\gdi32.inc
include \MASM32\INCLUDE\user32.inc
include \MASM32\INCLUDE\kernel32.inc
includelib \MASM32\LIB\masm32.lib
includelib \MASM32\LIB\gdi32.lib
includelib \MASM32\LIB\user32.lib
includelib \MASM32\LIB\kernel32.lib
wsprintfA PROTO C :DWORD,:VARARG
wsprintf equ <wsprintfA>
.data
bufferforstring db 10 dup(0)
titlestring db "Result of our calculation:",0
szformat db "%u",0
.code
start:
mov eax,5
mov ecx,3
mul ecx
add eax,50
xor edx,edx
div ecx
invoke wsprintf,addr bufferforstring,addr szformat,eax
invoke MessageBox,0,ADDR bufferforstring,ADDR titlestring,MB_OK
invoke ExitProcess,0
end start
Вы можете немного поэкспериментировать с wsprintf немного. Например есть формат "%s".Он вставляет одну строку в другую. Вы можете например не только выводить результат, но и что-то типа этого: "Результат:21". Но 21 не константа, это число посчитано.Вы можете производить это примерно так: (Вот только части, которые вы должны вставить в программу)
.data
formatstring db "The result is: %s",0 ;Здесь у вас formatstring
;это бедет использовано wsprintf
the_completestring db 20 dup(0) ;Строка будет состоять из
;полностью отформатированной строки
.code
invoke wsprintf,addr bufferforstring,addr szformat,eax
invoke wsprintf,addr the_completestring,addr formatstring,addr bufferforstring
invoke MessageBox,0,addr the_completestring,addr titlestring,MB_OK
Хорошо, вот объяснение: В разделе .data нам надо создать строку, которая форматом для полной строки, которую мы хотим показать. Это - "formatstring"."the_completestring" получит "formatstring" + вставленное значение, которое является третьим параметром wsprintf.
В разделе .code мы сперва конвертируем число в строку. Затем мы вставляем "bufferstring" в "formatsring", точно туда, где находится "%s". Всё это копируется в "the_completestring".
Вы также можете вставить ещё строк в другую как эта:
.data
formatstring db "The result is: %s and the remainder is %s!",0
the_completestring db 50 dup(0)
buff_for_result db 10 dup(0)
buff_for_remainder db 10 dup(0)
.code
invoke wsprintf,addr buff_for_result,addr szformat,eax
invoke wsprintf,addr buff_for_remainder,addr szformat,edx ;the remainder is in edx
invoke wsprintf,addr the_completestring,addr formatstring,addr buff_for_result,addr buff_for_remainder
Вы можете заметить, что wsprintf теперь имеет 4 параметра.Вы можете добавлять сколько хотите параметров."formatstring" должен %s в нём, так, что нам надо пройти две строки, которые должны быть вставлены.Если у вас 4 или 5 %s в вашей formatstring, вам нужно будет 4 или 5 строк, которые должны быть вставлены.
Надеюсь вы уже составлять строки для программ сами. Или просто попробуйте написать целую программу сами, не подглядывая в наш исходник. Конечно вы можете скопировать include строки ну и что-то похожее, но вы научитесь программировать только если сами будете стараться писать программы.Если у вас есть проблемы или вопросы, то просто пишите мне.
Не забудьте СОХРАНИТЬ изменения перед тем как пробовать скомпилировать исходник в следующий раз.
Или-
Он не будет работать
Заключение
Вот вторая часть и подомла к концу,надеюсь вам понравилось!Теперь вы должны знать основы ассемблеровских комманд и уметь их использовать.Не считая этого вы должны знать,как использовать wsprintf и какие возможности вам даёт эта простая функция.Следующая часть наверно будет о диалоговых окнах,чтобы вы могли "общаться" с пользоваталем.
Если у вас есть какие-либо вопросы либо пожелания переводчику то пишите на emadan@hobox.ru(я тоже являюсь программистом ток что если вы не знаете английского то пишите мне при не понимании)
Если же у вас проблемы с текстом то пишите автору nop-erator@gmx.net
All right translated 2001-2002 Dukerr
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.