汇编语言(一)
目的:了解程序是怎样执行的
二进制–》 汇编》c语言
第一部分:常识
1. 为什么计算机使用二级制:
计算机用电信号,通电,断电两种情况记录信息。
2.为什么16进制:
是二级制的简写 ; 一个图片存到电脑里,就是16进制存储的。
3.数据宽度:
数字没有宽度,但是计算机由于硬件的显示,超过一定字节,会被丢弃。
4有符号字 无符号字
无符号字:是多少就是多少。
4 .编码规则
不同的文件有不同的编码规则
5 与运算 &
串联电路
6或运算 or(|)
并联电路
7 或运算
8汇编学习环境 x86
第二部分:环境
1 寄存器:(寄存器在cpu中)
存储数据:
cpu > 内存> 硬盘
寄存器:
32位cpu 8 16 32
64位cpu 8 16 32 64
32位寄存器: EAX ECX EDX EBX ESP EBP ESI EDI 最多存32位,多出的舍弃,有宽度。
汇编的实质就是寄存器里的数移动据。 寄存器之间或者是内存间的移动。
汇编的三个模块: 寄存器 内存 指令
MOV指令 寄存器 里存值
2.内存
作用: 数据多了,不能只存在cpu中。 这里的内存,不是内存条。
一个进程为什么可用最大4G: 因为内存地址可以指向地址最多就是这么多。一个地址对应一个字节
就是编写程序的时候,可以使用的内存。
进程中的内存是假的,他是映射到物理内存。(这个物理内存与内存条不是一个概念)
内存地址太大,没法取名字,只能用编号。
内存:内存地址。 一 一对应。
3.存储模式
大端模式 小端模式
4 数据可以存在哪:
寄存器 内存
5 数据如何存放:
小端存储
第三部分: 堆栈
1.堆栈是什么:(4G)
1.就是一块内存,操作系统在程序启动的时候已经分配好的,供程序执行时 使用。
- 和数据结构的推展无关
- 查看堆栈(特殊的内存)
一个程序可以使用4g的内存,但是,使用内存的时候,程序需要申请内存。
内存:是程序申请的;堆栈:是程序启动的时候,就已经存在的,用于存储临时的程序数据。
2 函数
函数就是一系列指令的集合,为了完成某个重复使用的特定功能。
例子:项寄存器中赋值
3.外挂
4.ESP寻址 EBP寻址
汇编语言(二)
1.计算机的语言:
总的来说可以分成三大类
-
机器语语言:由0和1构成的代码
-
汇编语言:c, c++ 汇编语言的实质和机器语言是相同的 指令、伪指令和宏指令
-
高级语言:高级语言并不是特指的某一种具体的语言,而是包括很多编程语言如流行的java,c,c++,C#,pascal,python,lisp,prolog,FoxPro,易语言,中文版的C语言等等
html: HTML的英文全称是 Hyper Text Markup Language,即超文本标记语言, HTML是网络的通用语言,一种简单、通用的全置标记语言。实质就是带有特殊意义的字符串。用于网络传输。
2. c, c++关系:
c++在c的基础上发展而来, 两者都是编程语言。 c的实质就是把指令编译成0 1
3 vc6 ,vs
是集成开发环境。
4 全局变量
外挂就是找到基址,然后改变它。
- 1 int x; x = 2
变量就是程序中向计算机申请存储空间,放置数值。
变量就是一个容器 ;变量类型:确定变量宽度 ;变量名字就是变量的编号;
4.2 全局变量
谁都可以更改,谁都可以用。
不重新编译,全局变量不变,也叫基址不变。
5 局部变量
5-1 局部变量是函数内部申请的,如果函数没有执行,那么局部变量没有内存空间。
5-2 局部变量的内存是在堆栈中分配的,程序执行时才分配,我们无法预知程序合适执行,这也意味着,我们无法确定局部变量的内存地址。
5-3 因为局部变量地址内存不确定,所以,局部变量只能在函数内部使用,其他函数不能使用。
6 内存的角度看变量
6-1 参数在内存中的位置 堆栈
6-2 局部变量在内存中的位置 堆栈的缓冲区
6-3 返回值是如何返回,如何使用的 需要int一个空间保存计算值
7 函数嵌套
函数理论上可以不限嵌套, 只要堆栈够大。 要考虑到物理承载容量。
8 变量的宽度
变量的宽度,有他的类型的确定。
9 c 语言的变量类型
chart 1字节(1字节 = 8BIT)
short 2字节
int 4字节
long 4字节
- 基本类型 整数类型 浮点类型
- 构造类型 数据组类型 结构体类型 共用体(联合)类型
- 指针类型
- 空类型
10 字符串
对于计算机来说,它不认识a b c ,这些对计算机来说就是符号,一个图画。
碰到程序需要打印a 时, 计算机会去查表 ASCII表(127个), 表中对应哪个符号,就把哪个符号打印出来。
转译字符
当打印需要换行时,可以输入 ASCII表 对应的10,也可以输入\n 。 \n对应的不是n本省,而是一个指令,转译10。
11 字符与字符串
对电脑老说,一个字符查表一次, 一个字符串需要查一堆, 字符串需要有开始和结束,否则就一直查表。 “ ” 对应00结束码。
12 打印浮点数
浮点数就是有小数点 1.2 3.4 等 计算机会限制打印一个数。
12 中文字符
ASCll码 是基于拉丁字母的一套电脑编码系统,到目前为止共定义了128个字符。 但里面没有中文。美国人定的。
这里涉及到了拓展: 128 -255 注意推展字符仍然是外文。
中国专家重新建立一个ASCII表, 前127个不变,后面奇异字符统统去掉:规定 一个小于127的字符的意义与原来相同,但是大于127的字符连载一起时,就表示一个汉字,这样我们就可以组合除大约7000对个简体汉字了。
在这些编码里,连载ASCll 里本来就有的数据,标点,字母,都统统重新变了两个字节长的编码,这就是 常说’全角‘ 字符,二原来127号一下的那些就叫做’半角‘字符了。
两个字节代表一个汉字。
弊端: 因为是自己国家编写,所以别国也可能用相同字节代表另外一个符号。 造成混乱。
为了解决这种问题,Unicode编码出现了。
上述编码规则就是 GB2312 或GB2312-80 (国标)
13运算符和表达式
运算符: + - / *
表达式: x+y x==y ( 对电脑来说罗,就是一个数)
13 分支语句if
什么是分支语句: 就是 if else
if ( x+y ) { } ;
if ( x=y ) { } ;
-----------------分隔符--------------------
例子3:
if (0)
printf(‘打印1’) ;
printf(‘打印2’) ;
-
( ) 中间最终返回一个结果,0 1 ; (); 小括号后边不要加 ; 分号代表结束。代表前面的是一句。
-
()中可以 一个等号, = 赋值, 它不是0 ,所以可以执行。 == 两个,进行判断
-
例子三,条件是0, true, 打印1 不执行,但是打印2会执行。 它不受上面影响。如果想控制两个,就加上{ },代表一个整体。
14 switch 语句的格式
switch(表达式)
{
case 常量表达式1:
case 常量表达式11: ( 可以并列条件)
语句1;
break;
case 常量表达式2:
语句2;
break;
default
语句3;
break;
}
- 表达式记过不能是浮点数
- case后的值不能一样
- case 后的值必须是常量
- break; 是跳出整个循环,如果没有碰到,就一直向下执行
- default 是默认最后执行 ; 可以放到任何位置,但一般都是放到左后,可以不加break;放到首位记得加 break
- swich 效率高于if ,因为swich 都是等于,if 都是范围性判断。
15 do … while 语句判断
先执行,再判断
16 while 语句判断
先判断
17 for 语句
for(表达式1, 表达式2,表达式3){
//需要执行的二代吗4
}
执行的顺序是: 1243 243 243 243 。。。。
18 查看电脑启动项
wind+ r 输入 msconfig 确定键 查看启动项
19 数组
定义格式
数据类型 变量名[常量] //为什么不能是变量
定义数组,数组长度必须是常量, 因为,一旦编译,长度就确定了,如果是变量,无法编译。
数组中,成员的内存地址,前面的在堆栈最上面,地址 递减。
20 二维数组
[
[num:1],
[num:1],
[num:1]
]
内存存储部分一维数组 二维数组。 完全是为了方便使用。 存储都是顺序存储。
21 字节对齐
一个变量占用n个字节,则该变量的其实地址必须是n的整数倍,即:存放起始地址%n = 0.
实质就是空间换时间。 这种倍数存储,方便计算机查找。
22 指针类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K1ikUbTF-1594717522361)(C:\Users\luyunxiao\AppData\Roaming\Typora\typora-user-images\1594715908943.png)]
在c 中, 指针就是一种数据类型。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8jK3ZzwI-1594717522363)(C:\Users\luyunxiao\AppData\Roaming\Typora\typora-user-images\1594716009382.png)]
指针类型的宽度: 永远是4个字节,无论类型是什么, 有几个*
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uhHozFbH-1594717522365)(C:\Users\luyunxiao\AppData\Roaming\Typora\typora-user-images\1594716368674.png)]
[num:1]
]
内存存储部分一维数组 二维数组。 完全是为了方便使用。 存储都是顺序存储。
21 字节对齐
一个变量占用n个字节,则该变量的其实地址必须是n的整数倍,即:存放起始地址%n = 0.
实质就是空间换时间。 这种倍数存储,方便计算机查找。
22 指针类型
在c 中, 指针就是一种数据类型。