Подтвердить что ты не робот

В чем смысл _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;
}
4b9b3361

Ответ 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.