Туториал по Ассемблеру NOP-erator(а) № 1, страница 4

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