學習每個指令注意其指令執行原理,嘗試用其他組合指令去替代有利於理解,不要只停留於指令語法!
1、每個應用程序都會有自己的獨立的4GB內存空間,彙編中通常說的內存正是這進程對應的內存,而不是物理內存或內存條。
2、32位機上的一塊內存的尋址寬度爲 0x00000000~0xFFFFFFFF,其中每 0x1中有8 bit,所以這個值正好對應4G內存空間。
3、彙編中 movs 可以將一段內存賦值給另一段內存,而 mov 不行。
4、調試器中F7(單步步入),F8(單步步過)在call指令中存在差異,F8會執行完call指令後接着把直到ret指令的內容全執行完,F7則會在call中單步運行。寫許多無用的call和使程序跑飛的call是反調試的基本手段。
5、ESP:棧指針寄存器:堆棧給中間的一些程序存儲值。(ESP中的值是堆棧中地址,該地址中儲存的值(可能是下一條指令的地址等等))。
6、EIP:不是通用寄存器所以通過彙編(mov)不能修改,但是可用jmp修改;jmp就是用來修改EIP,同時jmp語法中也可以用內存/寄存器/立即數 修改,但似乎內存只能是……dword……(因爲EIP就是32位的呀);另一個call也用於修改EIP。call和jmp的唯一區別是call執行時會把call的下一條指令壓入堆棧中。
7、單步步入本質上是設置EFLAGS的TF位;而單步步過本質上是在下一行設置斷點。斷點實際上是設置 int 3 指令,int 3指令的值爲0xCC。
8、Dbdebug調試軟件中四個模塊(反編譯、寄存器、內存、堆棧)中內存和堆棧的關係我理解是:堆棧是內存中開闢的一塊,由操作系統自動分配,左邊的內存地址中只能使用那些被申請過的也就是在右邊出現過的內存地址。
9、關於彙編函數中的寄存器傳參和堆棧傳參。
10、函數堆棧平衡:1) 如果要返回父程序,則當我們在堆棧中進行堆棧的操作的時候,一定要保證在RET這條指令之前,ESP指向的是我們壓入棧中的地址。2) 如果通過堆棧傳遞參數了,那麼在函數執行完畢後,要平衡參數導致的堆棧變化。
11、關於存儲模式:80x86架構中多是小段存儲,而ARM多是大端儲存。