Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2010, 19:17   #1
Wardrag
Пользователь
 
Регистрация: 14.08.2010
Сообщений: 31
По умолчанию MASM ---> Вывести символ в MessageBox

Не могу придумать,как его вывести.Пробовал миллион способов.Строку,например.вывести без проблем:

Код:

 .data 

  stroka dd 39303039h,0
       
   .code
 
    start:
    
     invoke MessageBox,0,offset stroka,offset stroka,0
     invoke ExitProcess,0    
      
    end start

Запушить можно только 32 битный регистр.

К примеру,так не получается:


Код:

.code

mov ax,3930h

invoke MessageBox,0,offset ax,offset ax,0
Через стек тоже никак не получается.Также не получается сделать это через создание массива символов строки(какой-то геморрой там со всякими esi/edi).Требование для MessageBox - анси строка оканчивается нулём,т.е. это уже два байта,потому и использую ax (можно и dx,cx)

Последний раз редактировалось Wardrag; 14.08.2010 в 19:19.
Wardrag вне форума Ответить с цитированием
Старый 14.08.2010, 19:34   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

MessageBox принимает в качестве параметра для вывода строку и только строку. Никаких регистров ей совать не стоит.
Хотите что-то вывести из регистра - переводите это в строку, а затем выводите.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 14.08.2010, 22:02   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Можно сделать так, Invoke wsprintf, Buffer, Ax... и боксу передавать Buffer.

Последний раз редактировалось coNsept; 14.08.2010 в 22:06.
coNsept вне форума Ответить с цитированием
Старый 14.08.2010, 22:06   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

эммм...а где строка форматирования для принтФ?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.08.2010, 22:12   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Должна быть у него в голове
coNsept вне форума Ответить с цитированием
Старый 14.08.2010, 22:13   #6
Wardrag
Пользователь
 
Регистрация: 14.08.2010
Сообщений: 31
Радость

Цитата:
Сообщение от Goodwin98 Посмотреть сообщение
MessageBox принимает в качестве параметра для вывода строку и только строку. Никаких регистров ей совать не стоит.
Хотите что-то вывести из регистра - переводите это в строку, а затем выводите.
Вот здорово.А как переводить в строку (Наиболее простой вариант,может.вам извесен),а то в апи тысячи функций)))).wsprintf пробовал,но он более громоздкий для меня.
Не знаю,как подключить libc для масм(инклудлиб наверное),чтоюы использовать принт и принтф.Ладно.Нашл пример с использованием функции принт,но он ничего не выводил!. А подключен был фаил макро.асм.До сих пор не понимаю,зачем этот пример(,если не видно результата работы,как в месадж боксе к примеру.

Может,я не совсем понимаю,что делает оффсет ? Фактически они же указывают на одни и те же данные - последовательность байт.Или я не прав ? Что в регистре,что в памяти,что в стеке...это строка ?

Последний раз редактировалось Stilet; 25.08.2010 в 08:16.
Wardrag вне форума Ответить с цитированием
Старый 14.08.2010, 22:38   #7
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
Вот здорово.А как переводить в строку (Наиболее простой вариант,может.вам извесен),а то в апи тысячи функций)))).wsprintf пробовал,но он более громоздкий для меня.
Вот пример.
Код:
.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  
	format db " data = %d",0
	string db 30 DUP(?)
.code
main:
	mov eax,3946  ; число для вывода
	invoke wsprintf,addr string,addr format,eax ; здесть число переведется в строку
	invoke MessageBox,0,addr string,0,MB_OK ; здесь оно выведется
    invoke ExitProcess,0
end main
Цитата:
Сообщение от Wardrag Посмотреть сообщение
Может,я не совсем понимаю,что делает оффсет ? Фактически они же указывают на одни и те же данные - последовательность байт.Или я не прав ? Что в регистре,что в памяти,что в стеке...это строка ?
offset говорит компилятору взять АДДРЕС переменной, а не ее содержимое.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 14.08.2010, 23:01   #8
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

А что собственно мешало вместо всей строки написать всего один символ? o_O
Код:
.data 

  stroka db "a",0
       
   .code
 
    start:
    
     invoke MessageBox,0,offset stroka,offset stroka,0
     invoke ExitProcess,0    
      
    end start

Последний раз редактировалось r9m; 14.08.2010 в 23:04.
r9m вне форума Ответить с цитированием
Старый 14.08.2010, 23:30   #9
Wardrag
Пользователь
 
Регистрация: 14.08.2010
Сообщений: 31
По умолчанию

GoodWin98,очень благодарен за пример!!)Всё терь в ажуре

Цитата:
Сообщение от r9m Посмотреть сообщение
А что собственно мешало вместо всей строки написать всего один символ? o_O

Я хочу создать массив,заполнить его и вывести,к примеру,третий или пятый.Пока не придумал как.Видел пару примеров с участием регистра esi,но я его не только не вкурил,но ещё и не заставил работать.

Последний раз редактировалось Stilet; 25.08.2010 в 08:17.
Wardrag вне форума Ответить с цитированием
Старый 15.08.2010, 00:00   #10
r9m
₪₪₪₪₪₪₪₪
Форумчанин
 
Аватар для r9m
 
Регистрация: 16.04.2007
Сообщений: 471
По умолчанию

ну показывай
r9m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MessageBox Nice42ru Общие вопросы Delphi 6 04.06.2010 11:35
Как вывести символ в позиции 80,25 ? sanya_m Помощь студентам 2 13.03.2010 02:10
MessageBox mifka72 Помощь студентам 13 08.02.2010 14:46
Как вывести символ на экран в графическом режиме 0x13 Viriat Общие вопросы C/C++ 2 30.12.2009 17:22
messageBox Andrey174rus Общие вопросы Delphi 4 10.10.2009 17:45