x86 linux - GAS - AT&T - Stosb?

问题描述:

我目前正试图在自己的标题中发布自己的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

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'。 –

这是不是很清楚你想要做什么。但是,请注意stosb确实不是可以使用esi(或ecx)。 rep stosb将使用ecx:仔细阅读该说明的两种形式的描述,并确保您做的是正确的事情。

您可以从this page.