从非x4地址访问堆栈 - 是否可能?

时间:2015-04-21 13:23:40

标签: assembly att

好的,这可能是一个愚蠢的问题,但我想我和其他人可能会在这个过程中学习:

我正在使用32位汇编程序,并使用& t语法。

假设我想以dinamically方式生成一个字符串,将其内容保存到堆栈中:

.data 
str: .long 0
string: .string "value is %s.\n"
.globl main

movb $0,str+3 #terminate the string
movb $67,str+2
movb $67,str+1
pushl $str
movl %esp,%eax
incl %eax
push (%eax)
push $string
call printf
addl $12,%esp
ret

它不起作用,我遇到了分段错误。但是,如果我评论该行

# incl %eax

并在str:

的开头添加另一个字节
movb $67,str

然后它完美运行,并显示CCC。

似乎我无法引用从不是4的多个地址开始的字符串。或者我错了?我知道我可以从任何地址引用变量,但有没有办法在堆栈中这样做?

1 个答案:

答案 0 :(得分:2)

你可以,但你做错了。您将字符串的地址放在堆栈上,然后尝试递增地址的地址,并取消引用它。你想增加地址。使用incl (%eax)增加堆栈上的地址应该可行。但是整个事情过于复杂,你可以简单地做push $str+1

movb $0,str+3 #terminate the string
movb $67,str+2
movb $67,str+1
pushl $str+1
push $string
call printf
addl $8,%esp
ret

您可以访问堆栈未对齐,但是您应该确保它有意义。由于堆栈上有一个4字节的地址,如果你访问那个未对齐的地址,你将得到它的3个字节,以及堆栈中下一个项目的另一个字节,无论它是什么。这当然不太可能是有效的地址,因此是段错误。这个错误不是为了不对齐访问堆栈,而是因为你取消引用了一个无效的指针。

相关问题