Сейчас на форуме: _MBK_, tyns777, UniSoft (+11 невидимых)

 eXeL@B —› Программирование —› loop & asm
Посл.ответ Сообщение

Ранг: 5.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 10 июня 2012 14:19 · Поправил: opcodes
· Личное сообщение · #1

Доброе время суток.
Подскажите по поводу этой процедуры, как сохранить значение в ECX?
т.е если в теле будут апи, тогда ЕСХ утратит свое прежнее значение.
Куда его сохранить? Если в стек помещать, то после того как пройдутся апи, то, то значение хрен найдешь.
А если через данные, то Loop будет менять только регистр, и тоже получается бесконечный цикл.
Подскажите решение. Спасибо.




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 10 июня 2012 14:23
· Личное сообщение · #2

opcodes пишет:
Если в стек помещать, то после того как пройдутся апи, то, то значение хрен найдешь.

Это кто вам сказал?

-----
Лучше быть одиноким, но свободным © $me





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 10 июня 2012 14:27 · Поправил: -=AkaBOSS=-
· Личное сообщение · #3

opcodes пишет:
по поводу этой процедуры

процедура-то где?

opcodes пишет:
Если в стек помещать, то после того как пройдутся апи, те значения хрен найдешь.

ну почему? просто помещать нужно перед тем, как толкать параметры функции
как вариант - считать итерации цикла, сохраняя значение в локальную переменную
после чего что-то типа
Code:
  1. dec dword local_var
  2. cmp dword local_var, 0  ; хотя можно и без этого - флаги и так установятся
  3.    jg metka_loop




Ранг: 5.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 10 июня 2012 15:01
· Личное сообщение · #4

BoRoV, Эго.
AkaBOSS, естественно push'аю в самом начале.
проследил вообщем за всем этим, отладчик Olly показал то что после выполнения 3-го параметра(они же выполняются с конца, значит 1-го) функции wsprintf стек будто перемешивается, и внизу уже утеряно число для ecx. По поводу других функций погорячился.




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 10 июня 2012 15:06 · Поправил: -=AkaBOSS=-
· Личное сообщение · #5

opcodes пишет:
стек будто перемешивается

ну так правильно - wsprintf использует C конвенцию
то есть стэк после него нужно очищать в вызывающем коде.
e.g:
Code:
  1.   add esp, (num_params*4)


где num_params - кол-во параметров, переданное в функцию

opcodes пишет:
внизу уже утеряно число для ecx

всмысле, ВНИЗУ?
если ты толкнул его раньше, он будет ВВЕРХУ стека,
а остальные параметры - ниже его



Ранг: 5.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 10 июня 2012 15:26 · Поправил: opcodes
· Личное сообщение · #6

AkaBOSS, в отладчике кстате есть уже строчка после вызова функции wsprintf, add esp, 12(3 параметра)
в коде я сделал так

.data
format db "%d", 0
buffer dw ?
digit db 10
.code
invoke wsprintf, addr buffer, addr format, digit

было вот так, в отладчике стояла строка add esp, 12
я после invoke wsprintf добавил еще add esp, 12. Эффекту не было.



Ранг: 5.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 10 июня 2012 15:35
· Личное сообщение · #7

глянул щас в инете, в васме пишут что если использовать invoke, то add esp, 3* sizeof dword ненадо. компилятор сам вставит это. так где проблема тогда в этом коде?




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 10 июня 2012 15:38 · Поправил: -=AkaBOSS=-
· Личное сообщение · #8

opcodes пишет:
я после invoke wsprintf добавил еще add esp, 12

неее, инвок - это не команда ассемблера, а макрос, который на основе прототипа функции
формирует код, передающий параметры и, если нужно, выравнивает стек после вызова

opcodes пишет:
invoke wsprintf, addr buffer, addr format, digit

в данном случае нужно бы написать
Code:
  1. invoke wsprintf, addr buffer, addr format, dword ptr ds:[digit]

так как digit у тебя определён как ячейка памяти со значением 10,
передавать в функцию нужно непосредственно число, а у тебя передаётся адрес ячейки

или определить его как
Code:
  1. digit equ 10



OnLyOnE
у него вопрос о сохранении ecx на время вызова wsprintf в каком-то цикле

| Сообщение посчитали полезным: opcodes


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 10 июня 2012 15:57
· Личное сообщение · #9

Вот вопрос... ты на асме пытаешься, что-то писать?
Если я правильно понял, то тебе проще создать свою функцию, объявив о ее параметрах вначале кода.

Code:
  1. Func proto :dword,:dword.... и т.д.
  2.  
  3. .code
  4.  
  5. Func proc param1,param2.... и т.д.
  6.  
  7.        local _ecx:dword ; создаешь локальную переменную для сохранения в стеке значения есх
  8.  
  9.        mov ecx,100h
  10.        mov _ecx,ecx ; сохраняешь есх
  11.        
  12.        @@:
  13.        nop
  14.        nop
  15.        loop @B
  16.  
  17.        mov ecx,_ecx ; восстанавливаешь есх
  18.        ret
  19.  
  20. Func endp
  21.  


-----
aLL rIGHTS rEVERSED!


| Сообщение посчитали полезным: opcodes

Ранг: 5.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 10 июня 2012 16:02 · Поправил: opcodes
· Личное сообщение · #10

AkaBOSS, Спасибо! Работает.. А как на будущее узнать использует функция С конвенцию или нет? чтобы не задавать глупых вопросов впредь.
OnlyOne, я еще новичок в нем, я понимаю что можно организовать еще миллион вариантов этой простой задачи. но пока пользуюсь тем функционалом, который мне проще понять. Но серовно приятно за помощь.




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 10 июня 2012 16:06 · Поправил: OnLyOnE
· Личное сообщение · #11

Code:
  1.  
  2. .data
  3. LicNumbBuffer db 128 dup(0)
  4.  
  5. mov eax,100h
  6.  
  7. push ecx
  8. invoke wsprintf,addr LicNumbBuffer,chr$("%08lu"),eax
  9. pop ecx


Что тут сложного? Сохранить в стек и сразу после выхода из функции извлечь из стека обратно в регистр..
ТС научись формулировать свои мысли четче ..

-----
aLL rIGHTS rEVERSED!





Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 10 июня 2012 16:10
· Личное сообщение · #12

opcodes пишет:
А как на будущее узнать использует функция С конвенцию или нет

ну, как вариант, смотреть её определение в инклюде
например, для wsprintf смотрим user32.inc:
Code:
  1. wsprintfA PROTO C :VARARG
  2. wsprintf equ <wsprintfA>


вот это самое PROTO C и есть определение C конвенции
подробнее - masm32\help\masm32.chm - раздел Calling Conventions
или у Зубкова глава 8.1



Ранг: 5.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 10 июня 2012 22:13
· Личное сообщение · #13

OnLyOnE пишет:
ТС научись формулировать свои мысли четче ..


OnlyOnE, Сам не ожидал такого поворота. Прошу прощения.


 eXeL@B —› Программирование —› loop & asm
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати