Параметр, передаваемый функции на 32-разрядном языке ассемблера ARM

#c #assembly #arm #calling-convention

#c #собрание #рука #призвание-конвенция

Вопрос:

При вызове функции void foo (int *x) { … } из 32-разрядной сборки ARM параметр, передаваемый функции foo, должен находиться в r0, где r0 содержит целое число со знаком или адрес целого числа?

Комментарии:

1. Если аргумент функции объявлен указателем, то значение в r0 должно интерпретироваться как указатель, да. Либо адрес целого числа (или массива целых чисел), либо 0 для нулевого указателя. Вы должны прочитать документацию foo , чтобы узнать, что она ожидает от памяти, адрес которой вы передаете.

2. Прототип int *x указывает, что r0 должен содержать адрес 32-разрядного целого числа со знаком, если в этом был вопрос. int * для адреса, int для ценности.

3. Это зависит от конкретного компилятора ABI и C. Я не думаю, что существует согласованный ABI для всех частей РУКИ.

4. @Lundin: Конечно, но где бы он ни передавался, это указатель, а не само целое число. (И многие действительно передают первое целое число/указатель .) r0 Некоторые соглашения о вызовах добавляют косвенность (например, передача структуры в качестве указателя на память, выделенную вызывающим, вместо значений), но они не могут удалить ее без нарушения программ! И нет никаких оснований для какого-либо соглашения о вызовах добавлять уровень косвенности для int* arg, который помещается в регистр или в 4 байта пространства стека.