簡體   English   中英

裝配 - 為什么這個CALL功能不起作用?

[英]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 F10step into F11之間的區別

當您使用(默認) step overcall似乎被忽略。
您需要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM