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
。 (请记住,stosb
和lodsb
写入/从%al
和stosd
读取和lodsd
写入/从%eax
读。)
此外,您$4
最初存储在%esi
,但后来被movl %eax, %esi
指令覆盖。
答
这是不是很清楚你想要做什么。但是,请注意stosb
确实不是可以使用esi
(或ecx
)。 rep stosb
将使用ecx
:仔细阅读该说明的两种形式的描述,并确保您做的是正确的事情。
您可以从this page.
我想这个英特尔的参考手册,但我得到:add.s:19:错误:没有这样的指令:'STOSD” – CodeLikeBananas
尔加,它可能叫'stosl'在AT&T的语法。 (我对10倍的英特尔语法更加熟悉,因为这就是我长大的原因。) –
为了解释区别,32位量也称为双字或长字。英特尔语法更喜欢使用'd'; AT&T语法更喜欢使用'l'。 –