Поиск:

Ответ в темуСоздание новой темы Создание опроса
> от перемены мест 
:(
    Опции темы
Сisa
Дата 1.3.2015, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Код

format PE GUI 4.0
entry start

include 'win32ax.inc'
include 'api\user32.inc'
         
section '.code' code readable executable
start:
 invoke  GetLocalTime,stime
 
 xor ebx,ebx
 movzx   ebx,[stime.wDay]
 invoke wsprintf,result,formats,ebx
 invoke  lstrcat,resulta,result
 
 xor ebx,ebx
 movzx   ebx,[stime.wMonth]
 invoke wsprintf,result,formats,ebx
 invoke  lstrcat,resulta,'.'
 invoke  lstrcat,resulta,result
 
 xor ebx,ebx
 movzx   ebx,[stime.wYear]
 invoke wsprintf,result,formats,ebx
 invoke  lstrcat,resulta,'.'
 invoke  lstrcat,resulta,result
 
 xor ebx,ebx
 movzx   ebx,[stime.wHour]
 invoke wsprintf,result,formats,ebx
 invoke  lstrcat,resulta,' '
 invoke  lstrcat,resulta,result
 
 
 xor ebx,ebx
 movzx   ebx,[stime.wMinute]
 invoke wsprintf,result,formats,ebx
 invoke  lstrcat,resulta,':'
 invoke  lstrcat,resulta,result
 
 xor ebx,ebx
 movzx   ebx,[stime.wSecond]
 invoke wsprintf,result,formats,ebx
 invoke  lstrcat,resulta,':'
 invoke  lstrcat,resulta,result
 
 xor ebx,ebx
 movzx   ebx,[stime.wMilliseconds]
 invoke wsprintf,result,formats,ebx
 invoke  lstrcat,resulta,','
 invoke  lstrcat,resulta,result
 invoke MessageBox, 0,resulta, 'Result my11111111111', MB_OK
invoke ExitProcess,0 


section '.data' data readable writable
 ;resulta db '',0
 stime   SYSTEMTIME
 ;resulta db '',0
 formats db '%02d',0
 ;resulta db '',0 
 result  db 256 dup (?)  
 resulta db '',0
 
section '.idata' import data readable writeable
 library kernel32,'KERNEL32.DLL',   user32, 'USER32.DLL'
 import  kernel32,\         
         lstrcat,        "lstrcat",\         
         ExitProcess,    "ExitProcess",\
         GetLocalTime,   "GetLocalTime"         


Если в section '.data' поменять местами строки определения переменных, происходит нечто невероятное!
Например строку:
resulta db '',0 
закомментировать/раскомментировать на разных строках и получим в ответе только единственный правильный ответ, т.е. когда она записана на последнем месте, а если например первой, то полный абсурд в ответе. Непонятно.  У меня значит случайно получилось вышел правильный ответ, но в другом порядке записать и ответа никогда не получить желаемого. Странно. Это где то описано?

Самый разноцветный ряд получаю при такой записи:
Код

section '.data' data readable writable
 ;resulta db '',0
 stime   SYSTEMTIME
 resulta db '',0
 formats db '%02d',0
 ;resulta db '',0 
 result  db 256 dup (?)  
 ;resulta db '',0

В других языках аналога попросту нету.  (где порядок записи-определения переменных влияет на их значение и на результат всей программы)
А почему так?



PM MAIL   Вверх
tzirechnoy
Дата 2.3.2015, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



А Вы не задумывались, почему result так странно описан -- result db 256 dup ... ?
PM MAIL   Вверх
Сisa
Дата 2.3.2015, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



result  db 256 dup (?) 
может быть означает дублировать данные в скобках 256 раз?
Данные в круглых скобках являются "неинициализированными данными",
то есть, выделяется память 256 байт... и этот кусок памяти привязывается к "имени" result
(ну или наоборот имя привязывается к адресу начала куска памяти в которой зарезервировано 256 байт которые не заполнены никакими данными).
Если бы я умел, так файл в  ollydbg посмотрел бы, что там такое и в чем проблема, а так надеюсь только на Вашу помощь.
Может быть следующие данные "наезжают" на result, поскольку нет завершения строки в виде 0 ?



PM MAIL   Вверх
Сisa
Дата 2.3.2015, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Код

section '.data' data readable writable
 ;resulta db '',0
 stime   SYSTEMTIME
 ;resulta db '',0
 formats db '%02d',0
 ;resulta db '',0 
 ;result  db 256 dup (?)  
 result  db '111111111111111111111111111111',0
 resulta db '',0 

так тоже работает, но опять же, если поменять местами строки, то ответ будет сногсшибательный.
PM MAIL   Вверх
Сisa
Дата 2.3.2015, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Ученик может задать стоОООлько вопросов, что учителю надоест :((
Но у меня и второй вопрос возник smile
И по этой же теме, и не только:

Код

format PE GUI 4.0
include 'win32ax.inc'
.data
    formats db '%d.%d.%d %d:%d:%d,%d. jpg',0
    result db 256 dup(?)
    r1 dd 1
    r2 dd 1
    r3 dd 1
    r4 dd 1
    r5 dd 1
    r6 dd 1
    r7 dd 1
    stime SYSTEMTIME
.code
start:
;    stdcall my_main 
    ;invoke wsprintfA, result, formats, [r3], [r2], [r1], [r4], [r5], [r6], [r7]
    ;invoke MessageBox, 0, result, 'Дата', MB_OK
;    invoke ExitProcess, 0  
proc my_main    
   invoke  GetLocalTime, stime
   movzx ebx, [stime.wYear] 
        mov [r1], ebx
   movzx ebx, [stime.wMonth]
        mov [r2], ebx
   movzx ebx, [stime.wDay]
        mov [r3], ebx 
   movzx ebx, [stime.wHour]
        mov [r4], ebx
   movzx ebx, [stime.wMinute]
        mov [r5], ebx
   movzx ebx, [stime.wSecond]
        mov [r6], ebx
   movzx ebx, [stime.wMilliseconds]
        mov [r7], ebx  
   ;invoke wsprintfA, result, formats, [r3], [r2], [r1], [r4], [r5], [r6], [r7]
   ;invoke MessageBox, 0, result, 'Дата', MB_OK  
   ret
endp
  stdcall my_main 
  invoke wsprintfA, result, formats, [r3], [r2], [r1], [r4], [r5], [r6], [r7]
  invoke MessageBox, 0, result, 'Дата', MB_OK
  invoke ExitProcess, 0                 
.end start

Так как сейчас записан код - не работает,

если поменять местами (закомментировать/раскомментировать ) строки:
Код

format PE GUI 4.0
include 'win32ax.inc'
.data
    formats db '%d.%d.%d %d:%d:%d,%d. jpg',0
    result db 256 dup(?)
    r1 dd 1
    r2 dd 1
    r3 dd 1
    r4 dd 1
    r5 dd 1
    r6 dd 1
    r7 dd 1
    stime SYSTEMTIME
.code
start:
    stdcall my_main 
    invoke wsprintfA, result, formats, [r3], [r2], [r1], [r4], [r5], [r6], [r7]
    invoke MessageBox, 0, result, 'Дата', MB_OK
    invoke ExitProcess, 0  
proc my_main    
   invoke  GetLocalTime, stime
   movzx ebx, [stime.wYear] 
        mov [r1], ebx
   movzx ebx, [stime.wMonth]
        mov [r2], ebx
   movzx ebx, [stime.wDay]
        mov [r3], ebx 
   movzx ebx, [stime.wHour]
        mov [r4], ebx
   movzx ebx, [stime.wMinute]
        mov [r5], ebx
   movzx ebx, [stime.wSecond]
        mov [r6], ebx
   movzx ebx, [stime.wMilliseconds]
        mov [r7], ebx  
   invoke wsprintfA, result, formats, [r3], [r2], [r1], [r4], [r5], [r6], [r7]
   invoke MessageBox, 0, result, 'Дата', MB_OK  
   ret
endp
;  stdcall my_main 
;  invoke wsprintfA, result, formats, [r3], [r2], [r1], [r4], [r5], [r6], [r7]
;  invoke MessageBox, 0, result, 'Дата', MB_OK
;  invoke ExitProcess, 0                 
.end start

то код работает, но опять не так как ожидается, т.е. MessageBox появляется только один раз! Как будто пара строк закомментирована  
invoke wsprintfA, result, formats, [r3], [r2], [r1], [r4], [r5], [r6], [r7]
invoke MessageBox, 0, result, 'Дата', MB_OK  
и не важно в каком месте.

Ну и наконец такой вариант, на первый взгляд правильный:
Код

format PE GUI 4.0
include 'win32ax.inc'
.data
    formats db '%d.%d.%d %d:%d:%d,%d. jpg',0
    result db 256 dup(?)
    r1 dd 1
    r2 dd 1
    r3 dd 1
    r4 dd 1
    r5 dd 1
    r6 dd 1
    r7 dd 1
    stime SYSTEMTIME
.code
start:
;    stdcall my_main 
    ;invoke wsprintfA, result, formats, [r3], [r2], [r1], [r4], [r5], [r6], [r7]
    ;invoke MessageBox, 0, result, 'Дата', MB_OK
;    invoke ExitProcess, 0  
proc my_main    
   invoke  GetLocalTime, stime
   movzx ebx, [stime.wYear] 
        mov [r1], ebx
   movzx ebx, [stime.wMonth]
        mov [r2], ebx
   movzx ebx, [stime.wDay]
        mov [r3], ebx 
   movzx ebx, [stime.wHour]
        mov [r4], ebx
   movzx ebx, [stime.wMinute]
        mov [r5], ebx
   movzx ebx, [stime.wSecond]
        mov [r6], ebx
   movzx ebx, [stime.wMilliseconds]
        mov [r7], ebx  
   ;invoke wsprintfA, result, formats, [r3], [r2], [r1], [r4], [r5], [r6], [r7]
   ;invoke MessageBox, 0, result, 'Дата', MB_OK  
   ret
endp
  stdcall my_main 
  invoke wsprintfA, result, formats, [r3], [r2], [r1], [r4], [r5], [r6], [r7]
  invoke MessageBox, 0, result, 'Дата', MB_OK
  invoke ExitProcess, 0                 
.end start

вообще не работает. 
Где то же об этом написано? Или это чисто FASMа заморочки? Может в masm или tasm их нет? Закрадываются сомнения тот ли это язык, что лучше не бывает.

С ассемблером не соскучишься smile 


PM MAIL   Вверх
tzirechnoy
Дата 3.3.2015, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
то есть, выделяется память 256 байт... и этот кусок памяти привязывается к "имени" result



Правильно. Ну, в смысле, адэкватная модэль происходящего.

А сколько байт Вы выделили под переменную resulta?
PM MAIL   Вверх
tzirechnoy
Дата 3.3.2015, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
Так как сейчас записан код - не работает,


В смысле?

Цитата
то код работает, но опять не так как ожидается, т.е. MessageBox появляется только один раз!


А, ну да, я забыл -- wsprintf у нас ведь _cdecl, а не stdcall calling convention.

В общем, у тебя бардак в стэке -- за wsprintf надо подчищать самому.

Цитата
вообще не работает.


По-моему, он работает как написано.  Вызывает GetLocalTime и прекращает работу.

Цитата
Может в masm или tasm их нет?


В masm и tasm много чего нет.
Впрочем, действительно, для начального обучения в fasm слишком много макросов, скрывающих истинную работу.

Цитата
Закрадываются сомнения тот ли это язык, что лучше не бывает.


Я и после первого Вашэго поста думал написать -- а зачем Вы подались на эти галеры??

Серьёзных проектов на ассэмблере под win32 никто не пишэт, это муторное и мало осмысленное занятие. Да и под другие ОС общего назначения (linux, MacOS) -- тожэ.

Потому поддержки -- мало.

В общем, возможно имеет смысл всё-таки начать изучать ассэмблер где-нибудь, где много нормальных примеров -- на всяком ARM bare metal или в бутлоадерах PC.
PM MAIL   Вверх
Сisa
Дата 3.3.2015, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



resulta db '',0 - это сейчас, а перед этим было так:
resulta db "abcd", 0
а потому как мне нужно называть файл этим именем +.jpg или +.png то и начальное значение  такое ""
(для скриншот-еля).

--
О галерах в личку написал.



Это сообщение отредактировал(а) Сisa - 3.3.2015, 18:15
PM MAIL   Вверх
tzirechnoy
Дата 3.3.2015, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
ыло так: resulta db "abcd", 0


Так вопрос остаётся в силе, процытирую "А сколько байт Вы выделили под переменную resulta?"

Добавлено через 4 минуты и 16 секунд
Цитата
О галерах в личку написал.


"написание писем в эху есть самовыражение, написание писем нетмейлом есть техническая поддержка." © Victor Wagner

Не настолько интересно, чтобы обсуждать это в личной почте.
PM MAIL   Вверх
Сisa
Дата 3.3.2015, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



"Первое бесплатно, второе платно." - Вас правильно понял?
Темы "от перемены мест" личка не касается. 
"Я и после первого Вашэго поста думал написать -- а зачем Вы подались на эти галеры??" - значит показалось, мне, что Вам интересно, ответил, я, не на форуме, но в письме, и не о перемене мест совсем, оказывается напрасно излагал, бывает smile

Сколько байт выделил под переменную resulta? - так ведь же ноль? байт? Наверно можно было записать "2015 " и потом приклеивать конкатенацией остальной текст.

Добавлено через 8 минут и 36 секунд
Странно как то, я ничего не понимаю, Вы мне помогаете, факт, но как то своеобразно, то ли ругаетесь, то ли обижаетесь на что,
а не понятно потому что не знаю модераторам что то платят, или они все же по "велению души" на форумах живут. Если из живого интереса, то почему бы и не прочесть почту,  десяток строк всего то, к тому же спровоцированных к написанию, ну а если это работа, тогда конечно... но тогда почему работа не полностью выполняется. 
А!!! понял! наконец то! написано для выравнивания баланса! Баланса отношений.



PM MAIL   Вверх
tzirechnoy
Дата 4.3.2015, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
"Первое бесплатно, второе платно." - Вас правильно понял?


Я спецыально опустил это окончание. Мне просто неинтересно объяснять это одному Вам. Объяснять каждому, кто каким-то путями поиска наткнётся на этот заданный вопрос, или просто иногда почитывает тему ASM на Винграде -- другое дело.

Цитата
так ведь же ноль? байт?


Ну, как жэ 0 -- когда там как минимум значение (число 0) должно поместиться?
А в т.н. "первоначальном" варианте -- ещё строка 'abcd'?

Впрочем, это не очень существенно. Ноль там, один или пять -- в любом случае, это несколько меньшэ, чем байт в строке ',03.02.2015 13:10:' и т.д.

Цитата
то ли ругаетесь, то ли обижаетесь на что


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

Цитата
а не понятно потому что не знаю модераторам что то платят


Я не модэратор, а по сути это тема для какого-нибудь другого подраздела.

И нет, если Вам показалось, что я на что-то обиделся -- то Вам именно показалось. Это была констатацыя некоторых известных в нашых кругах фактов.
PM MAIL   Вверх
Сisa
Дата 4.3.2015, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



Наверное Вы правы, и я ценю Ваш спокойный ответ. 
Но это очевидно, что направить Вам письмо было неосторожностью с моей стороны. Справедливости ради надо отметить, что  Вы меня очень удивили, и похоже мы совершенно разные люди smile

Ноль там, один или пять -- в любом случае, это несколько меньшэ, чем байт в строке ',03.02.2015 13:10:' - вот, я кажется начинаю догадываться что Вы хотите сказать, что новым байтам негде разместиться в том поле (участке памяти), что отведено под переменную, и что такой подход возможен в других ЯП, но не в АСМе. Т.е. мне следовало бы отвести под данную переменную участок достаточной длины, например 
"111111111111111111111111111" потом все байты по этому адресу удалить/стереть и записать то что мне нужно, а именно "02.03.2015 13:10:22,457.jpg".
PM MAIL   Вверх
tzirechnoy
Дата 4.3.2015, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Цитата
мне следовало бы отвести под данную переменную участок достаточной длины


Да. И это особенность дажэ не ассэмблера -- а функцыи wsprintf. В передаваемой out-строке должно быть достаточно места для сохранения результата.
Соответственно, кстати, это справделиво для любого языка, в котором Вы будете использовать wsprintf. Хоть для vb (такая возможность там есть, если что, строки 2 на Declare function ... Lib "user32" ...  и описание прототипа -- и пользуйся).

Цитата
все байты по этому адресу удалить/стереть


Ненужно. В первую очередь потому, что все нужные байты wsprintf перезапишэт, и признак окончания C-строки ( байт 0 ) в конец запишэт.

Да, по поводу того, почему работало, когда ты писал в конец: система, по факту. выделяет память процэссу страницами достаточно большого объёма (4k или 8k на ia32). Потому для твоего сегмента данных было выделено достаточно места, чтобы этот resulta поместился в вроде как неиспользуемый хвост страницы -- после описанных данных.
PM MAIL   Вверх
Сisa
Дата 4.3.2015, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 18.1.2013

Репутация: нет
Всего: нет



tzirechnoy +++!
Спасибо!

Вы отодвинули мои сомнения, буду дальше читать ассэмблер smile
(даже не дальше, а сначала)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.1570 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.