赞
踩
目录
应用程序错误:
亦或是:
又或者是:
- 从事计算机底层开发的人员:
- 对于要做计算机底层开发(计算机硬件逻辑、嵌入式系统、自动控制、模数/数模转换、...)的人员;
- 电脑游戏设计程序员;
- 在系统内核代码里插入汇编:
- Linux、Android VM中的ART、VM;
- 深入了解计算机的工作过程;
- 有助于理解高级语言的一些语法现象:
- 任何高级语言都必须翻译成机器(或汇编)语言才能执行,所以任何高级语言的功能和实现机理,最终都将以机器(或汇编)代码的形式;
- 有助于掌握良好的设计方法;
- AI算法优化;
- 代码段:存储程序的所有可执行代码,在程序正常执行的情况下,程序计数器(PC指针)只会在代码段和操作系统地址空间(内核态)内寻址;
- 数据段:存储程序的全局变量、静态变量、常量等;
- 堆:存储程序运行时动态申请的内存数据等,数据增长方向是高地址方向;
- 栈:存储程序的函数栈帧(包括参数、局部数据等),实现函数调用机制,它的数据增长方向是低地址方向;
- 除了代码段和受操作系统保护的数据区域,其他的内存区域都可能作为缓冲区;
- 因此缓冲区溢出的位置可能在数据段,也可能在堆、栈段;
- 如果程序的代码有软件漏洞,恶意程序会“教唆”程序计数器PC从上述缓冲区内取指,执行恶意程序!
每次函数调用时,在栈内系统保存函数的:
- 返回地址(函数调用指令后紧跟指令的地址);
- 一些关键的寄存器值保存在栈内;
- 函数的实际参数和局部变量,包括数据、结构体、对象等。
- void fun(char* data)
- { char buffer[80];
- strcpy((char*)buffer, (char*)data)
- }
- 汇编语言是软硬交接处的一门语言;
- 汇编是一门非跨平台语言;
- 根据CPU的类型不同,其设计语言也不同;
- 从语言简洁角度:基于RISC的汇编;
- 传统、大众化教育角度,基于CISC的汇编:
- 8086汇编、
- 80386汇编;
- 80386更符合我们对目前计算机原理的理解,限制更少,也就是也很简洁;
- 方便调试,基于8086的汇编程序是16位程序,基于80386的汇编程序是32位程序;
- MUL X, A, B ; X←(A)×(B)
- ADD X, X, C ; X←(X)+(C)
- SUB X, X, D ; 分子的计算结果在中
- ADD Y, E, F ; 计算分母,存入Y中
- YDIV X, X, Y ; 计算分子分母相除,存入X中
- MOVE X, A ; 复制临时变量A到X中
- MUL X, B ; X←A * B
- ADD X, C ; X←A * B + C
- SUB X, D ; X中存放分子运算结果
- MOVE Y, E ; 复制临时变量E到Y中
- ADD Y, F ; Y中存放分母求和运算结果
- DIV X, Y ; X中存放分子分母相除运算结果
- MOVE R1, A ; 操作数a取到寄存器R1中
- MUL R1, B ; R1← A * B
- ADD R1, C ; R1← R1 + C
- SUB R1, D ; R1中存放分子运算结果
- MOVE R2, E ; 操作数E取到寄存器R2中
- ADD R2, F ; R2← E + F
- DIV R1, R2 ; 最后结果在R1中
- MOVE X, R1 ; 最后结果存入X中
- LOAD E ; 先计算分母,取操作数E到累加器中
- ADD F ; 分母运算结果在累加器中
- STORE X ; 保存分母运算结果到X中
- LOAD A ; 取操作数A到累加器中
- MUL B ; 计算操作数A和B相乘,结果存入累加器中
- ADD C ; 累加器中的数据与操作数c相加,存入累加器
- SUB D ; 累加器中是分子运算结果
- DIV X ; 最后运算结果在累加器中
- STORE X ; 保存最后运算结果到X中
按(ab*c+d-ef+/)进行输出:
- PUSH A ; 操作数a压入堆栈
- PUSH B ; 操作数b压入堆栈
- MUL ; 栈顶两数相乘,结果压回堆顶
- PUSH C ; 操作数c压入堆栈
- ADD ; 栈顶两数相加,结果压回堆顶
- PUSH D ; 操作数d压入堆栈
- SUB ; 栈顶两数相减,结果压回栈顶(分子运算结果)
- PUSH E ; 操作数e压入堆栈
- PUSH F ; 操作数f压入堆栈
- ADD ; 栈顶两数相加,结果压回堆顶
- DIV ; 栈顶两数相除(最后运算结果)
- POP X ; 保存最后运算结果到操作数x中
优化指令系统设计的3个阶段:
- CISC:复杂指令系统60年代至70年代中期 Complex Instruction Set Computer;
- RISC:精简指令系统70年代后期至现在 Reduced Instruction Set Computer;
- VLIW:80年代初期至现在 Very Long Instruction Word;
微机中常用的Intel系列微处理器的主要发展过程是:8080,8086/8088,80186, 80286,80386,80486,Pentium,Pentium II,Pentium III,Pentium 4,及以后。
CPU位数变化:(数据总线宽度) 4—8—16—32—64
- MS-DOS操作系统运行在此模式下;
- 1M内存寻址空间,不支持多任务模式,16位地址总线;
- 将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向“实在”的物理地址;
- 用户程序的一个指针如果指向了系统程序区域或其他用户程序 区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。
- 实模式:工作方式相当于一个8086
- Windows95和98能够引导进入这种模式;
- 只有段式管理机制;
- 访问地址在1M以下;
- 保护模式:提供支持多任务环境 MS-windows和Linux运行在此模式下;
- 全部32条地址线有效,可寻址高达4G字节的物理地址空间;
- 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;
- 支持多任务,能够快速地进行任务切换和保护任务环境;
- 4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离;
- 支持虚拟8086方式,便于执行8086程序;
- Win16 物理地址空间4G;
- Win32 虚地址分页管理4G。
- 虚拟8086模式:可从保护模式切换至其中的一种8086工作方式。这种方式的提供使用户可以方便地在保护模式下运行一个或多个原8086程序
- 在32位保护模式下运行纯16位程序;
- 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模式下运行。
- 三种基本模式:
- 实模式:纯16位无保护执行环境,CPU刚启动时;
- 保护模式:纯32位保护执行环境;
- 系统管理模式:提供给操作系统一个执行平台指定的功能,提供一个透明的架构,例如系统安全或者电源管理。
- 扩展模式:IA-32e(Intel Architectur-32 extension)
- 兼容模式:该模式下,64位操作系统运行在32位兼容环境,能正常运行16和32位应用程序就像基本的保护模式一样,访问32位地址空间,但不能运行纯16位实模式程序;
- 64位模式:在该模式下,处理器完全执行64位指令,使用64位地址空间和64操作数,运行16和32位程序必须切换到兼容模式。
64位模式下几乎所有32位指令和大部分16/8位指令都可以执行(但是默认寻址模式是64位的),并非只能执行64位指令,具体用什么指令要看运算类型
虽然,64位操作系统支持32位程序,但是是有条件的: 因为操作系统对CPU的操作有所变化,有的是32位操作就不能在64位上操作了。 比如,软件通过调用底层,通过汇编读写数据的源程序,在32位上运行自如,在64位上就出现问题,执行出错。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。