当前位置:   article > 正文

汇编语言——是什么?为什么?怎么做?_汇编语言为什么要缓冲区

汇编语言为什么要缓冲区

目录

一. 为什么学习汇编语言?

1.1 我们遇到的问题

1.2 汇编的作用

1.3 缓冲区溢出攻击

1.4 函数调用时栈空间发生了什么?

1.5 缓冲区溢出攻击的原理是什么?

二. 我们要学什么汇编语言?

2.1 汇编语言

1)汇编的种类

2)选择80836汇编

2.2 计算一个典型的算术表达式:

1)用三地址指令编写的程序如下:

2)用普通二地址指令编写的程序:

3)用多寄存器结构的二地址指令编写程序:

4)用一地址指令编写的程序:

5)用0地址指令编写程序:

2.3 CPU 指令系统的优化设计:

2.4 CISC与RISC的主要特征对比 

2.5 不同位数的CPU的几种工作模式

1)CPU的发展:

2)CPU的工作模式: 

2.6 操作系统位数和汇编语言位数关系

三. 汇编语言专栏


一. 为什么学习汇编语言?

1.1 我们遇到的问题

应用程序错误:

bb43bbf71b9b40dfb0edcbbfe9ba6097.png

亦或是:

ff79e04a6d3f4344aa58d80d61601588.png

 又或者是:

ee324487b66945049c018e6688156916.png

1.2 汇编的作用

  • 从事计算机底层开发的人员:
  1. 对于要做计算机底层开发(计算机硬件逻辑、嵌入式系统、自动控制、模数/数模转换、...)的人员;
  2. 电脑游戏设计程序员;
  • 在系统内核代码里插入汇编:
  1. Linux、Android VM中的ART、VM;
  • 深入了解计算机的工作过程;
  • 有助于理解高级语言的一些语法现象:
  1. 任何高级语言都必须翻译成机器(或汇编)语言才能执行,所以任何高级语言的功能和实现机理,最终都将以机器(或汇编)代码的形式;
  • 有助于掌握良好的设计方法;
  • AI算法优化;

1.3 缓冲区溢出攻击

  • 代码段:存储程序的所有可执行代码,在程序正常执行的情况下,程序计数器(PC指针)只会在代码段和操作系统地址空间(内核态)内寻址;
  • 数据段:存储程序的全局变量、静态变量、常量等;
  • 堆:存储程序运行时动态申请的内存数据等,数据增长方向是高地址方向;
  • 栈:存储程序的函数栈帧(包括参数、局部数据等),实现函数调用机制,它的数据增长方向是低地址方向;

628df8639ec9424f91e32e38ae4a2c10.png

  • 除了代码段和受操作系统保护的数据区域,其他的内存区域都可能作为缓冲区;
  • 因此缓冲区溢出的位置可能在数据段,也可能在堆、栈段;
  • 如果程序的代码有软件漏洞,恶意程序会“教唆”程序计数器PC从上述缓冲区内取指,执行恶意程序! 

1.4 函数调用时栈空间发生了什么?

        每次函数调用时,在栈内系统保存函数的:

  • 返回地址(函数调用指令后紧跟指令的地址);
  • 一些关键的寄存器值保存在栈内;
  • 函数的实际参数和局部变量,包括数据、结构体、对象等。

4067c6c9da764a75919f9504317aa2fd.png

1.5 缓冲区溢出攻击的原理是什么?

  1. void fun(char* data)
  2. { char buffer[80];
  3. strcpy((char*)buffer, (char*)data)
  4. }

3a862312ebc6417a971895c7e92a52e2.png

b0b40b0a60524d7c9e5859ae2601ed37.png


二. 我们要学什么汇编语言?

2.1 汇编语言

  • 汇编语言是软硬交接处的一门语言;
  • 汇编是一门非跨平台语言;
  • 根据CPU的类型不同,其设计语言也不同;

1)汇编的种类

  • 从语言简洁角度:基于RISC的汇编;
  • 传统、大众化教育角度,基于CISC的汇编:
  1. 8086汇编、
  2. 80386汇编;

2)选择80836汇编

  • 80386更符合我们对目前计算机原理的理解,限制更少,也就是也很简洁;
  • 方便调试,基于8086的汇编程序是16位程序,基于80386的汇编程序是32位程序;

2.2 计算一个典型的算术表达式:

58fc8ad68bad4dd9800365a85be68945.png

1)用三地址指令编写的程序如下:

  1. MUL X, A, B    ; X←(A)×(B)     
  2. ADD X, X, C    ; X←(X)+(C)     
  3. SUB X, X, D    ; 分子的计算结果在中     
  4. ADD Y, E, F    ; 计算分母,存入Y中     
  5. YDIV X, X, Y   ; 计算分子分母相除,存入X中

2)用普通二地址指令编写的程序:

  1. MOVE X, A ; 复制临时变量AX
  2. MUL X, B ; XA * B
  3. ADD X, C ; XA * B + C
  4. SUB X, D ; X中存放分子运算结果
  5. MOVE Y, E ; 复制临时变量EY
  6. ADD Y, F ; Y中存放分母求和运算结果
  7. DIV X, Y ; X中存放分子分母相除运算结果

3)用多寄存器结构的二地址指令编写程序:

  1. MOVE R1, A ; 操作数a取到寄存器R1
  2. MUL R1, B ; R1← A * B
  3. ADD R1, C ; R1← R1 + C
  4. SUB R1, D ; R1中存放分子运算结果
  5. MOVE R2, E ; 操作数E取到寄存器R2
  6. ADD R2, F ; R2← E + F
  7. DIV R1, R2 ; 最后结果在R1
  8. MOVE X, R1 ; 最后结果存入X中

4)用一地址指令编写的程序:

  1. LOAD E ; 先计算分母,取操作数E到累加器中
  2. ADD F ; 分母运算结果在累加器中
  3. STORE X ; 保存分母运算结果到X
  4. LOAD A ; 取操作数A到累加器中
  5. MUL B ; 计算操作数AB相乘,结果存入累加器中
  6. ADD C ; 累加器中的数据与操作数c相加,存入累加器
  7. SUB D ; 累加器中是分子运算结果
  8. DIV X ; 最后运算结果在累加器中
  9. STORE X ; 保存最后运算结果到X

5)用0地址指令编写程序:

按(ab*c+d-ef+/)进行输出:

  1. PUSH A ; 操作数a压入堆栈
  2. PUSH B ; 操作数b压入堆栈
  3. MUL ; 栈顶两数相乘,结果压回堆顶
  4. PUSH C ; 操作数c压入堆栈
  5. ADD ; 栈顶两数相加,结果压回堆顶
  6. PUSH D ; 操作数d压入堆栈
  7. SUB ; 栈顶两数相减,结果压回栈顶(分子运算结果)
  8. PUSH E ; 操作数e压入堆栈
  9. PUSH F ; 操作数f压入堆栈
  10. ADD ; 栈顶两数相加,结果压回堆顶
  11. DIV ; 栈顶两数相除(最后运算结果)
  12. POP X ; 保存最后运算结果到操作数x

2.3 CPU 指令系统的优化设计:

        优化指令系统设计的3个阶段:

  • CISC:复杂指令系统60年代至70年代中期 Complex Instruction Set Computer;
  • RISC:精简指令系统70年代后期至现在 Reduced Instruction Set Computer;
  • VLIW:80年代初期至现在 Very Long Instruction Word;

2.4 CISC与RISC的主要特征对比 

3b8c9f3ee3f0436da4fc4c537b624fe8.png

2.5 不同位数的CPU的几种工作模式

1)CPU的发展:

微机中常用的Intel系列微处理器的主要发展过程是:8080,8086/8088,80186, 80286,80386,80486,Pentium,Pentium II,Pentium III,Pentium 4,及以后。

CPU位数变化:(数据总线宽度) 4—8—16—32—64

2)CPU的工作模式: 

  • 8086工作模式:
  1. MS-DOS操作系统运行在此模式下;
  2. 1M内存寻址空间,不支持多任务模式,16位地址总线;
  3. 将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向“实在”的物理地址;
  4. 用户程序的一个指针如果指向了系统程序区域或其他用户程序 区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。
  • 80386的三个工作模式: 
  • 实模式:工作方式相当于一个8086
  1. Windows95和98能够引导进入这种模式;
  2. 只有段式管理机制;
  3. 访问地址在1M以下;
  • 保护模式:提供支持多任务环境 MS-windows和Linux运行在此模式下;
  1. 全部32条地址线有效,可寻址高达4G字节的物理地址空间;
  2. 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;
  3. 支持多任务,能够快速地进行任务切换和保护任务环境;
  4. 4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离;
  5. 支持虚拟8086方式,便于执行8086程序;
  6. Win16 物理地址空间4G;
  7. Win32 虚地址分页管理4G。 
  • 虚拟8086模式:可从保护模式切换至其中的一种8086工作方式。这种方式的提供使用户可以方便地在保护模式下运行一个或多个原8086程序
  1. 在32位保护模式下运行纯16位程序;
  2. Windows NT 2000 和XP系统中,某些需要直接使用计算机硬件的MS-DOS程序不能运行在虚拟8086模式下;

具体理解三种模式: 

  • 使用Intel系列CPU的PC机只要一开机,CPU就工作在实模式;
  • 如果操作系统是DOS,那么在DOS加载后CPU仍以实模式工作;
  • 如果操作系统是Windows,那么Windows加载后,将由Windows将CPU切换到保护模式下工作,因为Windows是多任务系统,它必须在保护模式下运行;
  • 如果在Windows中运行一个DOS下的程序,那么Windows将CPU切换到虚拟8086模式下运行该程序,或者用户在程序项中进入MS–DOS方式,此刻Windows也将CPU切换到虚拟8086模式下运行。
  • 64位操作模式 
  • 三种基本模式:
  1. 实模式:纯16位无保护执行环境,CPU刚启动时;
  2. 保护模式:纯32位保护执行环境;
  3. 系统管理模式:提供给操作系统一个执行平台指定的功能,提供一个透明的架构,例如系统安全或者电源管理。
  • 扩展模式:IA-32e(Intel Architectur-32 extension) 
  1. 兼容模式:该模式下,64位操作系统运行在32位兼容环境,能正常运行16和32位应用程序就像基本的保护模式一样,访问32位地址空间,但不能运行纯16位实模式程序;
  2. 64位模式:在该模式下,处理器完全执行64位指令,使用64位地址空间和64操作数,运行16和32位程序必须切换到兼容模式。

        64位模式下几乎所有32位指令和大部分16/8位指令都可以执行(但是默认寻址模式是64位的),并非只能执行64位指令,具体用什么指令要看运算类型 

2.6 操作系统位数和汇编语言位数关系

        虽然,64位操作系统支持32位程序,但是是有条件的: 因为操作系统对CPU的操作有所变化,有的是32位操作就不能在64位上操作了。 比如,软件通过调用底层,通过汇编读写数据的源程序,在32位上运行自如,在64位上就出现问题,执行出错。


三. 汇编语言专栏

https://blog.csdn.net/weixin_53919192/category_11841625.html?spm=1001.2014.3001.5482https://blog.csdn.net/weixin_53919192/category_11841625.html?spm=1001.2014.3001.5482

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/461011
推荐阅读
相关标签
  

闽ICP备14008679号