理解c語言helloworld

從helloworld開始

下面的代碼是最簡單的c語言程序,我們編譯成彙編語言看看發生了什麼事情。

#include<stdio.h>

int main(){
	printf("helloworld");
	return 0;
}
	.file	"a.c"
	.def	___main;	.scl	2;	.type	32;	.endef
	.section .rdata,"dr"
LC0:
	.ascii "helloworld\0"
	.text
.globl _main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$8, %esp
	andl	$-16, %esp
	movl	$0, %eax
	addl	$15, %eax
	addl	$15, %eax
	shrl	$4, %eax
	sall	$4, %eax
	movl	%eax, -4(%ebp)
	movl	-4(%ebp), %eax
	call	__alloca
	call	___main
	movl	$LC0, (%esp)
	call	_printf
	movl	$0, %eax
	leave
	ret
	.def	_printf;	.scl	3;	.type	32;	.endef

雖然彙編語言比較難理解了,但是我們還能看到字符串和函數名等不變的東西。而且我們沒有看到關於頭文件stdio.h的任何信息,事實上不加#include<stdio.h>或者前面申明int printf(const char*)函數的原型也是可以的。由此我們知道了stdio.h也一定只是包含申明函數的東西。
有的人可能發現我的printf申明不對,事實上c語言編譯器只進行簡單的檢查,申明成int printf()也是可以的,這種聲明表示printf接受的參數是不確定的,而不是不接受參數,這與int printf(void)是不同的。
在彙編語言中我們再也看不到printf返回值是什麼,需要傳遞什麼樣的參數了。在編譯後生成的目標文件中只存在標號這樣的東西,因此我們甚至可以欺騙編譯器讓它認爲printf是一個整數。
那麼printf是誰實現的呢,printf是包含在c語言標準庫中的,你在libstdc.so中找到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章