2014-04-18 52 views
0

我想寫一個未知數量的部件參數的函數,在一個點上我想萊亞爾到%尤指在一定取一個字節在棧上的偏移。我試圖這樣做:大會:利爾從%ESP到%EAX

movl  offset,%eax 
leal  (%eax,%esp,1),%eax # 
movb  %bl,(%eax) 

其中偏移量是一個4字節.long存儲%esp中最近使用的參數的偏移量。在組裝這一段代碼,但是,我得到這個消息:

Error: `(%eax,%esp,1)' is not a valid base/index expression

我使用GCC4.8組裝爲IA32 Kubuntu中。 GNU語法,請:)

提前感謝!

回答

2

事實上它是無效的,esp不能用作index寄存器。解決方案很簡單,因爲它可以作爲base:只需交換操作數並使用leal (%esp, %eax), %eax即可。或者,add %esp, %eax

PS:movb %bl,(%eax)是存儲器寫,不是讀了,你說你想「取」一個字節。

PS#2:當然,你甚至都不需要計算的地址,你可以做的是,在mov指令:movb (%esp, %eax), %bl

0

假設這是32位代碼,這是行不通的,因爲使用esp作爲基址寄存器使用ss(堆棧段)而不是ds(數據段),並且根據操作系統的不同,ss和ds可能在邏輯上不相等。你可以使用

 movb (%esp+offset), %bl 

我不知道GNU語法,但由於操作BL是一個字節,(如果這是允許使用GNU語法)您可以使用「MOV」,而不是「MOVB」 。