2012-03-24 230 views
2

在Windows 7主機上的VMware播放器使用的CentOS 5.5不解我寫了一個彙編代碼文件gpi.S:由x86彙編語法

.intel_syntax noprefix 
... /* cut off some code */ 
lea eax, string_label 
mov ebx, [DWORD PTR ds:eax] 
push ebx 
mov ebx, [DWORD PTR cs:eax] 
push ebx 
... /* cut off some code */ 

編譯:

gcc -o gpi gsi.S 

這是確定的。

後來我在VMware安裝了一個新的CentOS 6.2版本,然後編譯使用相同的命令相同的彙編代碼,但我發現了一些錯誤:

大會的消息:

Error: invalid use of register 

這些錯誤點到線:

mov ebx, [DWORD PTR ds:eax] 
mov ebx, [DWORD PTR cs:eax] 

在CentOS 6.2中,GNU gcc版本是4.6.6。 GNU as版本是2.20.51.0.2(i686-redhat-lnux)。

我認爲這兩行代碼使用了標準的英特爾彙編語法,所以它們在CentOS 5.5中是可以的。我不知道爲什麼。

+0

彙編語法只與編譯器相關,而不是操作系統或硬件,所以這不是罪魁禍首...你是否嘗試過使用AT&T語法?嘗試本節結尾處的表格:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s3 – Irfy 2012-03-24 14:43:23

+5

括號很奇怪,dword ptr屬於它們之外。 – 2012-03-24 14:44:39

+1

我更感到驚訝的是,代碼曾經在第一個地方工作.. – harold 2012-03-24 15:02:51

回答

1

據我最近了解, lea ebx, DWORD PTR [ds:eax]應該可以工作。
如果您的目標是通過ebx推送這些指針,我認爲您應該可以編寫push DWORD PTR [ds:eax]。不過,我不知道這是否適用於GCC彙編程序。