2015-04-21 1 views
1

Хорошо, это может быть глупый вопрос, но я предполагаю, что я и другие могут узнать в процессе:Доступ к стеку из адресов без x4 - возможно ли это?

Я работаю с 32-битным ассемблере, и при & т синтаксисом.

Предположим, я хочу создать строку динамически, сохраняя его содержимое в стек:

.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 

и добавить еще один байт в начале ул:

movb $67,str 

затем он отлично работает, и отображается CCC.

Кажется, что я не могу ссылаться на строку, начинающуюся с адресов, которые не кратно 4. Или я не прав? Я знаю, что могу ссылаться на переменные с любого адреса, но есть ли способ сделать это со стеком?

ответ

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 байта и еще один байт из следующего элемента в стеке, что бы это ни было. Это, конечно, вряд ли будет действительным адресом, следовательно, segfault. Ошибка заключалась в том, что доступ к стеку не был согласован, потому что вы разыменовали неверный указатель.

+0

Еще раз спасибо @Jester! Это сработало отлично! : D – francisaugusto