[英]Assembly - Why this CALL function doesn't work?
我不明白為什么這段代碼中的CALL函數不起作用:
#include<stdio.h>
void main() {
__asm {
jmp L1
L2:
mov eax, 8
ret
L1:
call L2
}
}
如果我逐步調試代碼,則不會處理“調用L1”行,程序會直接跳到最后。 怎么了? 我正在使用帶有Intel 32位寄存器的VisualStudio2015。
問題
你偶然發現了step over
F10和step into
F11之間的區別。
當您使用(默認) step over
, call
似乎被忽略。
您需要step into
代碼,然后調試器將按照您的預期運行。
過來
這種step over
工作方式是調試器在下一條指令上設置一個斷點,在那里停止並再次將斷點移動到下一條指令。
Step over
了解(條件)跳轉和帳戶,但忽略(步驟)調用語句; 它將一個call
解釋為跳轉到另一個子例程,並“假定”您希望保持在當前上下文中。
這些自動斷點是短暫的,與手動斷點不同,手動斷點在您取消它們之前一直存在。
踏入
Step into
也是如此,但也在每個呼叫目的地設置一個斷點; 實際上,你將深入到每個子程序的樹林中。
走出去
如果你已經深入'進入'一個子程序, Visual Studio允許你使用Shift F11 步進 ; 這將帶您回到始發呼叫后的下一條指令。
其他一些調試器將此功能命名為“run until return”。
調試高級代碼
當調試器處理更高級的語言源代碼(例如C)時,它會為每行源代碼保留一個目標地址列表。 它將計划每行源代碼的斷點。
除了每行高級代碼轉換為零行或多行匯編之外,它的工作原理與逐步執行原始匯編代碼相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.