2014-01-31 149 views
-3

我正在嘗試爲我的Architecture類編寫一個程序,它將通過字符串的字符循環,但是我的循環不工作,我不知道爲什麼。它不斷給我錯誤:'mov'的內存引用太多。循環x86程序集

mov $10,AL 
    top: 
    ~~STUFF~~ 
    dec AL 
    jnz top 

    next: 

是的我知道這樣的問題遍佈互聯網。我只是不斷嘗試所有我遇到的錯誤,而我並沒有在世界上的所有時間。我將10注入AL註冊表中,我將頂端設置爲我的跳轉返回點,並且我使用jnz,如果不等於零,那麼跳轉是正確的?我究竟做錯了什麼?

+1

您正在使用哪種彙編程序?在一些彙編程序中(Intel與AT&T風格),目標參數是第一個,所以'mov $ 10,AL'可能試圖將AL'移動到一個常量,這是無效的。 – lurker

+0

試試'mov AL,10h' –

+0

我正在使用AT&T Style我相信 – user3255768

回答

0

我不確定你的錯誤是否與你顯示的代碼一致: 在x86上,MOV不能直接將任何東西從內存移動到內存,你必須將數據存儲在兩者之間的寄存器中。您收到的錯誤似乎表明您在代碼中的某處嘗試了MOV MEM, MEM

2

假定這個組件處於AT & T語法,mov $10,AL指「移動至直接10到由標籤AL指定的存儲器位置」。 dec AL也是如此,但還有一個問題:您沒有指定操作數的大小,彙編器無法知道AL是指向一個字節,一個字,一個雙字還是一個四字(儘管有些HLA會執行那個,AFAIK)。因此,您需要指定操作數的大小。在AT & T語法中,通過向指令助記符附加後綴來完成:字節爲b,字爲w,雙字爲d,以及爲四字爲q

寄存器,而另一方面,前綴爲在& T語法的%跡象。所以,如果你想使用al註冊您的指示,你應該寫mov $10, %aldec %al。在這些情況下,請注意如何不需要操作數大小後綴:彙編程序可以根據要使用的寄存器的大小來處理它們。不過,我總是鼓勵追加後綴,無論如何:因此,請編寫movb $10, %aldecb %al,您將會很開心。