c语言·其一

 简单的函数调用

 裸函数

void    __declspec (naked) fygfhh()        //绿色部分不可修改

{

             __asm

                {

                          ret

               }

}

//汇编代码需要自己填写

总:裸函数就是编译器不做任何处理

eg:

1.

反汇编:

2.实现三个数字相加+参数

 

int 3=cc

调用约定

格式

 

1._cdecl

默认的格式

 

2._stdcall

 

内部平衡栈

3._fastcall

 

若参数过多,ecx和edx只会存入两个参数,剩下的参数将会用push来进行存储,而且也是内部平衡栈

函数入口

 找后面有参数的就是入口

数据类型

1.整数类型

 

16进制加个0x

eg:

有无符号的区别

jle小于等于。表示有符号数

jbe低于等于。表示无符号数

2.浮点类型

float

 

如何存浮点数

指数部分:左移--第一个数1。右移--第一个数0

                 指数减1,然后转换为二进制,添在指数部分的最后

                 中间添零

eg:

8.25

 

 

注:小数部分x2之后取整数部分

        3-1=2--2的二进制等于10

         所以指数部分:1。。。。。。10

         句号改为0

 

 

类型转换

汇编

有符号

movsx:符号位拓展(看最前面的数

MOV AL,0FF        将0FF存入AL(al—8位)1111 1111

MOVSX CX,AL      (cx—16位)1111 1111 1111 1111

如图:

若为mov al,0xf         0000 1111

        movsx cx,al       0000 0000 0000 1111

———————————————————————————————————

无符号

movzx:只在前面补零

MOV AL,0FF 

MOVZX CX,AL

如图 

 

C语言

无符号:

unsigned char i = 0xFF;  

unsigned short k = i;  

unsigned int h = i;  

有符号:

char i = 0xFF; 

short k = i; 

int h = i; 

大的类型转换小的类型

void Function1()  

{  

 int ni = 0x12345678;   eax—cccc5678

 short si = ni;                ecx—00000078

 char ci = ni; 

}  

如图:

 

 表达式

特点一:表达式无论多么复杂,都只有一个结果            

特点二: 只有表达式,可以编译通过,但并不生成代码,需要与赋值或者其他流程控制语句一起组合的时候才有意义.          

特点三:当表达式中存在不同宽度的变量时,结果将转换为宽度最大的那个. 

char a; 

int b; 

a=10;0a

b=20;

printf("%d",a+b)

———————————————————————————————————————————————————

特点四:当表达式中同时存在有符号和无符号数的时候,表达式的结构将转换为无符号数.

unsigned char a; 

char b; 

 a=0xFE;

b=1;

printf("%d",a+b); 

若认为结果是有符号数— -1

若结果认为是无符号数—255

——————————————————————————————————————————————————

char b=1;

unsigned int a=b;

拓展以自身为标准

——————————————————————————————————————————————————————

unsigned char b=1;

int a=b;

直接变为dword

————————————————————————————————————————————————————————

char b=1;                            1

unsigned int a=0xFFFFFFFF;-2

printf("%d",a+b);

 

 

低于int类型的字节数,可以用%d来输出无符号数,等于int类型的字节数的时候,就得按%d的规则

%d有符号

%u无符号

%x16进制

运算

加法

 

加了teturn z(返回值)

可以将局部参数的值放入了eax

比较

 

 004103d:比较第一个值与第二个值是否一样

sete:如果两个值一样,就会把cl设置为1

 并且

void Fun(int x,int y,int z)   

{   

 if(x>1 && y>1 && z>1)  

 {  

  printf("OK"); 

 }  

 else  

 {  

  printf("Error"); 

 }  

}   

0040d7a8 cmd:比较第一个参数跟1谁大,若小于等于则跳转0040d7c9

或者

void Fun(int x,int y,int z)   

{   

 if(x>1 || y>1 || z>1)  

 {  

  printf("OK"); 

 }  

 else  

 {  

  printf("Error"); 

 }  

}   

jg:若比一大则跳转0040d7BA

++/--

++i:先自加,然后参与运算

i++:先参与运算,然后再自加

void Fun(int x,int y,int z)  

{  

 int i = 10; 

 int k = ++i; 

 printf("%d-%d\n",i,k); 

}  

0040d7b5:此时i=11

表达式?x:y

void Fun(int x,int y)  

{  

 int r = x>y?x:y; 

 printf("%d\n",r); 

}  

 

asscii

标准的:有八位,只用七位

拓展的:有八位,用八位

gb2312

 

posted @ 2024-06-16 17:10  雨里青山隐  阅读(4)  评论(0编辑  收藏  举报