LINUX.ORG.RU

Assembler рекурсия

 


0

1

здрасьте люди добрые

извините что тревожу вас несерьезными вопросами, но помогите разобраться...

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

.section .text _Z1fl
_Z1fl:

pushq %rbp

movq %rsp, %rbp
subq $1, %rsp

movq %rdi, -8( %rbp)

cmpq $0, -8(%rbp)
jne dw
mov $1, %rax
jmp ext

movq -8(%rbp), %rcx
subq $1, %rcx
movq %rcx, %rdi
movq $1 , %rax

call _Z1fl
movq -8(%rbp) , %rbx

mulq ,%rbx


ext:
leave
ret


//так работает
 но если

movq -8(%rbp), %rcx
subq $1, -8(%rbp)
movq -8(%rbp), %rdi
movq $1 , %rax


call _Z1fl
%rcx , %rbx

mulq %rbx



не будет правильно работать. что то затирается в rcx?



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

Любишь асемблер, люби и трассировать

anonymous
()

я пишу функцию на Assembler

Какой ассемблер? Их много. На вставках пишешь, или отдельно транслируешь и линкуешь? Какая платформа?

которая будет использоваться в программе на C++

Какой программе? Давай минимально воспроизводимый пример.

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

С чего ты взял, что у тебя там память выделена? Какие у тебя гарантии, что локальная переменная а) находится в конкретном месте стека и б) вообще не была устранена в ходе компиляции?

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

пишу функцию на gas Assemblere в отдельном файле. потом вместеикомпилирую c.cpp и c.s файлы.

Assembler
() автор топика
Ответ на: удаленный комментарий

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

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

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

Вот именно. Может помочь применение volatile, которое не даст компилятору применить некоторые оптимизации. Может не помочь. Зависит от того, что вы делаете, и как вы это делаете.

функцию я вам написал. и случаи когда она работает, а когда не работает. поможете?

Ничего не понял. Вы код на плюсах дайте, и расскажите, как компилируете и линкуете.

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

да из плюсов я только вызываю функцию «f».


#include <iostream>

extern int f(int64_t A);
int  main(){
f(4);



}

Assembler
() автор топика
Последнее исправление: Assembler (всего исправлений: 1)
Ответ на: комментарий от Assembler
call _Z1fl
%rcx , %rbx <----- movq?

опечатался сори... там subq $16

Ты, что, руками все вбивал?! То есть даже из оригинала не скопировал?

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

что значит вбивал? откуда я могу скопировать? я нарисал код, в котором была опечатка, subq $16, %rsp

call _Z1fl %rcx , %rbx

mulq ,%rbx// тут я умножаю. для этого помещаю из rcx в rbx. так происходит умножение, то что лежит в rax умножается на то что лежит в rbx.

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

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

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

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

hobbit ★★★★★
()

напиши функцию на с, посмотри ассемблерный листинг, который выплюнет компилятор и оптимизируй как тебе надо - у тебя скорее всего какая-то срань на стеке

anonymous
()

// disclaimer 1: Господи, сколько раз пытался привыкнуть к этому идиотскому синтаксису с ‘%’, так и не смог. Поэтому в код не вникал. Но:

  1. Разве не «mov bp,sp»? А у тебя mov «sp,bp». Вроде бы получатель идёт первым операндом?

// disclaimer 2: пара «push bp; mov bp,sp» у меня записана на подкорку, но что она означает и как дальше со стеком работают я уже слабо помню. :)

  1. C и C++ имеют разные calling convention: у C только стек, у C++ первые 6 аргументов – через регистры. Т.к. я в код не вникал, то хз какой ABI ты используешь в asm, но если сявый, то может в C++ надо написать extern «C» int f(int64_t)?

// disclaimer 3: может я что-то и путаю, может это не C vs C++ ABI а что-то другое.

dimgel ★★★★★
()
  1. Держи очень удобный сайт, чтобы с мелкими примерами с флагами генерации asm-кода не трахаться на каждый чих: https://godbolt.org/

Мне очень нравится справа-вверху указывать в «compiler options» опцию -O2 и смотреть, как в разы (иногда на порядки) схлопывается код: чёртова магия, аж благоговение вызывает. Ж8-O

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

Разве не «mov bp,sp»? А у тебя mov «sp,bp». Вроде бы получатель идёт первым операндом?

В AT&T-синтаксисе наоборот.

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


pushq %rbp
movq %rsp, %rbp

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

и я указал, что синтаксис gas в теме. простр вы не прочитали.

с вопросом разобрался без отладчика. тема решена.

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

с вопросом разобрался без отладчика. тема решена.

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

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

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

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

спасибо вам за все, особенно за рецепты борща в теме Haskell.

Assembler
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.