這兩天為了替同事上課,整理一些基礎的組合語言資料,本來想說用google大神剪剪貼貼就搞定,但發現一件十分有趣的事,就是這lea與mov兩個指令,似乎都說是「近似」的指令,讓人非常傻眼,還很少人更正,是這種低級語言....不不低階語言已經乏人問津了還是忽視,反正我也在整理資料,順便寫一下,這兩個天壤之別的指令到底差在哪裡。

  • Lea傳遞變數位置
  • Mov傳遞變數數值

學過C++的,應該很容易了解吧~~就是指指標的 *X1 語 &X1。我也很納悶為什麼那麼多人會說兩者差不多,我想,可能為誤會的原因應該是組語「字串」傳遞所害的,舉例來講:

lpCaption="Caption"
lpText="Hello World!"

_asm
{
push MB_OK
lea eax,lpCaption
push eax
lea eax,lpText
push eax
push NULL
call dword ptr [MessageBoxA]
}

假定我有兩個字串lpCaption與lpText,要傳遞給MessageBoxA來彈出一個視窗,我必須將MessageBoxA所需的三個變數MB_OK、lpCaption、lpText三個參數依序push入堆疊再call MessageBoxA,此時再傳遞lpCation會用到 lea eax,lpText,不懂原由的人就會以為mov和lea是差距不大,但事實上換用mov一定是出現亂碼,因為傳遞字串與陣列是必須傳遞字串或陣列的起始位置。

 

arrow
arrow
    全站熱搜

    傑克鼠 發表在 痞客邦 留言(2) 人氣()