2013-04-09 55 views
1

我有寫入分配內存的問題。這是代碼。在程序集中寫入.long

total: .long 1  # my memory 

movl total, %eax  # I believe I'm copying address of total into eax 
movl $53, %esi  # set some value in esi 
movl (%esi), %eax # and put this value into total 

爲什麼它不工作?它給出了:「Naruszenie ochronypamięci」(核心傾銷),這是波蘭語,意味着違反內存訪問。

+0

括號替換都是圍繞錯誤的事情。 – harold 2013-04-09 21:09:32

+0

聽起來像在大學的裝配課程已經開始了...... – 2013-04-09 21:45:30

回答

2

首先,在& T語法,存儲代替

movl total, %eax 

這在Intel語法拆卸作爲標籤到寄存器的地址,:

8b042500000000 mov eax, [0x0] 

你需要使用:

movl $total, %eax 

它可以像這樣拆開:

b800000000  mov eax, 0x0 

在這個意義上使用AT & T語法一個時必須非常小心,以避免錯誤。

然後,如果你解決了上述問題,你仍然需要修正最後一條指令的括號,就像塞瓦和哈羅德所說的那樣。它應該是這樣的:

movl %esi, (%eax) 

該代碼會導致分段錯誤,因爲它會訪問您無權訪問的內存區域。在保護模式下,您無法訪問您希望的任何內存地址,您需要對該內存區域具有讀/寫/執行權限。

+0

那麼,有沒有其他的方式來存儲一些數據在內存中?我不能改變總數? – Kmaczek 2013-04-09 21:11:16

+0

您可以執行以下操作來將一些數據存儲在內存中:1.將代碼存儲在代碼的「data」部分中,或者2.使用堆棧來存儲局部變量,或者3.從操作系統請求內存塊(例如用'malloc')。 – nrz 2013-04-09 21:15:02

+0

但我的'total'在'.data'部分。它不是整個代碼:P – Kmaczek 2013-04-09 21:17:13

0

movl %esi, (%eax) 
+0

它不是幫助,同樣的錯誤 – Kmaczek 2013-04-09 21:14:38

相關問題