我試圖檢查x86_64彙編代碼中的值是否爲零。我知道這通常包含一個cmp
變體,然後是jmp
變體,但我不確定要使用的確切說明。如何檢查x86_64程序集中的寄存器是否爲零
2
A
回答
5
如果您剛剛使用的前修改ZF的指令,只需檢查標誌,並使用JZ
或JE
跳。例如
and rax, rbx ; ZF was modified
jz is_zero ; so to check if rax is zero, a single jump is enough
如果沒有設置ZF,則需要明確地執行此操作。最顯而易見的方法是
cmp rax, 0
je equal_zero
但是,由於cmp
較長,如果你看一下輸出二進制中,test
或有時and
, or
優先
83F800 cmp eax, 0
09C0 or eax, eax
85C0 test eax, eax
產生的代碼將是
test rax, rax
jz is_zero
你可以從編譯器中獲取程序集輸出,並通過在線工具(如gcc godbolt
012)進行檢查或查看
10
test %eax, %eax ; set ZF to 1 if eax == 0
je 0x804f430 ; jump to 0x00804f4 if ZF == 1
ZF
是單個比特零標誌將被設置爲1,如果eax
等於零。 je
將採取跳轉到0x804f430
如果ZF
被設置爲1
相關問題
- 1. 在gcc內聯x86_64程序集中約束r10寄存器
- 2. 檢查所有零的XMM寄存器
- 3. 檢查兩個SSE寄存器是否都不爲零而不破壞它們
- 4. 如何檢查GAC中是否存在程序集引用?
- 5. 如何在x86_64上保存寄存器以獲得中斷服務程序?
- 6. 如何檢查數字是否爲零?
- 7. 你如何檢查NSURLRequest.URL是否爲零?
- 8. 檢查time_t是否爲零
- 9. 是否有任何x86_64程序集美化器?
- 10. 程序集retn,jmp,進程寄存器
- 11. 如何檢查程序包中是否存在程序?
- 12. x86_64上的gdb eflags寄存器
- 13. sparc程序集和%y寄存器
- 14. 程序集 - .data,.code和寄存器...?
- 15. (ARM程序集)向右移位寄存器1將所有位設置爲零
- 16. 如何以編程方式檢查c#中是否存在程序集引用?
- 17. 檢查bash中是否存在程序
- 18. 程序集如何保存和恢復寄存器
- 19. 檢查UIDatePicker.date在Swift中是否爲零
- 20. 新的X86_64處理器寄存器的名稱是什麼?
- 21. 檢查特定幀中的寄存器
- 22. 是否有指令在amd64程序集中「打包」一個寄存器?
- 23. 是否存在哈希零檢查?
- 24. LLVM:檢查物理寄存器是否帶電
- 25. MS SQL Server檢查是否存在已註冊的程序集
- 26. 如何檢查是否關聯從零
- 27. 如何檢查我的.NET程序集是否新鮮?
- 28. 程序集EAX寄存器的行爲奇怪
- 29. 如何檢查內存塊中的所有字節是否爲零
- 30. 檢查SQL中是否存在子集
什麼是變量類型? –