LINUX.ORG.RU

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

Всё верно, но это не значит что указатель будет прыгать по 8 байт всегда, если бы так было ты бы адресовать ничего кроме 1 типа size_t не смог.

от int ** к другому int ** я иду с шагом в 8байт

Всё верно ты гуляешь по памяти от одного указателя до другого

от int * к другому int * я иду с шагом в 4байта

Всё правильно ты гуляешь по памяти от одного значения int на который ссылается указатель на него до другого.

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

Вот наводка, имеем массив char по 1 байту 10 букв и указатель на этот массив что нужно прибавлять к указателю что бы получить букавки? Нарисуй это. А теперь у нас есть массив из int по 4 байта из 10 штук проделай тоже самое. Проделай тоже самое с массивом указателей на указатель. Видишь разницу?

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

чем больше вы будете увеличивать количество таких ассемблеровых в индустрии

тем раньше вы сами окажетесь на улице

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

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

Я не программист мне пофиг и к компуктерам отношения не имею вообще, ну на хлебозаводе разве что раньше 1 кнопку нажимал большую такую красную тестоделитель запускать и всё =)

Погоди, у него уже есть вся инфа просто не доперает. Если руки не сложит то у него случится ЭВРИКА! Пока просто небольшой затуп, я раньше тоже тупил так знатно по этой хрени. Это бесполезно объяснять, эту хрень нужно просто понять самостоятельно, именно понять почему вот так, а не как так. Типа чик и «Ааааааааа пооонял! ахаха ахаха» Лучший способ это нарисовать, так как память линейна и всё можно отобразить хоть прям в транзисторах если упороться, но достаточно квадратиков на тетрадке с калькулятором (что бы не сфейлится)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от Assembler

если размеры их равны, то и там и там я должен идти или с шагом в 4байта или с шагом в 8байт.

int** у тебя лежит в регистре, размер которого 64 бита.

int* у тебя лежит в регистре, размер которого 64 бита. Попадает он туда из памяти по инструкции movq, которая перемещает 64 бита. Правда, у тебя в посте просто «mov», но если я правильно помню синтаксис AT&T, это либо опечатка, либо ассемблер сам догадывается, что должно быть movq.

Поэтому размеры их равны, оба занимают 64 бита.

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

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

В регистре %rbx лежит адрес массива из трёх int'ов, каждый из которых больше ноля. В регистре %rax лежит ноль. Я хочу, чтобы первый int из массива, адрес которого лежит в %rbx, попал в %rax. Как мне это сделать? Варианты ответа:

а) movq (%rbx), %rax
б) movl (%rbx), %eax

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)
Ответ на: комментарий от LINUX-ORG-RU

Только о себе и думаешь, а о программистах не подумал, а они из-за тебя на улице окажутся, ЭГОИСТ!

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

Каждый из них когда то сидел и так же тупил. Рудигер Гамм в своё время не мог сложить в уме 37 + 325, но потом устроил своему мозгу Садом и Гоморру в течении нескольких лет и стал самым способным к сложным арифметическим вычислениям в уме (известным)человеком в мире.

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

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Это никак не оправдывает того, что программисты уже одно дорогой на улице, кто-то из них возможно не сможет приспособиться к другой жизни и умрет, понимаешь ли ты какой механизм ты запускаешь этими ответами?!

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

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

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

вобще и то и то правильно.

конечно же компилятор сам понимает что надо movq , в этом ему помогает регистр крайний-правый, размероность которого 64

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

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

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

facepalm

дизертир LongLiveUbuntu, вернитесь в часть

иначе вас ждет трибунал и расстрел

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

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

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

Он вас благодарит.

В контакте в группе всем рассказывает, какой ЛОР замечательный, и какие тут всезнающие люди.

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

Как только перестанешь думать, что размер указателя равен 8 или 4 байта, а станешь думать, что равен он sizeof(int *), все сразу станет на свои места

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

и то и то правильно
и movq (%rbx), %rax и movl (%rbx), %eax

Да ну? Совершенно пофиг, перемещать ли 8 байт или 4?

Слушай, у тебя, по-моему, более серьёзные проблемы с пониманием, что происходит.

Следующий код напечатает полное значение %rax (в шестнадцатеричном виде) после первого и после второго вариантов:

#include <stdio.h>

__attribute__((naked)) long method1(int* P) {
        /*
           __attribute__((naked)) запрещает генерировать
           «лишний» код на входе в функцию и выходе из неё.

          По конвенции System V ABI:
           - rdi = P,
           - возвращаемое значение ожидается в rax.
        */
        __asm__(
                "movq (%rdi), %rax\n"
                "ret"
        );
}

__attribute__((naked)) long method2(int* P) {
        __asm__(
                "movl (%rdi), %eax\n"
                "ret"
        );
}

int main() {
        int my_array[] = {1, 2, 3};
        printf("%lX\n", method1(my_array));
        printf("%lX\n", method2(my_array));
}
Он выдаёт:
200000001
1
Понимаешь, почему?

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

Зря вы так нападаете на него. По-моему вы тоже недоганяете. Или вы этого как и того, под бан хотите подвести?

[code]

mov %rdi, rbx%; пишу из примера выше. Криво чтобы было вам лучше понятно. mov $1, %rax lea 0(,%rax, 4), %rax; что будет ошибка? Нет, не будет. movl (% rax, %rbx), %eax;

[/code]

Что щас будет лежать в rax и в eax? Я скажу сразу, что одно и тоже.

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

Напишу еще


mov %rdi, rbx%; пишу из примера выше. Криво чтобы было вам лучше понятно. 

mov $1, %rax lea 0(,%rax, 4), %rax; что будет ошибка? Нет, не будет. 

movl (% rax, %rbx), %eax;


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

mov %rdi, rbx%; пишу из примера выше. Криво чтобы было вам лучше понятно.

mov $1, %rax

lea 0(,%rax, 4), %rax; что будет ошибка? Нет, не будет. 

movl (% rax, %rbx), %eax; ты сам то понимаешь? Что тут?

Будет лежать, одно и тоже.

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

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

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

это очень интересно. спасибо что не оскорбляете, а пытаетесь объяснить. от анонимусов это редкость.

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

Пусть служит, почему другие должны за него это делать?

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

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

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

Что такое адресная функция? Напиши адресную функцию для адресации массива целых чисел (array of integer) для платформы AMD64.

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

Он уже разобрался. В vk в группе скинул решение с массивом.

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

Он вас всех поблагодарил и тему как решенную.

И группа в vk вам также благодарна. Для многих это было интересно. Кто-то впервые услышал об ассемблер.

Или этого мало вам?

anonymous
()

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

на 64-битной машине он очевидно, размером в 64 бит

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

поди и автотулз используешь?

в реальности - можно считать что именно так и есть.

я видел недавно какой-то дремучий компилятор под AVR, дак там и то, при 16 битной архитектуре, инт равен 32, а char 8 битам.

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

поди и автотулз используешь?

Да.

я видел недавно какой-то дремучий компилятор под AVR, дак там и то, при 16 битной архитектуре,

У AVR 8-битная архитектура

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