#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 байта пространства стека.