簡體   English   中英

在程序集中調用過程時是否需要使用括號?

[英]Do I need to use brackets when calling a procedure in Assembly?

我剛剛開始學習匯編(x86 NASM),目前正在學習函數調用。 無論我在互聯網上的什么地方,我都看到每個人都像這樣調用函數:

call power

其中power是功能開始的標簽。 但是我想看到的是如何在Assembly 中打印一些東西,有趣的是,在上面的例子中調用一個函數似乎不起作用。 我們將使用 C 中的printf函數。假設我已經在我的程序中使用了extern printfimport printf msvcrt.dll (所以我實際上可以使用printf ),還說我已經在我的數據段中定義了一個符號msg db "Hello World", 0現在我正在嘗試打印此消息。 如果我這樣做:

push dword msg
call printf

什么都沒有發生,它不起作用。 我不知道為什么。 但是,如果我這樣做:

push dword msg
call [printf]

該消息按預期打印。

這對我來說沒有多大意義,因為我閱讀的所有文章都只使用標簽,沒有括號。 當我們使用call指令執行跳轉到該標簽時,僅使用標簽對我來說也很有意義,所以我們需要標簽的地址。 但在這里,我完全不明白為什么我們要使用括號以及究竟發生了什么。 我的意思是,什么是[printf]以及[power]是什么,例如我在問題開始時提出的示例。 然而,盡管我很困惑,但這是有效的,我最初使用的方法不起作用。

你能告訴我具體是怎么回事嗎? (PS:如果有任何區別,我正在使用 Olly Debugger)

這取決於程序集中的“printf”是什么。 如果它是一個函數指針(也就是某個函數的地址存儲在名為“printf”的地址中),那么你需要括號 []。 如果“printf”是一個函數,也就是說,如果機器碼存儲在你的匯編程序調用“printf”的地址,那么你一定不要加括號(否則你可能會以分段錯誤告終,作為第一個“printf”的 64 位機器代碼中的 32 位可能不會意外地包含可執行代碼的地址)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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