一,大小端问题
大端:低地址放低数据 如:手机,网络等
小端:低地址放高数据 如:PC,Inter
如何用指针或结构体判断大小端
指针:
#include <stdio.h>
#include <stdlib.h>
//用指针的方式检测机器的大小端模式
int small_port()
{
int a = 1 ;
char b = *((char *)(&a)) ;
return b ;
}
int main(void)
{
int i = small_port();
if(1 == i)
printf("小端模式\n");
else
printf("大端模式\n");
return 0 ;
}
结构体:
void IsBigEndian()
{
short int a = 0x1122;//十六进制,一个数值占4位
char b = *(char *)&a; //通过将short(2字节)强制类型转换成char单字节,b指向a的起始字节(低字节)
if( b == 0x11)//低字节存的是数据的高字节数据
{
//是大端模式
}
else
{
//是小端模式
}
}
二,汇编指令
MOV
功能: 把源操作数送给目的操作数
语法: MOV 目的操作数,源操作数
格式: MOV r1,r2
MOV r,m
MOV m,r
MOV r,data
语法: MOV 目的操作数,源操作数
格式: MOV r1,r2
MOV r,m
MOV m,r
MOV r,data
PUSH
功能: 把操作数压入或取出堆栈
语法: PUSH 操作数
格式: PUSH r PUSH M PUSH data
功能: 把操作数压入或取出堆栈
语法: PUSH 操作数
格式: PUSH r PUSH M PUSH data
ADD:加法指令
CMP
功能: 比较OP1与OP2的值
功能: 比较OP1与OP2的值
CALL
功能: 子程序调用,返回指令
功能: 子程序调用,返回指令
EAX "累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
EBX "基地址"(base)寄存器, 在内存寻址时存放基地址。
ECX 计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
EBX "基地址"(base)寄存器, 在内存寻址时存放基地址。
ECX 计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
ESP 专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。
dword ptr 里的数据是一个地址值,这个地址指向一个双字型数据。
三,if和swith有什么区别
if的括号内的表达式可以分别是bool的合法表达式、可以是所有大于0的正整数为true,反之为小于等于0的正整数为false、可以是常量、枚举;而switch括号内也符合前面if提到的外,就是当圆括号内为正整数只能是0或1,其它的正整数属于 default范围。
四,左移右移
>>右移 除法
<<左移 乘法
例:
11 0000 1011
13 00001101
~ 11110100 按位取反
| 0000 1111 按位或
& 0000 1001 取地址,按位与
^ 0000 0110 异或
11>>1 00000101 5 右移,除法
11>>2 00000010 2
11>>3 00000001 1
11<<1 00010110 22 左移,乘法
11<<2 00101100 44
五,前缀和后缀
j=i++:j=i,i+1.先计算再++
j=++i:i=i+1,j=i.先++再计算
注:i++与++i不在表达式内无区别
六,*的作用:(1)指针(2)乘法(3)解引用
七,sizeof:求字节大小
sizeof(int)必须带括号
j=++i:i=i+1,j=i.先++再计算
注:i++与++i不在表达式内无区别
六,*的作用:(1)指针(2)乘法(3)解引用
七,sizeof:求字节大小
sizeof(int)必须带括号
sizeof a 变量可加可不加
八,求余数:10%3 -10%3 10%-3 -10%-3
1 -1 1 -1
八,求余数:10%3 -10%3 10%-3 -10%-3
1 -1 1 -1