討論區快速選單
知識庫快速選單
討論區最近新進100則主題 網路投保旅行平安險 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
WIN32 API, ChangeWindowMessageFilte, NEG SBB 使用原因
更改我的閱讀文章字型大小
作者 : xiaolaba(xiaolaba)
[ 貼文 23 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 4 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/5/27 上午 10:17:58

win32, API call, 看人家的碼, 有個不理解的地方, 請教為何要那樣做, 例如副程式裡面有三行:
  neg ecx ; -MSG ??
  sbb ecx, ecx ; ecx = 0 or -1 ?
  add ecx, 2 ; ecx = 1 or 2, why do this ?


主程式:
push 1 ; MSGFLT_ADD, add message to filter
mov eax, MOUSEHOOK_CAPTUREOK_MSG
push eax
call my_ChangeWindowMessageFilte


副程式:
my_ChangeWindowMessageFilter proc near

  FLAG_1or2_add_or_remove= dword ptr 8
  MSG = dword ptr 0Ch

  push ebp
  mov ebp, esp
  push esi
  push edi

  push offset aChangewindowme ; "ChangeWindowMessageFilter"
  push esi ; hModule
  call ds:GetProcAddress
  test eax, eax
  jz short handle_ChangeWindowMessageFilter_null

;;ChangeWindowMessageFilter is obtianed, process and call API
  mov ecx, [ebp+MSG]
  mov edx, [ebp+FLAG_1or2_add_or_remove]

  neg ecx ; -MSG ??
  sbb ecx, ecx ; ecx = 0 or -1 ?
  add ecx, 2 ; ecx = 1 or 2, why do this ?

  push ecx ; FLAG
  push edx ; MSG
  call eax ; call ChangeWindowMessageFilter ; call win32 API

  pop edi
  pop esi
  pop ebp
  retn
endp

作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4467 | 人氣 37262 | 評價 10860 | 評價/貼文 2.43 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/6/29 下午 09:27:38

>
>win32, API call, 看人家的碼, 有個不理解的地方, 請教為何要那樣做, 例如副程式裡面有三行:
> neg ecx ; -MSG ??
> sbb ecx, ecx ; ecx = 0 or -1 ?
> add ecx, 2 ; ecx = 1 or 2, why do this ?
>

http://www.c-jump.com/CIS77/reference/ISA/DDU0107.html
https://c9x.me/x86/html/file_module_x86_id_286.html

作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1012 | 人氣 3227 | 評價 1260 | 評價/貼文 1.25 | 送出評價 27 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/7/4 下午 12:09:05

>
>win32, API call, 看人家的碼, 有個不理解的地方, 請教為何要那樣做, 例如副程式裡面有三行:
> neg ecx ; -MSG ??
對 ecx 做 2 的補數轉換,neg 指令有個特性,若 eax 是 0 轉變後,狀態暫存的 carry flag 為 0,
若 eax 不是 0 轉變後,狀態暫存的 carry flag 為 1

> sbb ecx, ecx ; ecx = 0 or -1 ?
這指令的動作為 ecx = ecx - ecx - carry flag
所以經以上兩個指令處理後, ecx 不是 0 就是 -1

> add ecx, 2 ; ecx = 1 or 2, why do this ?
所以經以上三個指令處理後, ecx 不是 1 就是 2

整個的意思用 C 語言表示就是

if(ecx == 0)
  ecx = 2;
else
  ecx = 1;
 板主 : 徵求中
 > 組合語言 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 組合語言 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
組合語言
1 H 2220 
2 liaoo 990 
3 青衫 970 
4 牧童哥 940 
5 史努比 920 
6 qq 480 
7 GHOST-JACKY 330 
8 ]CALL-151 310 
9 harrison 300 
10 掌握文武半邊天 280 
組合語言
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.03125