2013-02-18 39 views
0

我正在處理college course的項目。裝配 - 驗證ISBN(某處出現邏輯錯誤)

首先,我並不是要求完整的解決方案。我很難找到我出錯的地方。當我輸入有效的ISBN 3201541974時,我的程序將打印「無效」代碼塊。我會很欣賞你可以看到的任何邏輯錯誤的提示,而且我也很想知道是否有更好的調試方法,而不是一次盯着我所有的代碼。我習慣依靠簡單的打印語句和斷點。

編輯:問題是在這裏

L1_top: 
     mov  al, [esi]    ; get a character 
     inc  esi   ; update source pointer 
     sub  al, 0 
     add  ah, al 
     cmp  ah, 11 
    ....... 

我從人減去0的原因是因爲人是最初一個字符。從al中減去'0'會將其轉換爲int或w/e。我錯誤地減去0,而不是「0」

正確的路線是

 sub  al, '0' 

回答

6

首先,我想說其實我是你的TA這個過程中,它的好,你只是尋找幫助調試,而不是尋求答案,但我們有辦公時間,我們非常友好。

我將首先回答較簡單的問題。有一種更簡單的方法來查找代碼中的問題,它被稱爲gdb。它基本上只是一個調試器。以這種方式進行調試非常有用,因爲它允許您在運行程序時查看寄存器和內存中的實際內容。以下是有關如何使用它的一些信息的鏈接。我建議你閱讀它,因爲它確實有幫助。 gdb help

現在到更復雜的部分。

  • 我不明白你爲什麼有msg10或msg11,你也可以擺脫他們和msg5,當你瞭解邏輯假設設置的方式。
  • 在錯誤檢查中,您可能想要將eax與11進行比較,如果相等,則跳轉。如果有合適的位數,它將只需要處理邏輯。 (10位+新行)
  • 在你的循環中,你應該檢查值是否在'0'和'9'之間(是的,撇號很重要,它們告訴計算機這些值是ASCII而不是數字)或' X'。
  • 後,你有,那麼你應該檢查「和」和「t」是大於或等於11減去11,如果是這樣,並通過整個循環得到了10次,每次一個字符。
+2

作爲助教+1和正在:) +1 – Earlz 2013-02-18 04:26:09

+0

哇,我已經upvoted這個答案不正確地讀了第一句話,兩次。現在,我已經閱讀正確,我想再次upvote ... – aib 2013-02-18 04:47:19

+0

哇,謝謝。我要給教授發郵件一個鏈接,只是爲了給你一些榮譽。我有味精10和11的原因實際上是因爲我試圖通過複製/粘貼和編輯其他人工作的4行來確定插入打印語句是怎麼回事,但是這導致了錯誤分割或w/e錯誤。 – rcj 2013-02-18 06:35:39

2

不幸的是,「打印語句」並不容易編寫 - 只需調用「print_debug_out」函數就會改變大部分相關狀態(標誌,堆棧等)。但你可以寫他們,只做一次。創建一個調試函數和宏的迷你庫!

我也打算建議gdb。組裝調試信息(-g)並使用gdb進行調試。你可能需要找到一個教程或者一個GUI包裝器,但是學習使用gdb(或者另一個調試器)是非常值得的。

請注意,您可以在源代碼以及調試器中設置斷點。只需使用int 3int3說明。

+0

這是一個很好的觀點,我完全忘了提到-g標誌。謝謝。 gdb實際上在服務器上,所有你需要做的就是在使用nasm命令時使用-g標誌進行編譯。用ld加載它,然後輸入'gdb a.out',如果你不改變二進制文件的名字。 – 2013-02-18 04:30:28