㈠ 关于c语言中的连接符的问题,请高手 指教
教你如何装XP系统
第一步,设置光启:
所谓光启,意思就是计算机在启动的时候首先读光驱,这样的话如果光驱中有具有光启功能的光盘就可以赶在硬盘启动之前读取出来(比如从光盘安装系统的时候)。
设置方法:
1.启动计算机,并按住DEL键不放,直到出现BIOS设置窗口(通常为蓝色背景,黄色英文字)。
2.选择并进入第二项,“BIOS SETUP”(BIOS设置)。在里面找到包含BOOT文字的项或组,并找到依次排列的“FIRST”“SECEND”“THIRD”三项,分别代表“第一项启动”“第二项启动”和“第三项启动”。这里我们按顺序依次设置为“光驱”“软驱”“硬盘”即可。(如在这一页没有见到这三项E文,通常BOOT右边的选项菜单为“SETUP”,这时按回车进入即可看到了)应该选择“FIRST”敲回车键,在出来的子菜单选择CD-ROM。再按回车键
3.选择好启动方式后,按F10键,出现E文对话框,按“Y”键(可省略),并回车,计算机自动重启,证明更改的设置生效了。
第二步,从光盘安装XP系统
在重启之前放入XP安装光盘,在看到屏幕底部出现CD字样的时候,按回车键。才能实现光启,否则计算机开始读取硬盘,也就是跳过光启从硬盘启动了。
XP系统盘光启之后便是蓝色背景的安装界面,这时系统会自动分析计算机信息,不需要任何操作,直到显示器屏幕变黑一下,随后出现蓝色背景的中文界面。
这时首先出现的是XP系统的协议,按F8键(代表同意此协议),之后可以见到硬盘所有分区的信息列表,并且有中文的操作说明。选择C盘,按D键删除分区(之前记得先将C盘的有用文件做好备份),C盘的位置变成“未分区”,再在原C盘位置(即“未分区”位置)按C键创建分区,分区大小不需要调整。之后原C盘位置变成了“新的未使用”字样,按回车键继续。
接下来有可能出现格式化分区选项页面,推荐选择“用FAT32格式化分区(快)”。按回车键继续。
系统开始格式化C盘,速度很快。格式化之后是分析硬盘和以前的WINDOWS操作系统,速度同样很快,随后是复制文件,大约需要8到13分钟不等(根据机器的配置决定)。
复制文件完成(100%)后,系统会自动重新启动,这时当再次见到CD-ROM.....的时候,不需要按任何键,让系统从硬盘启动,因为安装文件的一部分已经复制到硬盘里了(注:此时光盘不可以取出)。
出现蓝色背景的彩色XP安装界面,左侧有安装进度条和剩余时间显示,起始值为39分钟,也是根据机器的配置决定,通常P4,2.4的机器的安装时间大约是15到20分钟。
此时直到安装结束,计算机自动重启之前,除了输入序列号和计算机信息(随意填写),以及敲2到3次回车之外,不需要做任何其它操作。系统会自动完成安装。
第三步,驱动的安装
1.重启之后,将光盘取出,让计算机从硬盘启动,进入XP的设置窗口。
2.依次按“下一步”,“跳过”,选择“不注册”,“完成”。
3.进入XP系统桌面。
4.在桌面上单击鼠标右键,选择“属性”,选择“显示”选项卡,点击“自定义桌面”项,勾选“我的电脑”,选择“确定”退出。
5.返回桌面,右键单击“我的电脑”,选择“属性”,选择“硬件”选项卡,选择“设备管理器”,里面是计算机所有硬件的管理窗口,此中所有前面出现黄色问号+叹号的选项代表未安装驱动程序的硬件,双击打开其属性,选择“重新安装驱动程序”,放入相应当驱动光盘,选择“自动安装”,系统会自动识别对应当驱动程序并安装完成。(AUDIO为声卡,VGA为显卡,SM为主板,需要首先安装主板驱动,如没有SM项则代表不用安装)。安装好所有驱动之后重新启动计算机。至此驱动程序安装完成。
1、找一张带光盘启动的 WIN 2000的光盘,然后在准备一张XP的安装盘!
2、现在电脑里下载好冲击波和震荡波病毒的免疫补丁,并保存在除C区外的分区里,比如D E都可以
3、重启电脑,插入WIN2000光盘 ,当电脑重启后,一直狂点DEL键,进如BIOS,选择“Advavced BIOS Features”,进去后,有3个要特别需要设置的,把“First Boot Device”后边的设置为CDROM,把“Second Boot Device”后边的设置为HDD-0或者HDD-1,把“Third Boot Device”后边的设置为FLOPPY,然后按一下键盘左上角的ESC键,再按一下F10键,再一次按Y,意思就是保存设置并退出BIOS
4、电脑保存上一部BIOS设置后会自动重启,然后会出现3个选项(有的不出现),此时进入纯DOS
5、现在我不知道你的分区是多少个,光驱又是什么符盘,假设你的硬盘是CDEF,光驱是G,现在输入“H:”回车,打“dir”,这是读盘命令,应该会出现很多,其中有一个“format”,此时你打“format c: /q”回车,“Y”回车~~~~开始格式化你的C盘!(输入H:那里依次类推,假如你光驱是H,那就输I:)
6、格式化完后,它要求输入卷标,其实就是叫你给你已经格式化的C盘取一个名字,此时只需要按回车即可
7、插入WINXP的盘,CTRL+ALT+DEL重启电脑,此时一直按回车,然后WIN XP会自动安装了,如果是自启动的XP光盘就需要选“安装XP”得选项了,然后你一直跟着提示走吧~~~~~~安好后,BIOS里的设置不需要改动,我告诉你的设置是最佳状态。
40》怎样重装XP系统?
一、准备工作:
1.准备好Windows 2000简体中文版安装光盘,并检查光驱是否支持自启动。
2.可能的情况下,在运行安装程序前用磁盘扫描程序扫描所有硬盘检查硬盘错误并进行修复,否则安装程序运行时如检查到有硬盘错误即会很麻烦。
3.用纸张记录安装文件的产品密匙(安装序列号)。
4.可能的情况下,用驱动程序备份工具(如:驱动精灵 2004 V1.9 Beta.exe)将原Windows XP下的所有驱动程序备份到硬盘上(如∶F:\Drive)。最好能记下主板、网卡、显卡等主要硬件的型号及生产厂家,预先下载驱动程序备用。
5.如果你想在安装过程中格式化C盘或D盘(建议安装过程中格式化C盘),请备份C盘或D盘有用的数据。
二、用光盘启动系统:
(如果你已经知道方法请转到下一步),重新启动系统并把光驱设为第一启动盘,保存设置并重启。将XP安装光盘放入光驱,重新启动电脑。刚启动时,当出现如下图所示时快速按下回车键,否则不能启动XP系统光盘安装。如果你不知道具体做法请参考与这相同的-->如何进入纯DOS系统:
三、安装Windows 2000光盘自启动后,如无意外即可见到安装界面 ,全中文提示,“要现在安装Windows XP,请按ENTER”,按回车键后,许可协议,这里没有选择的余地,按“F8”这里用“向下或向上”方向键选择安装系统所用的分区,如果你已格式化C盘请选择C分区,选择好分区后按“Enter”键回车,这里对所选分区可以进行格式化,从而转换文件系统格,或保存现有文件系统,有多种选择的余地,但要注意的是NTFS格式可节约磁盘空间提高安全性和减小磁盘碎片但同时存在很多问题OS和98/Me下看不到NTFS格式的分区,在这里选“用FAT文件系统格式化磁盘分区(快),按“Enter”键回车,格式化C盘的警告,按F键将准备格式化c盘,由于所选分区C的空间大于2048M(即2G),FAT文件系统不支持大于2048M的磁盘分区,所以安装程序会用FAT32文件系统格式对C盘进行格式化,按“Enter”键回车,
正在格式化C分区;只有用光盘启动或安装启动软盘 启动XP安装程序,才能在安装过程中提供格式化分区选项;如果用MS-DOS启动盘启动进入DOS下,运行i386\winnt进行安装XP时,安装XP时没有格式化分区选项。格式化C分区完成后,
开始复制文件,文件复制完后,安装程序开始初始化Windows配置。然后系统将会自动在15秒后重新启动。重新启动后,过5分钟后,当提示还需33分钟时将
区域和语言设置选用默认值就可以了,直接点“下一步”按钮,
这里输入你想好的姓名和单位,这里的姓名是你以后注册的用户名,点“下一步”按钮,
如果你没有预先记下产品密钥(安装序列号)就大件事啦!这里输入安装序列号,点“下一步”按钮,出安装程序自动为你创建又长又难看的计算机名称,自己可任意更改,输入两次系统管理员密码,请记住这个密码,Administrator系统管理员在系统中具有最高权限,平时登陆系统不需要这个帐号。接着点“下一步”日期和时间设置不用讲,选北京时间,点“下一步”开始安装,复制系统文件、安装网络系统,
让你选择网络安装所用的方式,选典型设置点“下一步”点“下一步”
继续安装,到这里后就不用你参与了,安装程序会自动完成全过程。安装完成后自动重新启动,出现启动画面,第一次启动需要较长时间,请耐心等候,接下来是欢迎使用画面,提示设置系统,
点击右下角的“下一步”按钮,出现设置上网连接画面,这里建立的宽带拨号连接,不会在桌面上建立拨号连接快捷方式,且默认的拨号连接名称为“我的ISP”(自定义除外);进入桌面后通过连接向导建立的宽带拨号连接,在桌面上会建立拨号连接快捷方式,且默认的拨号连接名称为“宽带连接”(自定义除外)。如果你不想在这里建立宽带拨号连接,请点击“跳过”按钮。
在这里我先创建一个宽带连接,选第一项“数字用户线(ADSL)或电缆调制解调器”,点击“下一步”按钮,
目前使用的电信或联通(ADSL)住宅用户都有帐号和密码的,所以我选“是,我使用用户名和密码连接”,点击“下一步”按钮,输入电信或联通提供的帐号和密码,在“你的ISP的服务名”处输入你喜欢的名称,该名称作为拨号连接快捷菜单的名称,如果留空系统会自动创建名为“我的ISP”作为该连接的名称,点击“下一步”按钮,已经建立了拨号连接,微软当然想你现在就激活XP啦,不过即使不激活也有30天的试用期,又何必急呢?选择“否,请等候几天提醒我”,点击“下一步”按钮,
输入一个你平时用来登陆计算机的用户名,点下一步
点击完成,就结束安装。系统将注销并重新以新用户身份登陆。登陆桌面后如下图27
看到了蓝天白云的画面,你就知道是什么回事。可是桌面上就只有回收站一个图标。想找回常见的图标请看下面。
六、找回常见的图标
在桌面上点开始-->连接到-->宽带连接,
左键点“宽带连接”不放手,将其拖到桌面空白处,可见到桌面上多了一个“宽带连接”快捷方式。
然后,右键在桌面空白处点击,在弹出的菜单中选“属性”,即打开显示“属性窗口”
单击“桌面”选项卡,
在左下部点击“自定义桌面”按钮,
在上部,将“我的文档”、“我的电脑”、“网上邻居”和“Internet Explorer”四个项目前面的空格上打钩,然后点“确定”,再“确定”,你将会看到桌面上多了你想要的图标。
有关其它方面的功能的设置方法请参考-->功能设置 --->点击这里查看XP全面优化指南
你按照以下步骤试试:
1.如果你的电脑现在是光盘启动,那这一项可以跳过了:在开机时候,第一个画面,检测硬件设备时候,按下del键,进入coms设置,如果是Award的bios选第二项,找到一个叫做 first boot device 的选项,按pagedown或pageup键,或者加减号键,来选择,找到CDROM选项,然后按ESC,按下f10键,保存你的更改,重新启动。如果你不是Award bios那就另说了。如果是AMI bios,进入bios之后按右方向键,第四项,然后选择同样的类似first boot device 的选项,然后按F10保存更改退出。
2 将系统安装盘放入光驱,出现:press anykey to boot from CDROM……按任意键,进入安装界面!
3 选择你要安装的分区。如果你是新硬盘没有分区,你可以创建分区了,如果你有分区,选择任意一个分区都可以,当然最好是选择C盘,这时候选择enter吧,安装全新的操作系统,然后选择格式化这个分区!这时候注意,windows2000以上都要至少安装在超过2G的分区啊!还要确保你的分区是完好的。
4。格式化分区。(如果你要保留你的文件的话,选择保持文件系统无变化好了!希望你能保持良好的习惯,自己的文件不要存在系统盘下,不要用windows提供的我的文档我的图片收藏之类,因为等你要重装系统时候会很麻烦。不幸如果你已经有文件在那里,你最好先把他们移到别的分区里,因为装系统补用把所以分区都格式化的,放到别的分区就放心了!)这一步安装过程会有提示,如果使用windows2000以上系统,如xp或2003,建议你选择用ntfs格式格式化硬盘!
5,安装过程暂时可以不用你管了,等待就可以了。它在复制文件哦!
6。重启了,还会出现:press anykey to boot from CDROM……这时候不要在按任意键了啊,否则你要重复一次了。呵呵
7,进入windows环境的安装部分了。
8,按提示输入你的信息,如:安装序列号,地域和语音,是否设置网络组等。
9,重启了,快进入你熟悉的windows了,设置用户。。(只有xp才有这个选项。)激活系统。
10。ok,系统装完了,该装驱动了,建议安装顺序如下:主板驱动(虽然不装xp也能工作)-- 显卡---声卡---其他(这都要看你是不是主板集成了声卡显卡啊)如果你的驱动都不是自启动光盘,没关系,xp启动时候会告诉你发现新硬件了,安装时候选择让它自己搜索,在搜索中包括光盘位置(或者你知道驱动在那个文件夹存着),就可以安装了。或者你到设备管理器找到那些还是问号的硬件,一个个安装驱动程序吧。
11.恭喜!安装完成了。
祝你好运!
㈡ 求一个数是几位数的C语言程序
inta;
scanf("%d",&a);
intsum=0;//a的位数
if(!a)
sum=1;//0的位数是1
while(a){
a/=10;
++sum;
}
printf("%d",sum);
㈢ C语言中的几个小问题
rectype是你定义的什么类型啊,没有这个关键字,你也没定义是不合法的,
void bubble_sort (r) 这个r要定义一下,是什么类型的,然后你的rectype r[];
不能放在void bubble_sort (r)的后面呀,而且也没有括号包着,不行啊~~~看你定义的像一个全局数组,那么要放在最前面就好了~~
㈣ 如何C语言与汇编混编
c语言可以嵌套汇编:
按照TC2.0的帮助系统所以说的,在TC2.0下是可以用汇编的,方法是使用asm关键字:其格式是:
asm opcode <operands> <;newline>,如同别的注释一样,<>之间的表示可选的;例如:
main()
{
char *c="hello,world/n/r$";
asm mov ah,9;asm mov dx,c;asm int 33;
printf("You sucessed!/n");
}
或者是:
main()
{
char *c="hello,world/n/r$";
asm mov ah,9
asm mov dx,c
asm int 33
printf("You sucessed!");
}
两种格式其实是一种.如果你用的是第一种的样式,记住:
每一句汇编语句都要以asm开头,如果一行内有多个句子,
那么千万不要忘记在两个句子之间的这个semicolon(分号),
但是最后一句汇编后面(如果后面没有其它的语句)的分号可有可无,象第一个例子中的
asm int 33;后面的分号就可以不要,因为它的后面没有其它
的语句了.但如果是这样:
asm mov ah,9; asm mov dx,c;asm int 33; printf("You sucessed!");
那么asm int 33;后面的分号便还是留下好,以免出现编译错误!
在这一点上颇象C语言.
还有一种格式是
asm{ assembly language statement},这种格式应该被普遍的欢迎.
它们的例子如下(其中的语句排列格式与上面两种相同):
asm{
mov ax,var1
add ax,var2
......
}
但是要注意这种格式TC2.0是不支持的!
只有后来的TC++3.0及后来的IDE支持!
工具的使用:
一旦你的C源文件里包括了这些好东西,则必须用TCC.EXE的COMMAND-LINE来编译,具体的命令参数TCC.EXE已经提供,这里不复阐述了.最简单的是:TCC C源文件名(使用这个方法,TCC会自动调用TASM.EXE和TLINK.EXE,并且能够使TLINK.EXE正确的找到需要的.obj和.lib文件,如果你单步编译的话,可能会碰到很多的问题,主要是TLINK.EXE它自己并不会去找.obj和.lib文件,你自己可以建一个.bat文件,如果要指定.lib文件的目录的话可以用/L参数,在文章的后面有一个例子).但大家要注意了,看一下你的TC目录下面到底是否有TASM.EXE文件,并在TURBOC.CFG(这个文件包括TCC.EXE运行期参数,这里面所有参数在运很期都将被自动TCC.EXE使用,例如:-IH:/TC/INCLUDE/
-LH:/TC/LIB/)文件中设置好一些参数,并确认TASM.EXE的版本号要2.0以上,以及是否能够向下兼容.但是在大多数的情况下TC的目录是没有TASM.EXE的,或是版本不正常.
如果你有TASM.EXE文件并且TURBOC.CFG文件也已经写好了,但是还要注意一个
问题:运行TCC.EXE时要在独立的DOS SHELL下面(不要害怕,这不是一个新东西,我的意思
是,不在诸如TC下的DOS SHELL下面运行,我曾经败在这个问题下,当我发现时直想揍电脑
一顿,还好没有,不然就没有这篇文件了.)
还有一句重要的话:TC2.0支持大部分8086指令(当然用法有一些约定,不过现在我并不打算
进行详细说明,因为那是一件很繁杂的事,以后有时间或许会写出来----如果大家需要的话).
如果说上面我所说的那些约定很繁杂的话,那么下面的方法该是多么简单啊!
让我们使用Borland为TC2.0内建的变量来进行伪汇编.
或许你还不知道在TC2.0中还有一些内建的pseudo寄存器(可以看作是register 型的变量,但是它们比register型的变量好用的多)
_AX,_AH,_AL,
_BX,_BH,_BL,
_CX,_CH,_CL,
_DX,_DH,_DL,
_DI,_SI,_SP,
_CS,_DS,_ES,_SS
注意这些寄存器的size,_AX,_BX,_CX,_DX,_CS,_DS,_ES,_SS,_SI,_DI,_SP等都是16位的寄存器相当于C语言的unsigned int类型,其余的都是8位的寄存器(相当于unsigned char)(TC怎么可能支持32位的寄存呢,所以EAX等是不能用的,FS,GS和IP寄存器都是无效的),还有就是在传递参数的时候千万不要忘记使用强制类型转换.
中断调用指令是:__int__(interrupt_#)(注意int的前辍和后辍都是两个underscores)
For example:
#include<dos.h>
unsigned int _stklen=0x200;
unsigned int _heaplen=0;
main()
{
_DX=(unsigned int)"Hello,world./r/n$";
_AX=0x900;
__int__(0x21);
}
dos.h它是包含__int__()内建中断调用语句的头文件,因此是不可
缺少的._stklen和_heaplen是定义运行期堆栈和堆大小的两个内部
引用变量(这是个我自己想的名词,意指如果这两个变量在源文件中
显式的声明了,那么编译程序会自会引用来构造编译时期的信息以产生
用户希望的目标文件,如果不显式的声明则编译程序自动确定).
这两个变量也有一些约定,如果_stklen不显式声明,_heaplen赋值为零
都表示栈和堆都是defult的.
最后在TC2.0中还有一个没有说明的标志位寄存器flags,它也是内建
pseudo寄存器是:_FLAGS,是一个16位寄存器.这些内建的寄存器都可以进行
运算,但是要注意它们所代表的类型(必要时进行类型转换);
看起来这是不是一种好的办法啊(而且使用这种方法只要用个一个dos.h头文件就好,
不需要用TCC编译,可以直接在TC20的IDE下编译).
TC2.0中也提供了一些简单好用的函数来实现对DOS功能的调用如:
int86(...),int86x(...)(但是这些方法实际仍然要调用函数,所以不如使用
伪寄存器,又因为要牵涉到union REGS结构的内存分配所以系统的开销是增大了,
而使用伪寄存器是最简洁的),端口通信函数如:inportb(...),inport(...),
outportb(...),outport(...),指针转换函数:FP_OFF,FP_SEG,MK_FP,这些函数在
帮助系统中都有,有用时大家可以查阅.
tlinkbat.bat的例子:
rem The lib environment variable is the directory of the .obj and .lib file
set lib=h:/tc/lib/
rem 这下面的句子中的c0s(C 零S)是一个.OBJ文件,是一个C程序的STARTUP文件
tlink %lib%c0s %1,%1,%1,/L%lib%emu.lib %lib%maths.lib %lib%cs.lib
set lib=
(使用时可将以rem开头的句子删除)
___________________________________________________
一些约定:
我们先说一下在TC20下写汇编(内联汇编--自己起的名字,大家可以想叫什么叫什么)时的编译器的编译原则:
1.所有在main()函数外的的汇编语言的语句都作为数据声明语句处理,也即在编译器编译时会将它放在数据段中,如:
asm string1 db "Hello",,,'world!',0ah,0xd,"$"
main()
{
asm mov dx,offset string1
asm mov ah,9
asm int 33
asm mov dx,offset string2
asm int 33
}
asm string2 db "the string can be declared after the main() function!$"
象这些样子在main()外面的汇编语言的数据定义语句(事实上不管是什么汇编语句,
只要是在main()之外,包括这个句子:asm mov ax,0x4c00),在编译后都放在数据段中,而C语言的数据声明语句仍按C的规则!
2.所有在main()函内的汇编语言的语句在编译后都放在代码段中,包括这个句子:
asm string2 db "the string can be declared after the main() function!$"
3.不要在以asm 开头的语句中使用C语言的关键字,这会导致编译阶段的错误
那么,根据这三条大家会得到什么样的结论呢?(先闭上眼想一想,你可能会由此变的
很赞赏自己,是的你应该这样相信自己是对的!)
让我们一起看一下这个结论:
1.根据编译原则1得到:不可以在main()外面写汇编命令语句(不要笑,正是与C语言相同才值得注意!),在任何地方都不要进行任何的段定义和宏定义(这是因为编译后的形式决定的,也即:在TC20下所有的汇编格式的语句只能是,直接性的数据定义和语句指令)!
2根据编译原则2得到:不可以在main()之内使用汇编的语句进行数据定义(同样不要笑,
大多数人在第一次在TC20下写汇编都会有这样的错误的)
3.如同类强制类型这样的事是不可以在以asm开头的汇编语句中使用的
好了,天即朗,气瞬清!这样一说,一个大体的框架就出来了!只要遵守这个原则写,就可避免很多莫名其妙的错误出现!
通俗的说:
汇编语句的数据定义放在main()外面,指令放在main()里面.
如果你没有更好的文档,那么记住我的这些话!
一些细节的问题:
在以asm开头的内联汇编语句中是不支持C的转义字符的,但是用C语言声明一个字符数组(含有转义字符的),然后用int 33 ah=9这功能时输出这个字符串时,其中的转义字符是有效的(这主要是因为编译后其内部表示形式不同造成的,自己想想会有答案的).
内联汇编支持C的一些如数值表示,字符串声明格式等,
如:一个十六进制的数据可以用两种方式表示:0xa 和0ah,字符串可以是这样:
"Hello,world!$"(如同C)也可以这样'Hello,world!$'(用汇编自己的方式).
象C一样你同样要注意赋值的类型,而且要比C更严格(汇编从来不自己动手做
如同类型转换啊这样事),所以一切的事完全要你自己做好!而且你不要企图以C的形式
做这件事,如这样的格式 asm mov dx,(unsigned)a(a是一个这样的东西,
char a[ ]="hello,world!";),而且这样句子也会导致错误:asm mov dx,word ptr a(逻辑错误),不过这不是在编译时的错误,而是运行期的错误(具体的原因自己想一想,象word label这样的东西的运算作用和会导致的后果),你可以这样用一个句子做"中间人"如int i=(unsigned)a;asm mov dx,i(也千万不要用asm mov dx,(unsigned)a 这样的句子.但是,告诉大家一个好消息,你可以用指针指向一个字符串,然后你会惊讶你竟然可以这样:
char *p="hello,world";asm mov dx,p,然后用int 33 ah=9的功能输出这个字符串而不会有错误(这也表现出指针的特点,它是一个二字节的(TC20下)变量,含有的是一个地址,这与其指向的变量的类型是毫无关系的).
内汇汇编语句不支持->这个运算符.还有标号的问题,在最后的例子中你会年看到一些特别之处!
上面所说的只是很细小并微少的一些事(也是很常遇到的),尚有很多的细节要说,但由于本人时间有限不能一一列举,如C的结构在内联汇编的应用等大家可以按照其运行机理去想想一下用法;另外,由于这只是一件学习的事,所以还是大家自己学(找一下有关文档,当然现在已经没有什么比较完整的了),情况会好的多,我在对内联汇编的学习过程中领会到了不少的东西,例如编译原理方面的知识,以及如何做会使代码更高效,占空间最少等的方法.最后向大家推荐一种方法,在利用TCC的-S开关可以生成C源文件的汇编代码
(或许很多的人都用过)是很好的学习材料!祝大家学有所成!
Cstarter
02-11-17
/* 由于个人的时间和能力有限,难免有错误和不详细的地方,请大家见谅!
My Email:[email protected] [email protected] QQ:170594633 */
一些例子:
下面这个例子是对沈美明 温冬婵的
<<IBM-PC 汇编语言程序设计>>清华版第十一章程序的改写
可直接在命令行上键入 tcc filename 就可以,当然你要有TASM.EXE
/*
asm mus_frep dw 330,294,262,294,3 p(330)
asm dw 3 p(294),330,392,392
asm dw 330,294,262,294,4 p(330)
asm dw 294,294,330,294,262,-1
asm mus_time dw 6 p(25),50
asm dw 2 p (25,25,50)
asm dw 12 p(25),100
*/
asm mus_frep dw 330,392,330,294,330,392,330,294,330
asm dw 330,392,330,294,262,294,330,392,294
asm dw 262,262,220,196,196,220,262,294,330,262
asm dw -1
asm mus_time dw 3 p (50),25,25,50,25,25,100
asm dw 2 p (50,50,25,25),100
asm dw 3 p (50,25,25),100
main()
{
asm jmp start
/*设置发声的频率,这一段在沈美明 温冬婵的
<<IBM-PC 汇编语言程序设计>>清华版第十一章有详细的说明 */
sound:
asm mov al,0b6h
asm out 43h,al
asm mov dx,12h
asm mov ax,533h*896
asm div di
asm out 42h, al
asm mov al,ah
/* 这个延时是用来防止两次IO操作的最后一次操作的错误,
因为CPU比总线的速度快很多,所以 要延时等待第一次操作完成后再进行第二次操作*/
asm mov cx,1000
delay:
asm loop delay
asm out 42h,al
asm in al,61h
asm mov ah,al
asm or al,3
asm out 61h,al
/* 使用中断15H功能86H延时CX:DX=微秒数*/
asm mov ax,2710h
asm mul bx
asm mov cx,dx
asm mov dx,ax
asm mov ah,86h
asm int 15h /*可用__int__(0x15);代替*/
asm mov al,ah
asm out 61h,al
asm jmp add_count
/*------------------*/
start:
asm mov si,offset mus_frep
asm lea bp,mus_time
frep:
asm mov di,[si]
asm cmp di,-1
asm je end_mus
asm mov bx,[bp]
asm jmp sound
add_count: /*标号不能用汇编语言写*/
asm add si,2
asm add bp,2
asm jmp frep
end_mus:;
}
对于上面的程序大家可用伪寄存器的方法写一个,要容易的多!
/*一个发声程序!(引自<<PC技术内幕>>电力版--这个版不好,不如清华版的)*/
#include"dos.h"
main()
{
static union REGS ourregs;
outportb(0x43,0xb6);
outportb(0x42,0xee);
outportb(0x42,0);
outportb(0x61,(inportb(0x61)|0x03));
ourregs.h.ah=0x86;
ourregs.x.cx=0x001e;
ourregs.x.dx=0x8480;
int86(0x15,&ourregs,&ourregs);
outportb(0x61,(inportb(0x61)&0xfc));
}
㈤ C语言中,怎样判断一个数组中是否有重复元素呢最好用程序实现
import org.apache.commons.lang.ArrayUtils;
public boolean isDupInArray(Object[]array){
if(ArrayUtils.isEmpty(array)==true){
return false;
}
for(Object obj:array){
if(ArrayUtils.indexOf(array,obj)!=ArrayUtils.lastIndexOf(array,obj)){
return true;
}
}
return false;
}
(5)c语言程序里面有sm吗扩展阅读:
Return用法
1.含义:return表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,返回值可以是一个常量,变量,或是表达式。
2.作用:结束正在运行的函数,并返回函数值。
3.返回值:
计算结果表示函数执行的顺利与否(-1、0)
返回值可以为各种数据类型,如:int,float,double,char,a[](数
组),*a(指针),结构或类(c++)
返回类型规定了return后面所加的量的类型,如果返回类型声明为
void,则不需要返回值。public static void Main()//程序入口只可以声
明为void和int的返回
{
//不需要返回值就OK
}
public static void mm()
{
return;//有些时候,在void的方法中,你需要跳出它,可以直接
用return而不能加任何量在后面
}
public static int cc()
{
return 321;//因为返回类型声明为int,所以返回一个整数
}
public static string msmsm()
{
return“asdfhasjghdg”;//因为返回类型声明为string,所以返回一个字
符串
}
㈥ c语言编程:输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。
请输入十个元素:
5 4 3 2 1 0 9 8 7 6
0 4 3 2 1 5 6 8 7 9
Press any key to continue
#include"stdio.h"
void input(int number[10]); //此函数向首地址为number的数组输入10个元素
void max_min_value(int array[10]); //此函数交换array数组的对应元素
void output(int array[10]); //此函数输出array数组的10个元素
void input(int number[10])
{
int i;
printf("请输入十个元素:\n");
for (i=0;i<10;i++)
{
scanf("%d",&number[i]);
}
}
void max_min_value(int array[10])
{
int i,imin,imax,tmp,bg,sm;
imin = imax = array[0];
for (i=0;i<10;i++)
{
if (imax<array[i])
{
imax = array[i];
bg=i;
}
if (imin>array[i])
{
imin = array[i];
sm = i;
}
}
//最小换第一个
tmp=array[0];
array[0]=array[sm];
array[sm]=tmp;
//最大换第十个
tmp=array[9];
array[9]=array[bg];
array[bg]=tmp;
}
void output(int array[10])
{
int i;
for (i=0;i<10;i++)
{
printf("%d ",array[i]);
}
printf("\n");
}
main()
{
int number[10];
input(number);
max_min_value(number);
output(number);
return 0;
}
㈦ c语言中mod(m,n)是什么意思
mod是取余,在C语言中表达式为m % n,即m除以n的余数。在C语言程序里面没有这个关键字或封装函数,程序里面可以用%代替。