C语言的秘密
C语言中的一些基本语言元素:
1.C语言的数据类型strcmp比较数组
基本类型
  a.整型:
    整型 int  Visual c++6.0 中占4 个字节; Turbo c 2.0 2个字节
    短整型 short int 2个字节
    长整型 long int  4个字节
    无符号短整型 unsigned short int 2个字节
    无符号长整型 unsigned long int  4个字节
  b.字符型:
    char
  c.实型:
    单精度 float 4个字节,32位。
    双精度 double 8位字节,64
构造类型
  a.数组 array
  b.结构体 struct
  c.共用体 union
指针类型 *
空类型 void

2.逻辑运算
  !(非) &&(与), ||(或)

3二维数组
定义: 类型说明符 数组名[常量表达式1][常量表达式2]
注:a.存储器单元是一维线性排列的。是按行存放的。
    b.对于全部元素赋初值,则数组第一维的长度可以省略,但是第二维不能省。如:int a[][3]= {1,2,3,4,5,6}
    c.可以只对部分元素赋初值,没赋初值的元素自动取0值。
    d.一个二维数组可以分解为一个多个一维数组。例:a[3][4]可分解为三个一维数组,其数组名分别为a[0],a[1],a[2],而这个一维数组都有4个元素。如一维数组a[0]有元素为:a[0][0],a[0][1],a[0][2],a[0][3]

4.字符数组
c中没有字符串数据类型,是用字符数组来表示字符串变量的。字符串总是以'\0'作为串结束符,所以,字符串就是一种以‘\0’结束的字符数组。
常用的字符串处理函数(stdio.h中与string.h中):
puts(字符数组名)---把字符数组中的字符串输出到显示器。
gets(字符串数组名)--从输入设备得到字符串。
strcat(字符数组名1,字符数组名2--把字符数组中2中的字符串连接到字符数组1中字符串
的后面,并删除字符串1后的串标志"\0";
strcpy(字符数组名1,字符数组名2)--把字符数组2中的字符串复制到字符数组1中,串结束标识'\0'也一同复制。
strcmp(字符数组名1,字符数组名2)--按照ASCII码顺序比较两个数组中的字符串,并由函数返回比较结果。
strlen(字符数组名)---返回字符实际长度(不含字符'\0')

5.函数
对于被调用函数的声明和函数一般形式:类型说明符 被调函数名(类型,类型,..);
注:如果被调用函数的返回值是整型或字符型时,可以不对被调用函数作说明而直接调用。
      如果被调用函数定义出现在主调用函数之前,在主函数可以不对被调用函数作说明而直接调用。
   
6.变量的作用域及存储特性
a.局部变量:又称内部变量。在函数内作定义说明,其作用域仅限于函数内。
b.全局变量:又称外部变量,它是在函数外部定义的变量。它不属于哪一个函数,而属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数中经过说明的全局变量才能使用,说明符为:extern.但是在一个函数之前定义的全局变量,在该函数内可以再加以说明。
    变量的存储特性:
a.auto(自动变量)默认。为动态存储,既只有在使用它才分配存储单元,开始它的生命周期。
b.extern(外部变量)  为静态存储,外部变量等同与全局变量。当一个源程序由若干个源文件组成时,在一个源文件中定义的外部变量在其它的源文件中也有效。
c.static(静态变量) 为静态存储方式,可分为静态局变量和静态全局变量。
  静态局变量:在局部变量的说明前再加上static说明。
d.寄存器变量(register).当一个变量反复访问时,就可将此变量声明为register。放在cpu的寄存器中。别注:只有局部自变量和形式参数才能定义为寄存器变量。使用个数很有限。对于Truboc MS C等使用是按自动变量处理的。

7.内部函数和外部函数
  内部函数--一个只能被本文件中的其他函数所调用的函数。形式:static 类型 函数名(形参表)
  外部函数---如果在函数标识符前面加上extern,形式:extern int fun(int a,int b) 其中,extern为默认。

8.指针变量声明
  [存储类型] 类型标识符 *指针变量名; 
  [存储类型] 类型标识符 *指针变量名=变量地址;(注:int *p; 表示:变量p表示指针变量;另外P可用来存放整数变量的地址。指针变量本身存储的都是地址,每个指针(地址)占4个字节(在VC中),例:char *p, size(p)==4 ;

9.指针运算
a.指针赋值: 如:int x; int *p=&x;  也可在程序中对其初始化:int x,*p; .. p=&x
注意:在没赋初值时,指针变量的内容是不确定的。如果此时引用指针指向的变量,将会产
生不可预料的后果。 如:int *p; *p=100; //错误,p没有初始化。
b.指针的加减:指针变量加1不能是简单的地址加1,加上一sizof(指针变量所指类型)
10.
#defineC语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利。
#define命令剖析
  #define的概念
#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。
  简单的宏定义:
  #define  <宏名>  <字符串>
  带参数的宏定义
  #define  <宏名> (<参数表>)  <宏体>
  一个标识符被宏定义后,该标识符便是一个宏名。这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。
汇编语言中的一些基本语言元素:
寄存器与存储器
1. 寄存器功能
. 寄存器的一般用途和专用用途
. CS:IP 控制程序执行流程
. SS:SP 提供堆栈栈顶单元地址
.
DS:BX(SI,DI) 提供数据段内单元地址
. SS:BP 提供堆栈内单元地址
. ES:BX(SI,DI) 提供附加段内单元地址
. AX,CX,BXCX寄存器多用于运算和暂存中间计算结果,但又专用于某些指令(查阅 指令表)
. PSW程序状态字寄存器只能通过专用指令(LAHF, SAHF)和堆栈(PUSHF,POPF)进行存取。
3. 堆栈
. 堆栈是一种先进后出的数据结构 , 数据的存取在栈顶进行 , 数据入栈使堆栈向地址减小的方向扩展。
. 堆栈常用于保存子程序调用和中断响应时的断点以及暂存数据或中间计算结果
. 堆栈总是以字为单位存取
4. 指令系统
. 计算机提供给用户使用的机器指令集称为指令系统,大多数指令为双操作数指令。执行指令
,一般源操作数不变,目的操作数被计算结果替代。
机器指令由CPU执行,完成某种运算或操作,8086/8088指令系统中的指令分为6: 数据传送,算术运算,逻辑运算,串操作,控制转移和处理机控制。
一、数据传输指令
  1. 通用数据传送指令.
    MOV  传送字或字节.
    MOVSX 先符号扩展,再传送.
    MOVZX 先零扩展,再传送.
    PUSH  把字压入堆栈.
    POP  把字弹出堆栈.
    PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
    POPA  把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
    PUSHAD 把EAX,ECX,EDX, EBX,ESP,EBP,ESI,EDI依次压入堆栈.
    POPAD 把EDI,ESI,EBP,ESP,EBX,EDX, ECX,EAX依次弹出堆栈.
    XCHG  交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
    2. 输入输出端口传送指令.
    IN   I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
    OUT  I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
   3. 标志传送指令.
    LAHF  标志寄存器传送,把标志装入AH.
    SAHF  标志寄存器传送, AH内容装入标志寄存器.
    PUSHF 标志入栈.
    POPF  标志出栈.
    PUSHD 32位标志入栈.
    POPD  32位标志出栈.
二、算术运算指令
    ADD  加法.
    ADC  带进位加法.
    INC  加 1
        SUB  减法.
    SBB  带借位减法.
    DEC  减 1.
    NEC  求反( 0 减之).
    CMP  比较.(两操作数作减法,仅修改标志位,不回送结果).
    MUL  无符号乘法.
    IMUL  整数乘法.
    DIV  无符号除法.
    IDIV  整数除法
    AAD  除法的ASCII码调整.
    CBW  字节转换为字. (AL中字节的符号扩展到AH中去)
    CWD  字转换为双字. (AX中的字的符号扩展到DX中去)
    CWDE  字转换为双字. (AX中的字符号扩展到EAX中去)
    CDQ  双字扩展.  (EAX中的字的符号扩展到EDX中去)
三、逻辑运算指令
    AND  与运算.
    OR   或运算.
    XOR  异或运算.
    NOT  取反.
    TEST  测试.(两操作数作与运算,仅修改标志位,不回送结果).
    SHL  逻辑左移.
    SAL  算术左移.(=SHL)
    SHR  逻辑右移.
    SAR  算术右移.(=SHR)
    ROL  循环左移.
    ROR  循环右移.
    RCL  通过进位的循环左移.
    RCR  通过进位的循环右移.
四、串指令
    DS:SI 源串段寄存器 :源串变址.
    ES:DI 目标串段寄存器:目标串变址.
    CX   重复次数计数器.
    AL/AX 扫描值.
    D标志 0表示重复操作中SIDI应自动增量; 1表示应自动减量.
    Z标志 用来控制扫描或比较操作的结束.
    MOVS  串传送.
      ( MOVSB 传送字符.  MOVSW 传送字.  MOVSD 传送双字. )
    CMPS  串比较.
      ( CMPSB 比较字符.  CMPSW 比较字. )
    SCAS  串扫描.
      把ALAX的内容与目标串作比较,比较结果反映在标志位.
    LODS  装入串.
      把源串中的元素(字或字节)逐一装入ALAX.
      ( LODSB 传送字符.  LODSW 传送字.  LODSD 传送双字. )
    STOS  保存串.
      是LODS的逆过程.
    REP      当CX/ECX<>0时重复.
    REPE/REPZ   当ZF=1或比较结果相等, CX/ECX<>0时重复.
    REPNE/REPNZ  当ZF=0或比较结果不相等, CX/ECX<>0时重复.
    REPC     当CF=1CX/ECX< >0时重复.
    REPNC     当CF=0CX/ECX<>0时重复.
五、程序转移指令
   1>无条件转移指令 (长转移)
    JMP  无条件转移指令
    CALL  过程调用
     RET/RETF过程返回.
   2>条件转移指令 (短转移,-128+127的距离内)
    JA/JNBE 不小于或不等于时转移.
    JAE/JNB 大于或等于转移.
    JB/JNAE 小于转移.
    JBE/JNA 小于或等于转移.
    JG/JNLE 大于转移.
    JGE/JNL 大于或等于转移.
    JL/JNGE 小于转移.
    JLE/JNG 小于或等于转移.
    JE/JZ 等于转移.
    JNE/JNZ 不等于时转移.
    JC   有进位时转移.
    JNC  无进位时转移.
    JNO  不溢出时转移.
    JNP/JPO 奇偶性为奇数时转移.
    JNS  符号位为 "0" 时转移.
    JO   溢出转移.
    JP/JPE 奇偶性为偶数时转移.
    JS   符号位为 "1" 时转移.
  3>循环控制指令(短转移)
    LOOP      CX不为零时循环.
    LOOPE/LOOPZ  CX不为零且标志Z=1时循环.
    LOOPNE/LOOPNZ CX 不为零且标志Z=0时循环.
    JCXZ      CX为零时转移.
    JECXZ     ECX 为零时转移.
  4>中断指令
    INT  中断指令
    INTO   溢出中断
    IRET  中断返回
  5>处理器控制指令
    WAIT  当芯片引线TEST为高电平时使CPU进入等待状态.
    LOCK  封锁总线.
    NOP  空操作.
    STC  置进位标志位.
    CLC  清进位标志位.
    CMC  进位标志取反.
    STD  置方向标志位.
    CLD  清方向标志位.
    STI  置中断允许位.
    CLI  清中断允许位.


六、伪指令