1.4.2 組合語言是如何實現條件分支的
- 上面表格需特別說明的指令只有cmp、test以及je, jne這幾個,這些指令用於在組合語言中實現條件分支。
- 一般的程式語言中,都是通過if、switch等保留字來表現條件分支的。
- 而在組合語言中,則是通過控制標誌的cmp、test指令,以及根據標誌完成分支的跳轉類指令來實現的。
- 回頭看一下wsample01a.exe程式,會判斷命令列參數是否為2012,然後顯示不同的消息,這就是一種條件分支。
- 其中在0040101B的地方出現了一個jnz指令,這就是分支所在的位置。
- 00401019的test指令,簡單來說就是一個只改變標誌的and指令。
- test eax, eax的意思就是,當eax為0時,將ZF設為1。
- 在大多數情況下,test指令都會跟著兩個相同的暫存器名稱,如test eax, eax,或test ecx, ecx。
- 因此,只要看到帶有兩個相同暫存器的test指令,一般就是條件分支,可以理解為「若暫存器值為0,則將ZF設為1」。
- jnz指令的意思是,當ZF為0時進行跳轉。因此,將jnz指令和test指令結合起來就實現了下面的邏輯。
- 那麼,eax值又是從哪裡來的呢? 它是0040100C的call lstrcmpW的返回值。