
#include <stdio.h>
int main(void)
{
printf("Hello, world!")
return 0
}
一、首先,打开我们的Visual C++ 6.0软件,我使用的为中文版,软件主界面如下图所示:
1、然后点击上图工具栏中的文件,里面有个新建菜单,然后我们可以设置一下我们的工作空间,如下图所示:
2、然后在一步步默认点击确定,完成即可,此时工作空间就建立起来了。
二、接下来,再点击工具栏下的文件,里面有个新建菜单,点击它,出现下图的对话框:
1、点击确定即可,创建出一个helloworld.c的小程序,然后我们就可以编写我们的Hello World小程序了。此时就需要我们的VC++ 6.0来编译此程序,编译无错误才运行此程序,编译按钮和运行按钮如下图的红色箭头处:
2、或者可以点击组建工具栏下的编译菜单项,然后再点击执行菜单项,也有快捷键,按Ctrl+F7编译此程序,按Ctrl+F5运行此程序。编译无错误的话,点击运行按钮后如下图所示:
扩展资料:
C语言的基本构成:
1、数据类型。C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。
2、常量与变量。常量其值不可改变,符号常量名通常用大写。变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名。变量在编译时为其分配相应存储单元。
3、数组。如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NULL作为数组的结束。要特别注意的是,方括内的索引值是从0算起的。
4、指针。
(1)、如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同。C语言中另有 双目运算符 *) 则是取内容 *** 作符,意思是取这个内存地址里存储的内容。指铅陪岁针是 C 语言区别于其他同时代高级语言的主要特征之一
(2)、指针不仅可以是变量的地址,还可以是数组、数组元素、函数的地址。通过指针作为形式参数可以在函数的调用过程得到一个以上的返回值,不同于return(z)这样的仅能得到一个返回值。
(3)指针是一把双刃剑,许多 *** 作可以通过指针自然的表达,但是不正确的或者过分的使用指针又会给程序带来大量潜在的错误。
5、字符串。C语言的字符串其实就是以'\0'字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行 *** 作的函数。它们不同于字符数组。使用这些函数需要引用头文件<string.h>。
6、文件输入/输出在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI C中,这些函数被定义在头文件<stdio.h>;中。
参考资料:百度百科乱冲:C语言
点击查看全文
java工程师,,学编程需要什么基础?
学编程需要什么基础?-就到北大青鸟佳音校区计算机学校软件编程实训基地,,全新教学模式
本月1562人已咨询相关问题
立即咨询
北京佳音旗舰科技发展有限公司广告
衡水 学电脑编程培训到北大青鸟 高薪就业!
电脑编程培训专业电脑编程培训20余,全程项目实践 负责就业 小班授槐睁课北大青鸟电脑编程培训带你走上电脑编程培训朝阳行业,高薪就业
金领园科技(北京)有限公司广告
大家还在搜
成都月子中心价格
做双眼皮术多少钱
做一次毛囊检测多少钱
钻戒回收
初级会计证报名时间
都市丽人内衣加盟
手游sf平台
沈阳搬家
Program Name: Hello.ASMHello SEGMENT 以“Hello”命名段
ASSUME CS:Hello,DS:Hello 代码段和配信或数据段在同一个段空间
ORG 100H 指令从培伍100H开始
Start: 程序运行起始位置
MOV AX,3 设置视频显示方式为文本显示,80x25,16色
INT 10H 调用视频中断
LEA DX,Prompt_Str 装入字符串地址
MOV AH,9 控制台输出字符串
INT 21H dos功能调用
MOV AX,4C00H 结束程序
INT 21H dos功能调用
Prompt_Str DB 'Hello World!$' 要显坦竖示的字符串一定要以符号$作为结束符号
Hello ENDS 段结束
END Start 源程序代码结束
您正在看的汇编语言是:hello,world!win32汇编小程序。首先我们看一个“复杂”的Win32汇编程序
程序用来显示一个消息框
--------------------------------------------------
文件名:3.asm
.386
.model flat ,stdcall
NULLequ 0
MB_OK equ 0
ExitProcess PROTO :Dword
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:Dword
includelib kernel32.lib
includelib user32.lib
.data
szTextdb "Hello, world!",0
szCaption db "Win32Asm",0
.code
start:
push MB_OK
lea eax,szCaption
push eax
lea eax,szText
push eax
push NULL
call messageboxa
xor eax,eax
push eax
call exitprocess
end start
--------------------------------------------------
编译链接:
分下面两步进行:
ml /c /coff 3.asm
link /subsystem:Windows /libpath:d:\masm7\lib 3.obj
第一步编译生成3.obj文件
/c 表示只编译,不链接
/coff 表示生成COFF格式的目标文件
第二步链接生成3.exe文件
/subsystem:windows 表示生成Windows文件
/libpath:d:\masm7\lib 表示引入库的路径为:d:\masm7\lib。
在安装Masm32后,引入库位于Masm32\Lib目录下。
也可设置环境变量Lib的值:在dos提示符下键入Set Lib=d:\masm7\lib,这样“链接”就可简单写成:
link /subsystem:Windows 3.obj,试想一下,在程序调试过程中,修改源程序是常用的事啦,每次编译链接都要带/libpath:...那该有多烦人呢。当然,我们也可在源程序中直接给出引入库的位置,这样,链接时就方便啦,如下:
includelib d:\masm7\lib\kernel32.lib
includelib d:\masm7\lib\user32.lib
--------------------------------------------------
执行:在dos提示符下键入3,回车,出现一个消息框,哈哈,真正的Win32程序!
--------------------------------------------------
深入分析:
看一下源程序,有这么两行:call messageboxa\call exitprocess。大家一看都知道,这是子程序调用,但是我们并没写这样的子程序,事实上,这些是API函数。作为函数,我们在调用时可能需要传送给函数一些参数,程序怎么知道传送的参数有哪些,类型是什么呢?就是通过函数原型定义,如下所示:
ExitProcess PROTO :Dword
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:Dword
可以看出,ExitProcess有一个参数,MessageBoxA有四个参数,这些参数都是Dword类型。
在Win32中,参数的传递都是通过堆栈来完成的。象MessageBoxA这个函数有四个参数,究竟是左边的先压入堆栈还是右边的先入栈呢?.model flat,stdcall给出了答案。stdcall 指定参数是从右到左压入堆栈的,且调整堆栈是在子程序返回时完成的。在源程序中不需要用“add sp,值”来保持堆栈平衡。对MessageBox,在API手册中是这样定义的:
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType&n
您正在看的汇编语言是:hello,world!win32汇编小程序。
bsp// style of message box
)
所以会有我们的程序段:
push MB_OK
lea eax,szCaption
push eax
lea eax,szText
push eax
push NULL
call messageboxa
看看上面的程序,不难想到,假如在写程序时,少往堆栈里压入一个数据,那将是一个致命的错误。能不能将这种检查参数个数是否匹配的工作交给计算机来完成呢?这是可以的,INVOKE指令可以帮助我们完成这样的工作。假如你的参数个数不正确,连接器将给出错误提示。所以,极力建议你使用invoke代替call来调用子程序,当然,这不是绝对的。使用invoke上面的指令就可简写成下面的样子,看起来简炼多啦,查错也方便啦!
invoke messageboxa, NULL,addr szText,addr szCaption,MB_OK
另外,像NULL,MB_OK都是一些常量,这样的常量有很多,还有很多的结构,如果在我们的程序中一开始都写这么多的东西,可能一下子就把你吓怕啦,也容易出错,更不便于看程序的主要部分。hutch整理的Windows.inc包含了WIN32编程所需要的常量和结构体的定义,我们可简单的用一个include指令将这些常量和结构的定义插入到我们的文件中:
include d:\masm32\include\Windows.inc
但是Windows.inc中并不包含函数原型的声明,还要从其他的头文件中得到函数原型的声明,比如:messageboxa的原型声明在user32.inc文件中,exitprocess在kernel32.inc文件中。这些头文件都放在 \masm32\include文件夹下。
还有,要用Windows.inc,必须使用option casemap:none,它的意思是告诉 MASM 要区分符号的大小写,譬如:start和START是不一样的。否则,一个小小的程序,可能会出成百上千的错误呀!
其他的,就不再细说啦,到此,上面的程序可重新修改如下:
-----------------------------------------------------------------
最终的结果
.386表示要用到386指令
.model flat,stdcall 32位程序,要用flat啦!stadcall,标准调用
option casemap:none 区别大小写
includeWindows.inc 包括常量及结构定义
includekernel32.inc 函数原型声明
includeuser32.inc
includelib kernel32.lib 用到的引入库
includelib user32.lib
.data数据区,定义2个字符串
szTextdb "Hello, world!",0
szCaption db "Win32Asm",0
.code 代码开始执行处
start:
invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK
调用MessageBoxAPI函数
invoke ExitProcess,NULL 程序退出
end start结束
------------------------------------
编译链接:
ml /c /coff /I d:\masm7\include 3.asm 注意开关符识别大小写
link /subsystem:Windows /libpath:d:\masm7\lib 3.obj
/I d:\masm7\include 表示*.inc文件的位置,也可设置环境变量Set include=d:\masm7\include来简化 *** 作,也可在程序中明确指出*.inc的位置。
前面讲的都是用两条指令来完成编译链接,实际上用一条指令也可完成,如下:
ml /coff /I d:\masm7\include 3.asm /link /subsystem:Windows /libpath:lib
若*.inc及引入库在源程序中都明确指出其位置,则可简化为:
ml /coff 3.asm /link /subsystem:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)