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