2010-03-15 61 views
1

我知道這有點遲鈍,但我無法弄清楚。我正在調試這個:grdb不工作變量

xor eax,eax 

mov ah,[var1] 
mov al,[var2] 

call addition 

stop: jmp stop 

var1: db 5 
var2: db 6 

addition: 
add ah,al 
ret 

我在地址var1和var2上找到的數字是0x0E和0x07。我知道它沒有分割,但這不是它做這樣的冒險的理由,因爲加法調用工作得很好。你能向我解釋我的錯誤在哪裏?


我看到問題,不知道如何解決它雖然。事情是,由於某種原因,指令指針從0x100開始,所有的段寄存器在0x1628。爲了解決使用的組合的指令,我猜[cs:ip](片段寄存器和指令指針之一)。偏移到Var1爲0x10的(因爲它是爲了在0x10th字節代碼的開頭可能),我試圖檢查內存和我得到的是:

1628:100 8 bytes 
1628:108 8 bytes 
1628:110 <- wtf? (assume another 8 bytes) 
1628:118 ... 

什麼招數都存在於存儲器[ cs:var1]指向別處,而不是在我的代碼中,這可能是標籤.data通常用於處理ds的地方....可能..我不知道1628應該是什麼:10


好的,我發現了什麼導致了屁股,並浪費了我整個他媽的一天。上述行爲是正確的,代碼是完全正常的。我不知道的是grdb調試器由於某種原因將開始地址設置爲0x100 ......溶劑是在第一行插入指令ORG 0x100,這就是整個事情。代碼正在工作,因爲指令指針對第一條指令有正確的地址並且一個接一個地執行,但是你的彙編程序不知道你的程序存儲了什麼有效地址,所以它相對於代碼的第一行仍然相當多,這意味着所有變量(如果不使用數據段的標籤)將保持指向,就像它從0x0開始一樣。這當然不適用於DOS。 grdb顯然模擬了一些DOS功能...爲語言而努力,爲每個人努力,希望如果出現同樣的問題,這將會讓別人的時間空餘...

heheh ..至少現在我知道爲什麼要使用.data部分:))))

+0

我不明白「escapade」發生了什麼?你沒有描述這個問題:你看到了什麼你期望的。 – Andrey 2010-03-15 17:18:48

+0

我認爲[var1]和[var2] – Pyjong 2010-03-15 17:21:37

+0

的值爲5和6,所以嘗試var1而不是[var1] – Andrey 2010-03-15 17:25:15

回答

2

假設是x86程序集,var1var2必須位於.data部分。


說明:我不打算解釋的可執行文件究竟是如何結構化(更何況這是特定於平臺的),但這裏的,爲什麼你在做什麼是一個總體思路不工作。

由於每個數據段直接(或幾乎直接)對應於二進制/可執行文件的特定部分,所以彙編代碼必須分成數據段。所有全局變量必須在.data部分中定義,因爲它們在全局數據所在的二進制文件中具有相應的位置。

在代碼段中定義一個全局變量(或全局訪問的部分內存)將導致未定義的行爲。一些x86彙編程序甚至可能會在此上拋出一個錯誤。

+0

這是x86彙編。我知道它應該在數據部分,但交易是什麼,如果數據沒有與指令混合,這應該沒有關係。爲什麼標籤指向其他地方? – Pyjong 2010-03-15 17:20:23

+0

它**確實很重要,彙編指令的位置對於它們在可執行文件上的位置至關重要。 – 2010-03-15 17:22:22

+0

我以爲ELF是不是真的有必要,如果你只是把你的機會閱讀沒有符號的代碼...我使用Windows btw ... – Pyjong 2010-03-15 17:25:30