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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2012, 15:05   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию FASM и WinAPI(WriteConsoleA)

Добрый день. Мне очень стыдно задавать такой вопрос. Я отходил от асм на время, надо было с++ изучить, теперь вернулся. Но как тогда застопорился на этой проблеме, так на ней и остался.
Я приведу простейший код. На масм(с корректировками) он работает, а вот fasm наотрез отказывается его выполнять. Находил много подобных моей тем, но все они остались нетронуты и ушли в небытие.
Код:
include "%fasminc%\win32ax.inc"
.data
cWritten   dd ?
stdout     dd ?
message    db 'Hello Word!',0
.code
start:
              invoke AllocConsole
              invoke GetStdHandle, -11
              mov DWORD[stdout], eax
              invoke WriteConsoleA, stdout, addr message, 6, addr cWritten,0
              invoke ExitProcess, 0
.end start
Первая проблема - это sizeof(где его взять), который должен быть в процедуре WriteConsoleA. Вторая - не выводится Hello Word!. Как и у всех, у меня getStdHandle не дает handle для вывода.
Надеюсь этой темой однозначно решу общую проблему и уберу мысли о переходе с fasm на masm.
Заранее благодарю.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 29.01.2012, 15:58   #2
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

во-перых, не
invoke GetStdHandle, -11
а
invoke GetStdHandle, STD_OUTPUT_HANDLE

во-вторых, не
mov DWORD[stdout], eax
а просто
mov [stdout], eax

в-третьих, addr не нужен вообще и не забывает квадратные скобки
invoke WriteConsoleA, [stdout], message, 6, cWritten, 0
FASM это вам не MASM тут всё чётко и без лишних дирректив, которые только замусоривают код программы

в-четвёртых, прежде чем задавать такие глупые вопросы, надо посмотреть хотя парочку исходников (коих в папке FASM предостаточно) и подумать тем органом который вам заменяет мозг

Цитата:
Сообщение от _PROGRAMM_ Посмотреть сообщение
Первая проблема - это sizeof(где его взять), который должен быть в процедуре WriteConsoleA.
вместо sizeof() должно быть lstrlen, это же относится и к высокоуровневым языкам
progromore.i2p - первый русскоязычный портал программистов в скрытосети
Rock-n-Rolla вне форума Ответить с цитированием
Старый 29.01.2012, 16:31   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Спасибо, я многое извлек из вашего поста. lstrlen - это вроде функция WinAPI? Я почему о sizeof заговорил. Дело в том, что ее я заметил в учебнике Крупника, она находилась в WriteConsoleA и узнавала длину массива символов. Буду проводить эксперименты с lstrlen. Еще раз спасибо.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 29.01.2012, 16:48   #4
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

_PROGRAMM_
Код:
message "Hello Word!",0
size_message=$-message-1
vadimych вне форума Ответить с цитированием
Старый 29.01.2012, 17:23   #5
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Самое главное что я извлек из #2 это то, что мозг, который у ТС чем то заменен, несомненно заменен у автора #2 чувством собственной важности и илитарности.
lstrlen-то вот как раз и не нужна для подсчета длины статических строк, которая не изменяется все равно (size вроде в fasm, или же объявите длину как уже показано в посте выше)
dword указывающий на разрядность записываемых данных должен бы быть очевиден тк регистр из которого пишутся данные и его разрядность и так определены однозначно, но для масм32 это, например не всегда справедливо и dword ptr нужен
addr это что то типа директивы сложной адресации локальных или же глобальных переменных(в масм32). То есть если имеющуюся глобальную переменную можно записать и так: offset _glob(масм32) или _glob(fasm), то локальные переменные будут уже высчитываться отталкиваясь от ebp с помощь lea и push'иться в eax регистре (вероятно в fasm и не так - 'обратитесь к местному авторитету'(с)К&Р)
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 29.01.2012, 17:28   #6
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Ну и в секции .data нужно бы объявлять переменные не вопросительным знаком. Для неинициализированных переменных существует секция .data?
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 29.01.2012, 18:07   #7
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

Цитата:
Сообщение от yuran666666 Посмотреть сообщение
Самое главное что я извлек из #2 это то, что мозг, который у ТС чем то заменен, несомненно заменен у автора #2 чувством собственной важности и илитарности.
спасибо, вы потешили моё ЧСВ. шутка

Цитата:
Сообщение от yuran666666 Посмотреть сообщение
lstrlen-то вот как раз и не нужна для подсчета длины статических строк, которая не изменяется все равно
да, всё правильно. lstrlen - действительно перебор

Цитата:
Сообщение от yuran666666 Посмотреть сообщение
addr это что то типа директивы сложной адресации локальных или же глобальных переменных(в масм32). То есть если имеющуюся глобальную переменную можно записать и так: offset _glob(масм32) или _glob(fasm), то локальные переменные будут уже высчитываться отталкиваясь от ebp с помощь lea и push'иться в eax регистре (вероятно в fasm и не так - 'обратитесь к местному авторитету'(с)К&Р)
в fasm нету ничего что хотя бы отдалённо напиминало _glob или addr (возможно что-то появилось в подледних версиях, FASM не обновлял как минимум год)

Цитата:
Сообщение от yuran666666 Посмотреть сообщение
Ну и в секции .data нужно бы объявлять переменные не вопросительным знаком. Для неинициализированных переменных существует секция .data?
вообще в FASM этими диррективани лучше не пользоваться, так как это всего лишь обычные макросы, и введены они чтобы что не вызывать разрыв шаблона при переходе с MASM или TASM (царство ему небесное)
progromore.i2p - первый русскоязычный портал программистов в скрытосети

Последний раз редактировалось Rock-n-Rolla; 29.01.2012 в 18:11.
Rock-n-Rolla вне форума Ответить с цитированием
Старый 29.01.2012, 18:13   #8
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Из-за того, что я учусь на будущее, этот вопрос просто так не оставлю.
Цитата:
size вроде в fasm
Как я ни старался(хотя я то тут причем) fasm (c win32ax.inc) такого не знает. Пробовал вызывать invoke sizeof, нет результата.
Цитата:
size_message=$-message-1
Это только если заранее знаем, что строка не изменится. А если это динамическая строка(если ли такой термин?)? Такой способ не подойдет. Может есть еще что-нибудь?
Цитата:
Ну и в секции .data нужно бы объявлять переменные не вопросительным знаком. Для неинициализированных переменных существует секция .data?
Что то я не пойму. Вы предлагаете всем значениям переменных, которые заранее не известны, 0 присваивать?

Цитата:
во-перых, не
invoke GetStdHandle, -11
а
invoke GetStdHandle, STD_OUTPUT_HANDLE
Так STD_OUTPUT_HANDLE равно -11. Какая разница? Поддержка кроссплатформенности?

--
Извините меня. Я ступил. Когда экспериментировал с lstrlen у меня ничего не получалось. Сейчас все исправил
Код:
include "%fasminc%\win32ax.inc"
.data
cWritten   dd 0
stdout     dd 0
message    db 'Hello Word!',0
size       dw ?
.code
start:
              invoke AllocConsole
              mov eax,0
              invoke GetStdHandle, STD_OUTPUT_HANDLE
              mov [stdout], eax
              invoke lstrlen,message
              mov [size], ax
              invoke WriteConsoleA, [stdout], message, DWORD [size] , cWritten,0
              invoke ExitProcess, 0
.end start
Вместо DWORD [size] я писал size.
Всем спасибо. Дополнения к теме приветствуются.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 29.01.2012 в 18:34.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 29.01.2012, 19:24   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Код:
size       dw ?
должно быть

Код:
size dd ?
а то чтовсё нормально работает, это всего лишь совпадение

Цитата:
Сообщение от yuran666666 Посмотреть сообщение
Самое главное что я извлек из #2 это то, что мозг, который у ТС чем то заменен, несомненно заменен у автора #2 чувством собственной важности и илитарности.
Rock-n-Rolla всё правильно сказал, прежде чем задавать такие тупые вопросы, надо хотя головой немножно подумать или хотя бы заюзать поисковик. и вообще я люблю когда появляются такие форумчане (которые отвечают так, как должен был ответить модератор)
rpy3uH вне форума Ответить с цитированием
Старый 29.01.2012, 21:24   #10
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

ТС на моей памяти не флудил тупыми темами, сам сказал, что чувстсвует глупость своего вопроса, но ничего поделать с собой не может, почему бы не ответить ему без указания на какие либо недостатки?
В фасме .data .data? .text .import и прочие .ololo не знаю макросы они там или нет, но это всего лишь указание ассемблеру на создание секции в пе-модуле с заданными атрибутами. Да, возможностей больше, чем в масм32.
Ну, а какие-то разрывы шаблонов при знании пе-структуры, думаю, ни с кем случиться не могут при переходе на фасм.
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем отличаеться fasm от fasm editor&? TotKtoNado Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 07.11.2011 17:00
FASM + RegCreateKeyEx WebbMan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 01.08.2011 15:27
FASM арифметика kka495 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 28.04.2011 17:06
FASM 1 курс Sobaka_ru Помощь студентам 2 29.12.2010 18:10
LEA [FASM] m32 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 03.10.2010 13:57