LINUX.ORG.RU

прочитать из стека

 


0

1

здрасьте здрасьте

помогите пожалуйста прочитать из стека и вывести на экран


.section .text
.global main
main:

push %rbp
mov %rsp, %rbp

movq $111, -16(%rbp)
mov $1, %rax
mov $1, %rdi
lea -16(%rbp), %rsi

mov $8, %rdx

syscall 


leave 
ret




Схожая проблема. Домашка?

LGH ()

Я немного позаимствовал твоего кода. Надеюсь ты непротив

LGH ()

помогите пожалуйста прочитать из стека и вывести на экран

на асме пишут только психи. есть еще хуже психи, они отвергают асм и пишут прям в машинных кодах

alysnix ()
Последнее исправление: alysnix (всего исправлений: 1)

А что собсно не получается то? Вон push используешь, pop будет вытаскивать из стека, вывод через syscall - write(1, адрес того куда засунул то что pop, размер регистра или куда ты там pop’нул)

sparks ★★ ()

Чувак, только что нашел похожую тему на другом форуме. Там решили эту проблему. Я подсмотрел. Вобщем как то так они сделали.



.section data

fr: .asciz "%s"

.section .text
.global main
main:

push %rbp
mov %rsp, %rbp
sub $32, %rsp

mov $0, %rax
mov $0, %rdi
lea -32(rbp), %rsi
mov $32, %rdx


lea -32(rbp), %rsi
lea fr(%rip), rdi

call printf

leave
ret

может тебе пригодится

LGH ()
Ответ на: комментарий от LGH

Чувак, только что нашел похожую тему на другом форуме. Там решили эту проблему

щас умру. вот эти адресации стека относительно bp - это дизасм с языка высокого уровня, типа паскаля или си. зачем вы пытаетесь копировать генератор кода ЯВУ, и выносите себе мозг этим асмом? пишите на плюсах, паскале, си, модуле-2, или чем-то таком подобном, и програмировать научитесь, и сделает больше полезности в пару сотен раз, чем будете ковыряться в этом асме. я лично знаю асмы минимум 5 архитектур и знаю о чем речь. асм - это язык последней надежды. когда никакого яву нет.

alysnix ()
Ответ на: комментарий от alysnix

а относительно чего надо адресовать? при рекурсии в rsp будет лежать адрес из ip. ну давайте начнем играть с этим регистром и будем ловить крах программы. rbp не используется в Linux . почему тогда не адресовать относительно его?

можете по делу? раз знаете Assebler помогите разобраться

Assembler ()
Ответ на: комментарий от alysnix
mov $0, %rax
mov $0, %rdi
lea -32(rbp), %rsi
mov $32, %rdx

вы хотите сказать что вот таким способом компилятор будет писать в локальную переменную? не scanf а вот так?

Assembler ()
Ответ на: комментарий от alysnix

Ну знаешь, у них хоть как-то решили. Может кому то пришло умная мысля разосемблировать код и посмотреть. Я не уверен. Но там у них на форуме затолкали с клавиатуры строку в стек. У нас же кроме отсылов читать маны ничего ненаписали.

Если я знаю, к примеру, язык программирования, то я тебе напальцах объясню. Главное нужно самому понимать на 100 процентов, о чем говоришь, тогда ты сможешь и другому объяснить. Но если ты кое как сам понимаешь, то тогда ничего не остается, как сделать умный вид и отослать спрашивающего читать маны. Это как граммотно отмазаться: типа вопрос настолько нубский, что мне тебе разъяснять не хочется. Ты иди почитай маны там все написанно. А суть в том, что просто тот кто отослал , он нешарит.

LGH ()
Ответ на: комментарий от LGH

Ты иди почитай маны там все написанно. А суть в том, что просто тот кто отослал , он нешарит.

Бывает и такое.
ИМХНО ни разу ни у кого не просил помощи на форумах.
Почему?
Не из за ЧСВ.
Проблема в том, что ум настраивается не искать решение вопроса, а спрашивать, спрашивать, спрашивать …
Сначала нужно попробовать самому найти ответ.
Когда же приходят на форум с элементарными вопросами, то форумчане вправе предложить и маны почитать.

Владимир

anonymous ()
Ответ на: комментарий от Assembler

Если функция маленькая, то гонять rbp не имеет смысла и можно адресовать все относительно rsp. С рекурсией должен бороться компилятор, а не рантайм.

xpahos ★★★★★ ()
Ответ на: комментарий от Siborgium
Товарищи учёные, не сумлевайтесь, милые:
Коль что у вас не ладится — ну, там, не тот аффект, —
Мы мигом к вам заявимся с лопатами и с вилами,
Денёчек покумекаем — и напишем Метапрог!
anonymous ()
Ответ на: комментарий от anonymous
Товарищи учёные, не сумлевайтесь, милые:
Коль что у вас не ладится — ну, там, не тот аффект, —
Мы мигом к вам заявимся с ASM-ами и Delphi-ями,
Денёчек покумекаем — и напишем Метапрог!
anonymous ()
Ответ на: комментарий от anonymous

И эшо /памятка и для меня то же/.

На форуме нужно стараться вести себя корректно.
Постепенно от этого будет улучшаться психологическое состояние и

Постепенно станет меньше голосов в голове.

Владимир

anonymous ()
Ответ на: комментарий от anonymous

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

вот помните, бывают такие случаи, когда ты не знаешь дороги до магазина , к примеру, ты можешь найти путь, если походишь часов пять, или шесть, но когда найдешь, то магазин уже закроется. Но почему тебе бы не спросить прохожих? местных людей , кто в теме? им несложно кинуть пару слов и указать рукой, а ты благодаря их вежливости можешь успеть.

я не долюбливаю обитателя LGH, но когда читаю о чем он пишет, то во всем этом иногда нахожу что он прав. его вобще мало кто принимает в нашем учебном заведении всерьез. Но он вам и многим уже тысячу раз объяснял почему и что и как. По-вашему учитель не должен учить, он должен только показать куда двигаться. Ну блин такой 2Гис. форум не должен помогать, родители не должны воспитывать, врачи не должны лечить, пожарные недолжны лечить. Никто никому ничем не обязан. я это читал. я ходил по сдешним архивам и читал.
вобщем я не оспариваю, что местные обитатели -это элита в области программирования, но мне непонятны многие вещи, которые вы выдаете в темах. эта писанина от меня вызвана наблюдениями за недавними перебранками вас, уважаемые обитатели, с новичками. я прошу вас понять, и пересмотреть некоторые вещи. можно было бы отмолчаться, но это мерзко было бы.

Assembler ()
Ответ на: комментарий от Assembler

Я читал тут. Кто-то высказывался, мы могли бы успеть многое , если помогали бы друг другу.

Согласен.
Но когда элементарные вопросы задают, на которые ответов в inet валом, то возникает «недоумение».

Владимир

anonymous ()
Ответ на: комментарий от anonymous

вобщем спасибо всем огромное. никого не хотел обидеть или еще что. спасибо что заходите и помогаете уважаемые форумчане.

Assembler ()
Ответ на: комментарий от Assembler

Опять вы за свое.
Вам трудно погуглить «Помогите пожалуйста прочитать из стека и вывести на экран asm».
Ответов вагон.

Владимир

anonymous ()
push %rbp
mov %rsp, %rbp
movq $111, -16(%rbp)
mov $1, %rax
mov $1, %rdi
lea -16(%rbp), %rsi
mov $8, %rdx
syscall 
leave 
ret

в этом тексте есть ошибки.

  1. если вы делаете leave, то пишите и enter. это команды, что образуют пару(читайте доки по ним). можно конечно писать аналог enter ручками, как вы тут, но тогда нужно писать правильно.

  2. вы вообще не зарезервировали место под локальные переменные данной функции, и стали писать со смещением -16 по отношению к rbp. если вы вызовите еще какую-то функцию из данной на этом стеке(тот же syscall), ваша память по вашему смещение -16(rbp) будет расписана этой функцией. вот либо продвигайте rsp ручками, либо пишите enter <размер фрейма вашей этой функции> посмотрите хоть тут - https://www.osinavi.ru/asm/10.php

  3. проверять правильно ли вы загрузили в регистры нечто, и потом сделали syscall не стану, это доки по конкретным системным вызовам надо читать. вот и читайте.

  4. вопрос - «помогите прочитать со стека» - некорректен. стек - это область памяти адресуемая регистром - указателем стека. потому надо говорить с какого конкретного смещения на стеке вам надо что-то прочитать.

если я обьясняю студенту как делать домашку, то простите, товарищ студент, читайте доки по асму и как писать на нем функции, а не заставляйте других, писать за вас то, что должны писать вы. чтобы НАУЧИТЬСЯ, надо УЧИТЬСЯ. статей в инете полно. в том числе на русском. ну вот навскидку - https://habr.com/en/post/423077/ там вроде многое разжевано. про enter/leave тоже есть.

alysnix ()
Последнее исправление: alysnix (всего исправлений: 2)
Ответ на: комментарий от anonymous

ответов вагон…. может быть. но мне вагон не нужен. мне нужны правильные ответы. А их можно получить только тут , потому что все боги в программировании обитают на LOR. LOR -то Олимп.

Assembler ()
Ответ на: комментарий от Assembler

А их можно получить только тут , потому что все боги в программировании обитают на LOR. LOR -то Олимп.

На ЛОР действительно много профессионалов.
И могут помочь в решении сложных вопросов.
Что касается Олимпа, то не замечал, чтобы кто-то кичился проектами, …
ЛОР - «черная дыра» /затягивает в себя многих/.

Владимир

anonymous ()
Ответ на: комментарий от Assembler

Ты глуп и добр. Сколько ты не спрашивал, тебе ниодного дельного ответа не дали. А ты им мерси.
Вот даже туд дали ссылку нде описывается что leave просто копирует rpb в rsp . Нет, это чушь. Вы хоть немного смотрите какие ссылки даете. Попытайтесь заменить leave на pop rbp и mov rbp, rsp.

Кидают ссылки как кость, и еще хотят чтобы благодарили. Он про адресацию спрашивал, какую то херь несли, несли. Видно что сами не знают. Ссылок накидали и тему закрыли. Спрашивал про смещение, та же песня. Вы знаете про смещение? Как его правильноиделать знаете? Я не уверен.
А потом это верный вам начинающий, что считает вас богами , начитается этой хери, и запутается окончательно. За такие сслыки надо и ответы надо репутацию понижать.

LGH ()
Ответ на: комментарий от LGH

Вот даже туд дали ссылку нде описывается что leave просто копирует rpb в rsp . Нет, это чушь. Вы хоть немного смотрите какие ссылки даете. Попытайтесь заменить leave на pop rbp и mov rbp, rsp.

эй, там, в каске, ты читать то умеешь?

вот что пишет ссылка -

Команда leave выполняет действия, противоположные команде enter. Фактически leave только копирует ebp в esp, тем самым выбрасывая весь последний кадр, созданный последней выполненной командой enter, и считывает из стека ebp для предыдущей процедуры, что одновременно восстанавливает и значение, которое имел esp до вызова последней команды enter

то есть leave это пара:

rbp->rsp
pop rbp

хотите - пишите пару ручками, хотите - пишите leave. но leave - это команда процессора, которая короче и выполнялась быстрей чем пара регистровых команд. по крайней мере когда еще не было наворотов с предвыборкой команд.

Он про адресацию спрашивал, какую то херь несли, несли. Видно что сами не знают.

Про какую адресацию он спрашивал? где хоть намек на адресацию? он выставил rbp, на фрейм якобы своей функции, при этом не аллокировал фрейм, написал со смещением -16 и что-то там стал вызывать. поскольку он выставил rbp, и стал писать со смещением, значит он ЗНАЕТ как адресовать на стеке нечто. вот так и МОЖНО адресовать. можно и адресовать по отношению к текущему rsp.

alysnix ()
Ответ на: комментарий от LGH

Он про адресацию спрашивал, какую то херь несли, несли. Видно что сами не знают. Ссылок накидали и тему закрыли. Спрашивал про смещение, та же песня. Вы знаете про смещение? Как его правильноиделать знаете? Я не уверен.

эта ваша пурга что означает? причем тут смещения? о чем этот текст? кто про смещения не знает? расскажите, что вы знаете про какие-то там смещения.

alysnix ()
Ответ на: комментарий от alysnix

Про смещения относительно rsp.

Ребята, потом. Автор щас опомнится, что вы ему бред натолкали, начнет спрашивать снова, и может мы опять с вами поговорим.

LGH ()
Ответ на: комментарий от LGH

Про смещения относительно rsp.

он относительно rbp адресовался. для того его и выставил. в противном случае это не нужно.

он же записал в стек

movq $111, -16(%rbp)

значит может и прочитать в регистр навроде

movq -16(%rbp), rax

вот я и говорю - что вопрос неясен. что значит «прочитать со стека», с какого смещения прочитать, куда прочитать. главная проблема, что он пишет запись в стек, как будто у функции он создал фрейм, а фрейма нет. любой вызов затрет(если будет использовать стек в районе смещения -16 и глубже) эту якобы там переменную, и могут получиться чудесные результаты. пусть делает на входе

enter размер_нового_фрейма,0 

а на выходе leave. тогда код будет корректным

alysnix ()
Ответ на: комментарий от spock74

У LGH и ASSEMBLER даты регистрации в одно время 02.02.20. Мне кажется это один и тот же человек.

Тяжелый случай.

anonymous ()
Ответ на: комментарий от spock74

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

Assembler ()
Ответ на: комментарий от Assembler

По-вашему учитель не должен учить, он должен только показать куда двигаться.

Учитель должен учить. Но хороший учитель, кстати, и научит, как выбирать направление движения. По сути, главное, за что я благодарен своему вузу — вуз научил копаться в источниках и находить нужную информацию. Ну и немного общеинженерной культуры.

Но на форуме не учителя. На форуме равноправные люди, обменивающиеся информацией. И они этим занимаются на чистом энтузиазме. И предполагается, что хороший ответ на форуме должен помочь не только ТСу, но и другим, кого интересуют схожие проблемы. Угадай, какой ответ лучше в этом плане — подсказка основных моментов или инструкция, разжёванная для каждого вопрошавшего в отдельности?

Эрик Реймонд «Как правильно задавать вопросы» (на русском). К прочтению обязательно.

форум не должен помогать

Должен-должен. Но помощь форума всё же не помощь учителя. Форум может дать рецепт, но не обязан это делать, особенно если речь про рецепт, 100 раз пережёванный в гугле. Вот дать направление поисков — дело другое.

P.S. А 2ГИС — чрезвычайно полезная штука для тех, кто умеет ориентироваться. :)))

P.P.S. Вы с @LGH реально в одном учебном заведении? Или под учебным заведением имеется в виду ЛОР? :)))

P.P.P.S Но если ваш с @LGH гуру действительно озадачил вас написанием учебно-тренировочной ОС на ассемблере — респект ему и уважение, побольше бы таких.

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от LGH

Но если ты кое как сам понимаешь, то тогда ничего не остается, как сделать умный вид и отослать спрашивающего читать маны.

Нет. Ты НЕ понимаешь (или не хочешь понять), для чего шлют читать маны (особенно если имя конкретного мана указано). В частности, в многострадальной теме про scanf тебе вот тут дали ссылку на man fscanf, т.е. прямо указали на ту функцию, которая делает то, о чём ты спрашивал в начале темы. Но ты, похоже, ничего не понял.

Я комментарием выше дал твоему однокурснику ссылку на Реймонда, вот тебе туда тоже надо сходить и внимательно прочесть. Возможно, что-то прояснится.

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от hobbit

про учителей... это у мне заявили в прошлом учебном заведении. там одна деятель заявила , что мы должны сами искать инфу, а ей сдавать только готовые задания. мне пришло это напамять и я написал это тут)))

Форум может дать рецепт, но не обязан это делать, особенно если речь про рецепт, 100 раз пережёванный в гугле. 

вы тут правы.

как бы у меня к форуму очень теплые чувства. я благодарен форуму. и не я один. спасибо, что люди находят время и дают правильные ответы основанные на огромном опыте.

если коротко. то спасибо всем огромное.

Assembler ()
Ответ на: комментарий от Assembler

и про ОС на Ассемблер. нет, LGH просто решил видимо разрядить немного обстановку. Мы не пишем ОС, к сожалению. LGH даже не изучает Ассемблер. он просто хотел помочь разобраться нам. задавал те вопросы на которые мы не получали тут ответов. он на С++ как-то больше.

спасибо еще раз.

Assembler ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)