Вывод через wsprintf - Assembler

Узнай цену своей работы

Формулировка задачи:

Компилятор не ругается, но ехе не открывается. Подскажите в чём проблема. Компилятор MASM
.386
.model flat,stdcall
option casemap:none
 
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data 
 
int_one DD 0
int_two DD 0
 
str_format DB"int_one = %d , int_two = %d",0
str_buffer DB 256 dup (0)
 
mb_title db "Title Text Message",0
mb_text db "This Text is Message",0

.code
start:
mov int_one, 150
mov int_two, 100

invoke wsprintf,0,addr str_buffer, addr str_format,int_one, int_two
 
invoke MessageBox,0,addr str_buffer,offset mb_title,MB_OK
 
invoke ExitProcess,0    
end start

Решение задачи: «Вывод через wsprintf»

textual
Листинг программы
.386
.model  flat,stdcall
option  casemap:none
 
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    includelib  \masm32\lib\user32.lib
    includelib  \masm32\lib\kernel32.lib
.data
int_one DD  0
int_two DD  0
 
str_format  DB  "int_one = %d , int_two = %d",0
str_buffer  DB  256 dup (0)
mb_title    db  "Title Text Message",0
mb_text     db  "This Text is Message",0
.code
start:
    mov [int_one], 150
    mov [int_two], 100
    invoke  wsprintf,ADDR str_buffer, ADDR str_format,[int_one], [int_two]
    invoke  MessageBox,0,ADDR str_buffer, ADDR mb_title,MB_OK
    invoke  ExitProcess,0
end start

Объяснение кода листинга программы

  1. .386 - Это директива, указывающая, что программа будет использовать 32-битный код.
  2. .model flat, stdcall - Эта директива указывает, что модель памяти будет плоской (то есть без сегментов), а также указывает на использование стандартного вызова функций.
  3. option casemap: none - Эта директива отключает преобразование регистра символов.
  4. include \masm32\include\windows.inc - Эта команда включает в программу библиотеку Windows API.
  5. include \masm32\include\user32.inc - Эта команда включает в программу библиотеку User32 API.
  6. include \masm32\include\kernel32.inc - Эта команда включает в программу библиотеку Kernel32 API.
  7. includelib \masm32\lib\user32.lib - Эта команда включает в программу библиотеку User32.
  8. includelib \masm32\lib\kernel32.lib - Эта команда включает в программу библиотеку Kernel32.
  9. .data - Эта директива определяет область данных программы.
  10. int_one DD 0 - Эта команда определяет переменную типа DWORD (32-битное целое число) с именем int_one и значением 0.
  11. int_two DD 0 - Эта команда определяет переменную типа DWORD (32-битное целое число) с именем int_two и значением 0.
  12. str_format DB int_one = %d , int_two = %d,0 - Эта команда определяет строку формата с именем str_format, которая содержит местозаполнители для замены значений переменных int_one и int_two.
  13. str_buffer DB 256 dup (0) - Эта команда определяет буфер строки с именем str_buffer, который может вместить до 256 символов.
  14. mb_title DB Title Text Message,0 - Эта команда определяет строку с именем mb_title, которая содержит текст сообщения Title Text Message.
  15. mb_text DB This Text is Message,0 - Эта команда определяет строку с именем mb_text, которая содержит текст сообщения This Text is Message.
  16. .code - Эта директива определяет область кода программы.
  17. start: - Эта метка определяет начало функции main.
  18. mov [int_one], 150 - Эта команда устанавливает значение переменной int_one равным 150.
  19. mov [int_two], 100 - Эта команда устанавливает значение переменной int_two равным 100.
  20. invoke wsprintf, ADDR str_buffer, ADDR str_format, [int_one], [int_two] - Эта команда вызывает функцию wsprintf, передавая ей адрес буфера строки str_buffer, адрес строки формата str_format, а также значения переменных int_one и int_two.
  21. invoke MessageBox,0, ADDR str_buffer, ADDR mb_title, MB_OK - Эта команда вызывает функцию MessageBox, передавая ей дескриптор родительского окна (0), адрес буфера строки str_buffer, дескриптор строки заголовка mb_title и тип кнопки сообщения (MB_OK).
  22. invoke ExitProcess,0 - Эта команда вызывает функцию ExitProcess, передавая ей код завершения процесса (0).
  23. end start - Эта метка определяет конец функции main.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5