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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2013, 16:57   #91
western_digital
Пользователь
 
Регистрация: 20.11.2013
Сообщений: 45
По умолчанию

Адреса PAGE_DIR_BASE_ADDRESS и PAGE_TABLES_BASE_ADDRESS - физические. Для обращения к этим физическим адресам, надо создать для них виртуальные адреса, вернее страницы. Вопрос: зачем вам нужны эти адреса?
western_digital вне форума Ответить с цитированием
Старый 17.12.2013, 18:23   #92
fipsiksi
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 20
По умолчанию

Цитата:
Сообщение от western_digital Посмотреть сообщение
Адреса PAGE_DIR_BASE_ADDRESS и PAGE_TABLES_BASE_ADDRESS - физические. Для обращения к этим физическим адресам, надо создать для них виртуальные адреса, вернее страницы. Вопрос: зачем вам нужны эти адреса?
Хм ...я думал наооборот, для виртуальных надо указать физические.
Цитата:
Вопрос: зачем вам нужны эти адреса?
А по каким тогда адресам у меня будут располагатся каталог таблиц и таблица страниц, которые задают соответствие между адресами?
fipsiksi вне форума Ответить с цитированием
Старый 17.12.2013, 18:25   #93
western_digital
Пользователь
 
Регистрация: 20.11.2013
Сообщений: 45
По умолчанию

Цитата:
Сообщение от fipsiksi Посмотреть сообщение
А по каким тогда адресам у меня будут располагатся каталог таблиц и таблица страниц, которые задают соответствие между адресами?
Там в коде уже есть функция, которая всё создаёт.
western_digital вне форума Ответить с цитированием
Старый 17.12.2013, 19:02   #94
fipsiksi
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 20
По умолчанию

ну так она и использует эти адреса
fipsiksi вне форума Ответить с цитированием
Старый 17.12.2013, 19:04   #95
western_digital
Пользователь
 
Регистрация: 20.11.2013
Сообщений: 45
По умолчанию

Цитата:
Сообщение от fipsiksi Посмотреть сообщение
ну так она и использует эти адреса
Она их использует до включения механизма трансляции адресов.
western_digital вне форума Ответить с цитированием
Старый 17.12.2013, 19:07   #96
fipsiksi
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 20
По умолчанию

и что из этого?
fipsiksi вне форума Ответить с цитированием
Старый 25.05.2014, 19:02   #97
fipsiksi
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 20
По умолчанию

После перерыва продолжил читать книгу, хотя если честно это наслаждение для мазохистов. Все время приходится догадываться о чем-то. Хотя иногда это даже интересно). Ниже программа которая создаёт окно с двумя кнопками и обрабатывает события. В общем, тут...
Код:
format PE GUI 4.0
entry start

include 'win32a.inc'

section '.code' code executable readable writeable


main_hwnd         dd 0
msg             MSG
wc              WNDCLASS
        
hInst           dd 00000000h
szTitleName     db 'Window work sample',0
szClassName     db 'ASMCLASS32',0

button_class    db 'BUTTON',0
AboutTitle      db 'About',0
AboutText       db 'First window program',0;
ExitTitle       db 'Exit',0

AboutBtnHandle  dd ?
ExitBtnHandle   dd ?


start:  
   
        invoke  GetModuleHandle,0

        mov     [hInst], eax
        mov     [wc.style], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
        mov     [wc.lpfnWndProc],  WndProc
        mov     [wc.cbClsExtra], 0
        mov     [wc.cbWndExtra], 0
        mov     [wc.hInstance], eax

        invoke  LoadIcon,0,IDI_APPLICATION
        mov     [wc.hIcon], eax

        invoke  LoadCursor,0, IDC_ARROW
        mov     [wc.hCursor], eax

        mov     [wc.hbrBackground], COLOR_BACKGROUND+1
        mov     dword [wc.lpszMenuName], 0
        mov     dword [wc.lpszClassName], szClassName

        invoke  RegisterClass, wc

        invoke CreateWindowEx,0,szClassName,szTitleName,\
               WS_OVERLAPPEDWINDOW, 50,50, 300, 250,\
               0,0,[hInst],0
        mov     [main_hwnd], eax

        invoke CreateWindowEx, 0, button_class, AboutTitle,\
               WS_CHILD, 50, 50, 200, 50, [main_hwnd],0,[hInst],0
        mov     [AboutBtnHandle], eax

        invoke CreateWindowEx, 0, button_class, ExitTitle,\
               WS_CHILD, 50, 150, 200, 50, [main_hwnd],0,[hInst],0
        mov     [ExitBtnHandle], eax

        invoke    ShowWindow,[main_hwnd],SW_SHOWNORMAL
        invoke    UpdateWindow,[main_hwnd]
        invoke    ShowWindow, [AboutBtnHandle],SW_SHOWNORMAL
        invoke    ShowWindow, [ExitBtnHandle],SW_SHOWNORMAL

msg_loop:
        invoke   GetMessage, msg,0,0,0

        cmp  eax, 0
        je   end_loop

        invoke   TranslateMessage, msg
        invoke   DispatchMessage, msg

        jmp      msg_loop

end_loop:

proc WndProc hwnd, wmsg, wparam, lparam

        pushad
        cmp     [wmsg], WM_DESTROY
        je      .wmdestroy
        cmp     [wmsg], WM_COMMAND
        jne     .default
        mov     eax, [wparam]   
        shr      eax, 16                  
        cmp    eax, BN_CLICKED
        jne     .default
        mov     eax, [lparam]
        cmp     eax, [AboutBtnHandle]
        je      .about
        cmp     eax, [ExitBtnHandle]
        je      .wmdestroy

.default:
        invoke  DefWindowProc, [hwnd],[wmsg],[wparam], [lparam]
        jmp     .finish

.about:
        invoke MessageBox, 0, AboutText, szTitleName,0
        jmp .finish

.wmdestroy:
        invoke  ExitProcess,0
.finish:
        mov [esp+28], eax   ;?????ïî÷åìó 28??    ÷òî ìû âîîáùå òóò äåëàåì??
        popad
        ret
endp

section '.relocs' fixups readable writeable

section '.idata' import data readable writeable

  library kernel,'KERNEL32.DLL',\
          user,'USER32.DLL'

  import kernel,\
         GetModuleHandle,'GetModuleHandleA',\
         ExitProcess,'ExitProcess'

  import user,\
         RegisterClass,'RegisterClassA',\
         CreateWindowEx,'CreateWindowExA',\
         DefWindowProc,'DefWindowProcA',\
         GetMessage,'GetMessageA',\
         TranslateMessage,'TranslateMessage',\
         DispatchMessage,'DispatchMessageA',\
         LoadCursor,'LoadCursorA',\
         LoadIcon,'LoadIconA',\
         SetWindowPos,'SetWindowPos',\
         ShowWindow,'ShowWindow',\
         UpdateWindow,'UpdateWindow',\
         EnableWindow,'EnableWindow',\
         SetWindowText,'SetWindowTextA',\
         MessageBox,'MessageBoxA'
я что то не могу догнать вот этот кусок:
Код:

        mov     eax, [wparam]   
        shr      eax, 16                  
        cmp    eax, BN_CLICKED
т.е. зачем сдвигать перед сравнением?
получается wparam хранится в младших 16 битах , а BN_CLICKED в старших
и чтобы их правильно сравнить надо двигать? Хотя когда потом сравнивают
lparam сдвига нет. Там значит в старших сразу. В общем это такая особенность что когда регистры стали 32 разрядные нижнее слово стали хранить внизу, а верхнее в верху...или это для того чтобы можно было сложить без потерь?
fipsiksi вне форума Ответить с цитированием
Старый 25.05.2014, 19:03   #98
fipsiksi
Пользователь
 
Регистрация: 07.11.2013
Сообщений: 20
По умолчанию

И ещё в этом месте:
Код:
.finish:
        mov [esp+28], eax   
        popad
        ret
endp
Чтобы обеспечить stdcall мы делали
Код:
proc WndProc hwnd, wmsg, wparam, lparam

        pushad
Вот тут я не понимаю. По stdcall мы вроде как обязаны сохранять ebx,esi,edi,ebp..ну допустим перестраховалиь и сделали pushad. Но обычно мы же возвращаем значение в eax в обычных функциях, если я правильно понимаю...а тут мы потом сделаем popad. Ну хорошо, когда мы делаем mov [esp+28], eax у нас esp указывает на вершину стека где сохранён старый edi
как я понимаю. Потом отсчитываем 28 байт и мы как раз указываем на старый
регистр eax...опс..всё ясно.. Ну тогда по первому вопросу, и вообще правильно ли я рассуждаю, ответьте кто-нибудь из живых, плз
fipsiksi вне форума Ответить с цитированием
Старый 25.05.2014, 19:41   #99
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от fipsiksi Посмотреть сообщение
т.е. зачем сдвигать перед сравнением?
получается wparam хранится в младших 16 битах , а BN_CLICKED в старших
и чтобы их правильно сравнить надо двигать? Хотя когда потом сравнивают
lparam сдвига нет. Там значит в старших сразу. В общем это такая особенность что когда регистры стали 32 разрядные нижнее слово стали хранить внизу, а верхнее в верху...или это для того чтобы можно было сложить без потерь?
WM_COMMAND
Цитата:
Message Source | wParam (high word) | wParam (low word) | lParam
Menu | 0 | Menu identifier (IDM_*) | 0
Accelerator | 1 | Accelerator identifier (IDM_*) | 0
Control | Control-defined notification code | Control identifier | Handle to the control window
Somebody вне форума Ответить с цитированием
Старый 25.05.2014, 19:47   #100
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от fipsiksi Посмотреть сообщение
т.е. зачем сдвигать перед сравнением?
получается wparam хранится в младших 16 битах , а BN_CLICKED в старших
и чтобы их правильно сравнить надо двигать? Хотя когда потом сравнивают
lparam сдвига нет. Там значит в старших сразу. В общем это такая особенность что когда регистры стали 32 разрядные нижнее слово стали хранить внизу, а верхнее в верху...или это для того чтобы можно было сложить без потерь?
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
waleri вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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