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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2014, 20:43   #101
fipsiksi
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 20
Лампочка

ну и что вы тут написали?! вы хоть врубились что я спросил?
fipsiksi вне форума Ответить с цитированием
Старый 25.05.2014, 21:06   #102
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от fipsiksi Посмотреть сообщение
получается wparam хранится в младших 16 битах , а BN_CLICKED в старших
и чтобы их правильно сравнить надо двигать? Хотя когда потом сравнивают
lparam сдвига нет. Там значит в старших сразу. В общем это такая особенность что когда регистры стали 32 разрядные нижнее слово стали хранить внизу, а верхнее в верху...или это для того чтобы можно было сложить без потерь?
Ты что-то не понял. Перечитай описание WM_COMMAND
rpy3uH вне форума Ответить с цитированием
Старый 25.05.2014, 22:27   #103
fipsiksi
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 20
По умолчанию

Три раза перечитал.. Так..Значит вот этот "Control-defined notification code" который записан в wParam (high word) , т.е. в старшем слове, т.е. в двух байтах с большими номерами т.е. номерами 2 и 3. А сдвигаем вправо, потому что мы считаем справа на лево, т.е. байт3 байт2 байт1 байт0 | верно я понимаю? а то что-то я с этими сдвигами запутался. А на BN_CLICKED получается выделили всего лишь слово, и поэтому вот так?!
fipsiksi вне форума Ответить с цитированием
Старый 25.05.2014, 23:48   #104
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Представьте у вас есть десятичное число 12.
Как математически получить старшую цифру этого числа?
waleri вне форума Ответить с цитированием
Старый 26.05.2014, 00:44   #105
fipsiksi
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 20
По умолчанию

поделить на 10, или сдвинуть на разряд. все и так понятно, спасибо.
fipsiksi вне форума Ответить с цитированием
Старый 26.05.2014, 00:55   #106
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от fipsiksi Посмотреть сообщение
А на BN_CLICKED получается выделили всего лишь слово, и поэтому вот так?!
Да. Это всё придумали в microsoft, мы только пользуемся их интерфейсами и протоколами.
rpy3uH вне форума Ответить с цитированием
Старый 10.10.2015, 12:55   #107
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

Приветствую! Помогите разобраться не верно (выходит ошибка - не предназначена для выполнения) компилируется код из примера создания DLL. В папке DLL весит 2кб , при компиляции получается 1,5 кб. При подмене скомпилированного dll на dll из примера работает

сам код dll
Код:

; DLL creation example

format PE GUI 4.0 DLL
entry DllEntryPoint

include 'win32a.inc'

section '.code' code readable executable

proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
	mov	eax, TRUE
	ret
endp

proc CalcValue Value
	push ebx
	push edx

	push eax
	add eax, 3
	imul eax, 6
	mov ebx, eax  ; ebx = (a+3)*6

	mov edx, 100  ;
	pop eax
	sub edx, eax
	imul eax, edx ; eax = a*(100-a)

	add eax, ebx  ; eax = res

	pop edx
	pop ebx
	ret
endp

section '.edata' export data readable

  export 'DLL_sample.DLL',\
	 CalcValue,'CalcValue'

section '.reloc' fixups data discardable
mikado3333 вне форума Ответить с цитированием
Старый 10.10.2015, 12:58   #108
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

и код программы вызывающей dll
Код:
format PE Console 4.0
entry start

include 'win32a.inc'

section '.data' data readable writeable
inputa db 'Input a ',0

InputHandle dd 0
OutputHandle dd 0

Writed dd 0
Readed dd 0

MAX_VALUE_LENGTH equ 30


cons db 'CON',0
message  db '(a+3)*6+a*(100-a)='
a_str  db MAX_VALUE_LENGTH dup (0)

DLL_name db 'DLL_sample.DLL',0
FUNC_name db 'CalcValue',0

section '.code' code executable readable writeable

start:

    invoke GetStdHandle, STD_INPUT_HANDLE
    ;invoke CreateFile, cons, GENERIC_READ, 0,0, OPEN_EXISTING,0,0
    mov [InputHandle], eax

    invoke GetStdHandle, STD_OUTPUT_HANDLE
    ;invoke CreateFile, cons, GENERIC_WRITE, 0,0, OPEN_EXISTING,0,0
    mov [OutputHandle], eax


    invoke WriteConsole, [OutputHandle], inputa, 8,Writed,0
    invoke ReadConsole, [InputHandle], a_str, MAX_VALUE_LENGTH, Readed,0

    mov edi, a_str
    call GetZSLength
    sub eax, 2
    mov ebx, eax
    add eax, a_str
    mov word [eax], 0

    mov esi, a_str
    call STR_to_DWORD_EX
    push eax

    invoke LoadLibrary, DLL_name          ; eax = DLL handle
    invoke GetProcAddress, eax, FUNC_name ; eax = func address
    mov ebx, eax                          ; ebx = eax
    pop eax                               ; eax = value 
    stdcall  ebx, eax					  ; call func			
											
    mov esi, a_str
    mov ebx, 10
    call dword_to_STR


    mov edi, message
    call GetZSLength

    invoke WriteConsole, [OutputHandle], message, eax,Writed,0
    invoke ReadConsole, [InputHandle], a_str, 1,0,0

    invoke ExitProcess, 0

GetZSLength:
; get zero-string length
;IN
;       EDI ZS offset
;OUT
;       EAX ZS length

	push ecx
	push esi
	push edi

	cld
	xor   al, al
	mov ecx, 0FFFFFFFFh
	mov esi, edi
	repne scasb
	sub edi, esi
	mov eax, edi
	dec eax

	pop edi
	pop esi
	pop ecx
	ret

dword_to_STR:
;на входе EAX число 32 бит
;         ESI указатель на строку
;         EBX разрядность результата
      pushad
      cmp ebx, 16
      ja  .end
      cmp eax, 7FFFFFFFh
      jna .sign_plus
      mov byte [esi], '-'
      inc esi
      not eax
      inc eax
     .sign_plus:
      xor ecx, ecx
      sub esp, 32

    .repeat:
      xor edx, edx
      div ebx
      mov edi, eax
      mov al, dl
      cmp al, 10
      sbb al, 69h
      das
      mov byte [esp+ecx], al
      mov eax, edi

      inc ecx
      cmp eax, 0
      jz .endrep
      jmp .repeat
    .endrep:
      mov edi, esp
      add edi, ecx
    .copyrep:
      dec edi
      mov dl, byte [edi]
      mov byte [esi], dl
      inc esi

      loop .copyrep
      add esp, 32
    .end:
      popad
      ret
	    
STR_to_DWORD_EX:
; IN  ESI = pointer to ZS
; OUT EAX = result
    push esi
    push ebx
    push edi

    xor ebx, ebx
    cmp byte [esi], '-'
    jnz .sign_plus
    mov ebx, 1
    inc esi
   .sign_plus:

    mov edi, esi
    call GetZSLength
    mov edi, eax
    add edi, esi
    dec edi
    cmp byte [edi], "b"
    jnz .oct
    mov eax, 2
    xchg byte [edi], bh
    jmp .convert
   .oct:
    cmp byte [edi], "o"
    jnz .hex
    mov eax, 8
    xchg byte [edi], bh
    jmp .convert
   .hex:
    cmp byte [edi], "h"
    jnz .decim
    mov eax, 16
    xchg byte [edi], bh
    jmp .convert
   .decim:
    mov eax, 10
    mov bh, byte [edi]
   .convert:
    call STR_to_DWORD
    xchg byte [edi], bh
    xor bh, bh
    cmp ebx, 1
    jnz .end
    xor ebx, ebx
    sub ebx, eax
    mov eax, ebx
   .end:
    pop edi
    pop ebx
    pop esi
    ret
    
    
STR_to_DWORD:
; IN  ESI = pointer to ZS
;     EAX = notation
; OUT EAX = result
    push esi
    push ebx
    push edi
    push edx
    push ecx

    cmp eax, 16
    ja .error
    cmp eax, 2
    jb .error

    mov ecx, eax

    mov edi, esi
    call GetZSLength
    mov edi, eax
    add edi, esi  ; edi point to end ZS

    xor eax, eax
    xor edx, edx
    inc edx

   .rep:
    dec edi

    xor ebx, ebx
    mov bl, [edi]
    cmp bl, 30h
    jb .error
    cmp bl, 39h
    jna .digit
    cmp bl, 41h
    jb .error
   @@:
    cmp bl, 46h
    jna .sim_upcase
    cmp bl, 61h
    jb .error
   @@:
    cmp bl, 66h
    jna .sim_lowcase
    ja .error

   .digit:
    sub bl, 30h
    jmp @f
   .sim_upcase:
    sub bl, 37h
    jmp @f
   .sim_lowcase:
    sub bl, 57h
   @@:
    cmp bl, cl
    ja .error

    imul ebx, edx
    add eax, ebx
    imul edx, ecx
    cmp edi, esi
    jnz .rep
   .endrep:


    jmp @f
   .error:
    xor eax, eax
   @@:

    pop ecx
    pop edx
    pop edi
    pop ebx
    pop esi
    ret



section '.relocs' fixups readable writeable

section '.idata' import data readable writeable

  library kernel,'KERNEL32.DLL',\
	  user, 'user32.dll'

  import kernel,\
	 ExitProcess,'ExitProcess', \
	 GetStdHandle, 'GetStdHandle',\
	 ReadConsole, 'ReadConsoleA',\
	 WriteConsole, 'WriteConsoleA',\
	 WriteFile, 'WriteFile',\
	 ReadFile, 'ReadFile',\
	 CreateFile, 'CreateFileA',\
	 LoadLibrary, 'LoadLibraryA',\
	 GetProcAddress, 'GetProcAddress'

  import user,\
	 MessageBox,'MessageBoxA'
mikado3333 вне форума Ответить с цитированием
Старый 15.04.2017, 21:22   #109
bgrh
Новичок
Джуниор
 
Регистрация: 15.04.2017
Сообщений: 2
По умолчанию

Здравствуйте,

Читаю книжку, возникают вопросы. Наверное, аналог команды CALL будет что-то типа
Код:
push eip + sizeof(call)
jmp <адрес>
?
А не просто
Код:
push eip
jmp <адрес>
?
bgrh вне форума Ответить с цитированием
Старый 15.04.2017, 23:16   #110
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

...есть CALL FAR (дальний вызов процедуры), и есть CALL NEAR (ближний). Эта инструкция помещает в стек адрес возврата(EIP). Любой CALL должен заканчиваться инструкцией RET, которая снимает этот адрес возврата со-стека и переходит по нему. Получается продолжение программы.

При NEAR-вызове в стек помещается только смещение (2 байта), а при FAR - вместе с сегментным адресом и процедура должна заканчивать как RETF. Прогони под отладчиком - увидешь
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование на Ассемблере Николай ПН Помощь студентам 3 23.03.2010 00:56
Программирование микроконтроллера 80С196КС на ассемблере KOCT9IH Фриланс 3 07.11.2008 13:03
На форуме был замечен супермодератор - Руслан. Alar О форуме и сайтах клуба 17 25.07.2008 21:01