В чем смысл _AX = 1000 в следующей программе C?
Я начинающий на языке программирования C, в последнее время я начал изучать функции. Я изучил, что функции используют return для возврата значения в caller. Например, следующая программа.
int getVal(){
return 1000;
}
int main(){
int x = getVal();
printf("x = %d",x);
return 0;
}
напечатает x = 1000
но я смущен тем, что (в компиляторе turbo C 32 бит), почему следующая программа производит вывод как x = 1000. Пожалуйста, объясните.
int get_val(){
_AX = 1000;
}
int main(){
int x = get_val();
printf("x = %d",x);
return 0;
}
Ответы
Ответ 1
"Возвращаемое значение" возвращается в конкретном регистре (определенном "ABI", двоичным интерфейсом приложения, который описывает, как компиляторы должны генерировать свой код), в большинстве систем x86, это EAX (32 бит) или AX (16 бит) [не говорит, что _AX на самом деле не EAX внутри].
Этот компилятор, очевидно, поддерживает использование "register" напрямую, называя его _AX. Поэтому, загружая регистр [E] AX со значением, мы по существу возвращаем это значение.
Это определенно не будет работать ни в каком другом компиляторе, хотя встроенный ассемблер может добиться того же.
Ответ 2
В C здесь _AX является псевдорегистром. И когда вы делаете AX=1000
, это значение 1000
берется из Аккумулятора
Но он может работать не так, как ожидалось, в компиляторе GCC
Скомпилируйте и запустите следующую программу в Turbo C, вы получите 35 в качестве вывода. Он может не работать в других компиляторах.
#include<stdio.h>
int main()
{
int a = 0;
a = 35;
printf("%d");
return 0;
}
Предположим, адрес a = 1200.
Предположим, что адрес видеопамяти = 5500;
MOV AH, 35
MOV [1200], AH
MOV [5500], AH // prints on the screen.
Это способ исполнения. После копирования значения 35 в положение 1200, AH сохраняет значение 35.
Затем printf("%d")
пытается получить значение от AH и отправляет в видеопамять, чтобы отобразить его на экране.
Если мы используем printf("%d %d", age, salary)
, значение возраста передается в AH, прежде чем использовать это значение для отправки в видеопамять. Затем значение зарплаты переносится в AH, затем отправляется в видеопамять.
Предположим,
Адрес возраста = 1200;
Адрес оклада = 1202;
Адрес видеопамяти = XXXX; (Он будет изменен в соответствии с количеством символов, напечатанных на экране, не думайте об этом значении адреса)
MOV AH, [1200]
MOV [XXXX], AH
MOV AH, [1202]
MOV [XXXX], AH
Надеюсь, это поможет понять решение для данной программы.
Ответ 3
В соответствии с компилятором TC (32 бит) возвращаемое значение функции сохраняется в Аккумуляторе (AC), и к нему можно получить доступ в компиляторе TC с помощью _AX, поэтому, когда вы пишете:
_AX = 1000;
означает, что вы размещаете значение 1000 внутри накопителя, а когда функция завершает свое выполнение, а элемент управления достигает функции вызывающего, тогда проверяется значение Аккумулятора, и в этом случае это значение будет сохранено в x.
здесь утверждение
x = get_val();
будет просто
x = 1000;
но это будет только в вашем случае, значит, в (TC 32-битный Windows-компилятор), он может работать или не работать для других компиляторов.
Ответ 4
в getval(), 1000 хранится в аккумуляторе, и getval() даст время компиляции, чтобы функция возвращала значение, тогда в основном x будет назначено значение, возвращенное или сохраненное в аккумуляторе, которое равно 1000, поэтому он будет печатать x = 1000.