2013-11-28 90 views
-1

我目前正試圖在自己的標題中發佈自己的x86環境。請注意我不只是想要一個答案,我想學習這個並且流利。x86 linux - GAS - AT&T - Stosb?

我在將數據存儲在主寄存器以外的存儲器地址(eax,ebx,ecx,edx)中存在很多問題。

.global main 

.text 

str: .string "data: %d\n" 

main: 

pushl $3 
call malloc 
popl %ecx 
movl $4, %esi   #source 
movl %eax, %edi  #destination 
stosb 
movl %eax, %esi 
lodsb 
pushl %edi 
pushl $str 
call printf 
popl %ecx 
popl %ecx 

stosb後,不應該movl把目標地址(從malloc生產的內存地址,而原來的源地址)到目標地址,並在移動的%esi$4%edi

回答

1

stosb存儲單個字節。在x86中,地址是雙字,因此您需要使用stosd。 (請記住,stosblodsb寫入/從%alstosd讀取和lodsd寫入/從%eax讀。)

此外,您$4最初存儲在%esi,但後來被movl %eax, %esi指令覆蓋。

+0

我想這個英特爾的參考手冊,但我得到:add.s:19:錯誤:沒有這樣的指令:'STOSD」 – CodeLikeBananas

+0

爾加,它可能叫'stosl'在AT&T的語法。 (我對10倍的英特爾語法更加熟悉,因爲這就是我長大的原因。) –

+0

爲了解釋區別,32位量也稱爲雙字或長字。英特爾語法更喜歡使用'd'; AT&T語法更喜歡使用'l'。 –

0

這是不是很清楚你想要做什麼。但是,請注意stosb確實不是可以使用esi(或ecx)。 rep stosb將使用ecx:仔細閱讀該說明的兩種形式的描述,並確保您做的是正確的事情。

您可以從this page.