[2011-04-14 19:20] 研究试验5---函数如何接受不定数量的参数(4)
下面我们来写myprintf函数。
首先我们要知道一个知识点就是,函数的参数是通过栈传递的,我们的printf函数接收的参数格式和printf函数一样,为(“%d”,4).
这样的话,入栈的就是4,然后是194h(存放字符串的首地址)。
那么我们就可以找到字符串,对字符串进行处理,程序如下:
void myprintf(char *,...);
---声明我们的函数
main()
{
myprintf("%c %c %d dsd %s",'a','b',144,"hello world");
}
---主函数,其中参数要能打印144这样的类型,而且最后的...
首先我们要知道一个知识点就是,函数的参数是通过栈传递的,我们的printf函数接收的参数格式和printf函数一样,为(“%d”,4).
这样的话,入栈的就是4,然后是194h(存放字符串的首地址)。
那么我们就可以找到字符串,对字符串进行处理,程序如下:
void myprintf(char *,...);
---声明我们的函数
main()
{
myprintf("%c %c %d dsd %s",'a','b',144,"hello world");
}
---主函数,其中参数要能打印144这样的类型,而且最后的...
阅读全文 |
评论次数(0) |
浏览次数(561) |
所属类型(默认类型)
[2011-04-14 16:36] 研究试验5---函数如何接受不定数量的参数(3)
这里研究printf函数,先写一个程序c.c如下:
main()
{
printf("%d,%d,%c,%c",1,2,'a','b');
}
debug观察main处代码如下:
-u 01fa
153F:01FA 55 PUSH BP
153F:01FB 8BEC MOV BP,SP
153F:01FD B86200 MOV AX,0062---‘b’入栈
153F:0200 50 PUSH AX
153F:0201 B86100 MOV AX...
main()
{
printf("%d,%d,%c,%c",1,2,'a','b');
}
debug观察main处代码如下:
-u 01fa
153F:01FA 55 PUSH BP
153F:01FB 8BEC MOV BP,SP
153F:01FD B86200 MOV AX,0062---‘b’入栈
153F:0200 50 PUSH AX
153F:0201 B86100 MOV AX...
阅读全文 |
评论次数(0) |
浏览次数(511) |
所属类型(默认类型)
[2011-04-14 16:16] 研究试验5---函数如何接受不定数量的参数(2)
2.写一个程序b.c,分析b.c,深入理解相关的知识。
void showchar(int,int,...);
---申明一个函数,参数不定,第一个和第二个都是int型
main()
{
showchar(8,2,'a','b','c','d','e','f','g','h');
---调用前面声明的函数
}
void showchar(int n,int color,...)
{
int a;
for(a=0;a!=n;a++)
{
---第一个参数是数量n。
*(char far *)(0xb8000000+160*10+80...
void showchar(int,int,...);
---申明一个函数,参数不定,第一个和第二个都是int型
main()
{
showchar(8,2,'a','b','c','d','e','f','g','h');
---调用前面声明的函数
}
void showchar(int n,int color,...)
{
int a;
for(a=0;a!=n;a++)
{
---第一个参数是数量n。
*(char far *)(0xb8000000+160*10+80...
阅读全文 |
评论次数(0) |
浏览次数(556) |
所属类型(默认类型)
[2011-04-14 14:53] 研究试验5---函数如何接受不定数量的参数(1)
编写一个程序,如下:
void showchar(char a,int b);
main()
{
showchar('a',2);
}
void showchar(char a,int b)
{
*(char far *)(0xb8000000+160*10+80)=a;
*(char far *)(0xb8000000+160*10+81)=b;
}
用debug加载如下:
-u 1fa
153F:01FA 55 PUSH BP
153F:01FB 8BEC MOV BP,SP
---上面两句是ma...
void showchar(char a,int b);
main()
{
showchar('a',2);
}
void showchar(char a,int b)
{
*(char far *)(0xb8000000+160*10+80)=a;
*(char far *)(0xb8000000+160*10+81)=b;
}
用debug加载如下:
-u 1fa
153F:01FA 55 PUSH BP
153F:01FB 8BEC MOV BP,SP
---上面两句是ma...
阅读全文 |
评论次数(0) |
浏览次数(569) |
所属类型(默认类型)
[2011-04-13 20:02] 研究试验4---不用main函数编程
书上问的很详细,我们把这些问题全部回答完,也就基本掌握了这一节的知识。
1.编译连接不成功,思考以下问题,
(1)编译和连接哪个环节会出问题。
---连接阶段。
(2)显示出的错误信息是什么?
---undefined symbol ‘_main’ in module c0s.
翻译成汉语是:在c0s模块中没有定义符号‘_main’.
(3)这个错误信息可能与哪个文件有关?
---c0s。
2.用link.exe连接f.obj,生成f.exe,用debug观察,思考以下问题?
(1)f.exe程序代码总共有多少字节?
...
1.编译连接不成功,思考以下问题,
(1)编译和连接哪个环节会出问题。
---连接阶段。
(2)显示出的错误信息是什么?
---undefined symbol ‘_main’ in module c0s.
翻译成汉语是:在c0s模块中没有定义符号‘_main’.
(3)这个错误信息可能与哪个文件有关?
---c0s。
2.用link.exe连接f.obj,生成f.exe,用debug观察,思考以下问题?
(1)f.exe程序代码总共有多少字节?
...
阅读全文 |
评论次数(0) |
浏览次数(637) |
所属类型(默认类型)
[2011-04-13 18:19] 研究实验3---使用内存空间(2)
下面接着看第三个程序例子um3.exe:
-u 01fa
1540:01FA 55 PUSH BP
1540:01FB 8BEC MOV BP,SP
---这两句的作用是保护bp,同时把sp赋给bp,按照以往的经验,出现这种指令一般是要对栈中数据进行操作。
1540:01FD 83EC06 SUB SP,+06
---把sp往上提了6个字节,留了3个字的空间
1540:0200 C706A601A100 MOV WORD PTR [01A6],00A1
1540:0206 C706A801...
-u 01fa
1540:01FA 55 PUSH BP
1540:01FB 8BEC MOV BP,SP
---这两句的作用是保护bp,同时把sp赋给bp,按照以往的经验,出现这种指令一般是要对栈中数据进行操作。
1540:01FD 83EC06 SUB SP,+06
---把sp往上提了6个字节,留了3个字的空间
1540:0200 C706A601A100 MOV WORD PTR [01A6],00A1
1540:0206 C706A801...
阅读全文 |
评论次数(0) |
浏览次数(601) |
所属类型(默认类型)
[2011-04-13 16:08] 研究试验3---使用内存空间(1)
前面研究了使用寄存器来存储数据,但是寄存器只有十几个,所以这里我们学习使用内存空间,补充一句,变量的实质其实也是内存空间。
首先要知道,在书上第8章的时候,讲对数据的处理,要指导数据的两个基本属性,一是数据在什么地方,即数据的地址;二是数据有多长,也就是数据的数据类型。
对于寄存器,就需要给出寄存器的名称,寄存器的名称中也包含了它们的数据类型信息。
对于内存空间,就需要给出地址(准确的说,就是内存空间的首地址)和空间存储数据的类型。
接着还要知道‘*’操作符的内涵,就是表明数据是一个地址。书上给了例子,如
*(char *)0x200='a'
首先0x200...
首先要知道,在书上第8章的时候,讲对数据的处理,要指导数据的两个基本属性,一是数据在什么地方,即数据的地址;二是数据有多长,也就是数据的数据类型。
对于寄存器,就需要给出寄存器的名称,寄存器的名称中也包含了它们的数据类型信息。
对于内存空间,就需要给出地址(准确的说,就是内存空间的首地址)和空间存储数据的类型。
接着还要知道‘*’操作符的内涵,就是表明数据是一个地址。书上给了例子,如
*(char *)0x200='a'
首先0x200...
阅读全文 |
评论次数(0) |
浏览次数(541) |
所属类型(默认类型)
[2011-04-12 17:58] 研究试验2---使用寄存器
这一节我们讨论“C语言中变量是否必须的”。首先回忆汇编中是用什么来存储数据的,汇编中我们主要用寄存器和内存单元,最后17章的数据标号有点类似变量,但实质还是内存单元。
首先来看tc2.0提供的寄存器,这里注意这些寄存器是区分大小写的。
(1)编写程序ur1.c,编译连接,生成ur1.exe。
main()
{
_AX=1;
_BX=1;
_CX=2;
_AX=_BX+_CX;
_AH=_BL+_CL;
_AL=_BH+_CH;
}
(2)用debug加载ur1.exe,用u命令查看url.c编译后的机器码和汇编代码。如下:
-u
1540:000...
首先来看tc2.0提供的寄存器,这里注意这些寄存器是区分大小写的。
(1)编写程序ur1.c,编译连接,生成ur1.exe。
main()
{
_AX=1;
_BX=1;
_CX=2;
_AX=_BX+_CX;
_AH=_BL+_CL;
_AL=_BH+_CH;
}
(2)用debug加载ur1.exe,用u命令查看url.c编译后的机器码和汇编代码。如下:
-u
1540:000...
阅读全文 |
评论次数(0) |
浏览次数(550) |
所属类型(默认类型)
[2011-04-12 17:13] 研究试验1---搭建一个精简的C语言开发环境
这个综合研究比较简单,按照书上的步骤,搭建成功环境即可。
(1)在d盘建立一个目录,名为tc2.0。
(2)在c盘建立一个目录,名为minic。这个目录用来存放我们已知的解决问题要用到的程序和文件。
(3)把tc2.0中的tc.exe拷到c:\minic文件夹下,开始研究。
(4)运行tc.exe。
这里为了避免软件默认的搜索路径对我们实验的影响,要把tc的direction设置为当前路径,即设置为c:\minic,然后用save options 来保存设置。
(5)在tc.exe环境中编辑程序simple.c,保存到c:\minic下。
程序是:
main...
(1)在d盘建立一个目录,名为tc2.0。
(2)在c盘建立一个目录,名为minic。这个目录用来存放我们已知的解决问题要用到的程序和文件。
(3)把tc2.0中的tc.exe拷到c:\minic文件夹下,开始研究。
(4)运行tc.exe。
这里为了避免软件默认的搜索路径对我们实验的影响,要把tc的direction设置为当前路径,即设置为c:\minic,然后用save options 来保存设置。
(5)在tc.exe环境中编辑程序simple.c,保存到c:\minic下。
程序是:
main...
阅读全文 |
评论次数(0) |
浏览次数(552) |
所属类型(默认类型)
[2011-04-12 16:32] 综合研究1、2、3、4、5前要知道的
在第二版的《汇编语言》第314页,综合研究四个字的题目下有这样几个字:
本书将启示我们如何进行独立研究和深度思考。同时,使我们:
(1)认识到汇编语言对于深入理解其他领域知识的重要性。
(2)对前面所学习的汇编语言知识进行融汇。
(3)对用研究的方法进行学习,进行体验。
在以后的综合研究中,要注意这三方面的思考和体验。
接着提出三个问题,
(1)人们用C语言编程时都要用变量,我们就非用不可吗?
(2)C语言规定用户写的程序从main函数开始,我们就非要用main函数吗?
(3)printf函数可以接受不定数量的参数,我们就不怀疑了吗?
而后面的综合研究1...
本书将启示我们如何进行独立研究和深度思考。同时,使我们:
(1)认识到汇编语言对于深入理解其他领域知识的重要性。
(2)对前面所学习的汇编语言知识进行融汇。
(3)对用研究的方法进行学习,进行体验。
在以后的综合研究中,要注意这三方面的思考和体验。
接着提出三个问题,
(1)人们用C语言编程时都要用变量,我们就非用不可吗?
(2)C语言规定用户写的程序从main函数开始,我们就非要用main函数吗?
(3)printf函数可以接受不定数量的参数,我们就不怀疑了吗?
而后面的综合研究1...
阅读全文 |
评论次数(0) |
浏览次数(530) |
所属类型(默认类型)
『 查看更多文章 』