簡體   English   中英

學習匯編語言如何幫助我調試C程序?

[英]How can learning assembly language help me in Debugging C programs?

我嘗試編寫簡單的應用程序,每當發生任何錯誤時,都會嘗試調試並了解導致錯誤的原因。

正如標題中所述,學習匯編語言如何幫助我調試C程序? 此外,匯編語言的所有主題都是必需的。

PS:我對掌握匯編語言並不感興趣,但考慮學習同樣的東西來更好地理解這個過程。

PPS:鏈接到主題會很棒。

謝謝!

老實說,它不會。 也就是說, 學習程序集將無助於您專門調試C代碼(除了少數特殊情況,如微控制器/嵌入式系統項目)。 如果您已經知道匯編,它可以提供幫助,但即便如此,根據我使用C和匯編以及一些非常強大的調試器的經驗,我認為以這種方式調試代碼效率很低。

也就是說,我絕對鼓勵任何人探索組裝並盡可能多地學習它,甚至編寫一些匯編代碼。 它將提供有關程序如何在更低級別工作的其他重要見解。 而且,在某些情況下,它甚至可以很有趣。

至於調試,諸如Linux的gdb和Windows的visual studio調試器之類的工具應該是調試C代碼時的第一道防線。 我很少專門打開我的匯編文件,試圖追蹤我的C代碼中的錯誤。 我更經常出於好奇而打開它。

如果您有興趣了解一般的裝配,那么有很多材料只是谷歌的一小部分搜索,以及關於這個主題的各種好書。 我在學校(現在仍在使用)中使用的一本書是計算機系統:程序員的視角 ,它沒有涵蓋很多裝配,但會從程序員的角度教你低級計算。 它將解釋我們作為程序員如何編寫低級計算代碼,我認為這是您問題的核心。

簡而言之:我鼓勵任何人探索匯編,但在嘗試通過查看匯編來調試C代碼之前,我會建議使用其他工具進行調試。

熟悉的知識可以幫助您取消程序內部的不當行為。 特別是緩沖區可能難以追蹤,在最壞的情況下,應用程序在某些地方完全無關,你不知道它是如何到達那里的。 如果編譯器有錯誤並且您不知道為什么您的編碼沒有做它應該做的事情,它也會有所幫助。

一個簡單的方法是編寫一個小而簡單的C程序,讓編譯器為您生成匯編文件。 然后,您可以查看生成的實際代碼,而無需了解段設置和聲明數據的所有丑陋細節。

例如:

 main()
 {
     int a = 3,
     int b = 5;
     int c = 0;
     c = a+b;

     printf("%d\n", c);
 }

一個簡單的程序,你知道它應該做什么。 查看生成的代碼可以讓您了解它是如何工作的,並且您可以繼續使用更復雜的東西,即使用指針等。

所涉及的指令並不復雜,並且在沒有深入的裝配知識的情況下可以容易地理解。

我不確定你到底想要什么。但是下面的鏈接可能對你有用

http://cs.smith.edu/~thiebaut/ArtOfAssembly/artofasm.html

我同意匯編程序的知識可以幫助您調試c程序。 我建議你做兩件事。 隨意混合和混合:-)

首先:獲取有關x86(IA-32)匯編語言的入門書。 有幾本好書可供選擇:

“Linux中匯編語言編程指南”

“x86處理器的匯編語言”

購買或在您的圖書館(libgen / bookfi)查看。 我閱讀了“Linux中匯編語言編程指南”,這是一個好的開始。 我很想回顧一下“x86處理器的匯編語言”。 是的,這些都是相當大的書籍,但它們也有很長的介紹,你可以(想)跳過,你不必閱讀書籍到最后只是為了介紹匯編程序。

第二步:編寫簡單的c程序並使用gcc -S將它們編譯為匯編程序,並使用gdb逐步完成它們並嘗試理解它們的作用。 如果你無法弄清楚指令會做什么谷歌指令,你會發現很多教程和評論代碼可以幫助你。

如果你不像你希望的那樣快速地理解一切,不要氣餒。 現在,你得到了匯編程序的介紹,是時候加強了(游戲/板塊/其他)。 試着跟隨(即運行和調試大腦/機器中的代碼)這些帖子:

http://www.phrack.org/issues.html?issue=49&id=14#article這是Aleph One公認的“粉碎堆棧的樂趣和利潤”。 你會發現這個網站上發布了很多關於這篇文章的遺物;-)但要注意:如果你想在家里自己嘗試一下,請使用gcc -fno-stack-protector。

https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free這不是一篇關於匯編語言的文章,但是你的問題是正確的。 它使用匯編程序和其他工具的理解來創建(調試)一段代碼,它非常詳細,它將為您提供有關調試有用的技能的進一步提示。

您現在將看到,不僅匯編程序的知識是有用的,而且對堆棧和堆棧機制(以及調試工具,d!哦!)的深入理解是成為一個好的調試器所必需的。

我希望這能找到你。 並一如既往---負責任地破解。

暫無
暫無

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

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