汇编语言(一)

目的:了解程序是怎样执行的

二进制–》 汇编》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.就是一块内存,操作系统在程序启动的时候已经分配好的,供程序执行时 使用。

  1. 和数据结构的推展无关
  2. 查看堆栈(特殊的内存)

一个程序可以使用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. 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’) ;

  1. ( ) 中间最终返回一个结果,0 1 ; (); 小括号后边不要加 ; 分号代表结束。代表前面的是一句。

  2. ()中可以 一个等号, = 赋值, 它不是0 ,所以可以执行。 == 两个,进行判断

  3. 例子三,条件是0, true, 打印1 不执行,但是打印2会执行。 它不受上面影响。如果想控制两个,就加上{ },代表一个整体。

14 switch 语句的格式

switch(表达式)

{

case 常量表达式1:

case 常量表达式11: ( 可以并列条件)

语句1;

break;

case 常量表达式2:

语句2;

break;

default

语句3;

break;

}

  1. 表达式记过不能是浮点数
  2. case后的值不能一样
  3. case 后的值必须是常量
  4. break; 是跳出整个循环,如果没有碰到,就一直向下执行
  5. default 是默认最后执行 ; 可以放到任何位置,但一般都是放到左后,可以不加break;放到首位记得加 break
  6. 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 中, 指针就是一种数据类型。

本文地址:https://blog.csdn.net/lyxkgc/article/details/107342261