《汇编语言》寄存器物理地址(第二章第二节)
- 格式:ppt
- 大小:722.00 KB
- 文档页数:50
寄存器与存储器1. 寄存器功能. 寄存器的一般用途和专用用途. CS:IP 控制程序执行流程. SS:SP 提供堆栈栈顶单元地址. DS:BX(SI,DI) 提供数据段内单元地址. SS:BP 提供堆栈内单元地址. ES:BX(SI,DI) 提供附加段内单元地址. AX,CX,BX和CX寄存器多用于运算和暂存中间计算结果,但又专用于某些指令(查阅指令表)。
. PSW程序状态字寄存器只能通过专用指令(LAHF, SAHF)和堆栈(PUSHF,POPF)进行存取。
2. 存储器分段管理. 解决了16位寄存器构成20位地址的问题. 便于程序重定位. 20位物理地址=段地址* 16 + 偏移地址. 程序分段组织: 一般由代码段,堆栈段,数据段和附加段组成,不设置堆栈段时则使用系统内部的堆栈。
3. 堆栈. 堆栈是一种先进后出的数据结构, 数据的存取在栈顶进行, 数据入栈使堆栈向地址减小的方向扩展。
. 堆栈常用于保存子程序调用和中断响应时的断点以及暂存数据或中间计算结果。
.堆栈总是以字为单位存取指令系统与寻址方式1. 指令系统. 计算机提供给用户使用的机器指令集称为指令系统,大多数指令为双操作数指令。
执行指令后,一般源操作数不变,目的操作数被计算结果替代。
. 机器指令由CPU执行,完成某种运算或操作,8086/8088指令系统中的指令分为6类: 数据传送,算术运算,逻辑运算,串操作,控制转移和处理机控制。
2. 寻址方式. 寻址方式确定执行指令时获得操作数地址的方法. 分为与数据有关的寻址方式(7种)和与转移地址有关的寻址方式(4)种。
. 与数据有关的寻址方式的一般用途:(1) 立即数寻址方式--将常量赋给寄存器或存储单元(2) 直接寻址方式--存取单个变量(3) 寄存器寻址方式--访问寄存器的速度快于访问存储单元的速度(4) 寄存器间接寻址方式--访问数组元素(5) 变址寻址方式(6) 基址变址寻址方式(7) 相对基址变址寻址方式(5),(6),(7)都便于处理数组元素. 与数据有关的寻址方式中,提供地址的寄存器只能是BX,SI,DI或BP. 与转移地址有关的寻址方式的一般用途:(1) 段内直接寻址--段内直接转移或子程序调用(2) 段内间接寻址--段内间接转移或子程序调用(3) 段间直接寻址--段间直接转移或子程序调用(4) 段间间接寻址--段间间接转移或子程序调用汇编程序和汇编语言1. 汇编程序. 汇编程序是将汇编语言源程序翻译成二进制代码程序的语言处理程序,翻译的过程称为汇编。
汇编语⾔⼊门汇编指令及寄存器详解教程⽬录前⾔什么是汇编语⾔汇编语⾔产⽣的原因汇编与⼆进制的关系寄存器寄存器作⽤存取速度⽐较寄存器分类常⽤寄存器⽤途寄存器EAX、AX、AH、AL的关系汇编语⾔指令数据传送指令算术运算指令逻辑运算指令循环控制指令转移指令linux 和 windows 下汇编的区别总结前⾔我们⼤都是被⾼级语⾔惯坏了的⼀代,源源不断的新特性正在逐步添加到各类⾼级语⾔之中,汇编作为最接近机器指令的低级语⾔,已经很少被直接拿来写程序了,不过我还真的遇到了⼀个,那是之前的⼀个同事,因为在写代码时遇到了成员函数权限及可见性的问题,导致他⽆法正确调⽤想执⾏的函数,结果他就开始在C++代码⾥嵌⼊汇编了,绕过了种种限制终于如愿以偿,但是读代码的我们傻眼了…因为项⽬是跨平台的,代码推送的 Linux 上编译的时候他才发现,汇编代码的语法在 Linux 和 Windows 上居然是不⼀样的,结果他⼜⽤⼀个判断平台的宏定义“完美”的解决了,最终这些代码肯定是重写了啊,因为可读性太差了,最近在学习左值、右值、左引⽤和右引⽤的时候,总是有⼈⽤程序编译⽣成的中间汇编代码来解释问题,看得我迷迷糊糊,所以决定熟悉⼀下简单的汇编指令,边学习边记录,⽅便今后忘记了可以直接拿来复习。
什么是汇编语⾔汇编语⾔是最接近机器语⾔的编程语⾔,引⽤百科中的⼀段话解释为:汇编语⾔(assembly language)是⼀种⽤于电⼦计算机、微处理器、微控制器或其他可编程器件的低级语⾔,亦称为符号语⾔。
在汇编语⾔中,⽤助记符代替机器指令的操作码,⽤地址符号或标号代替指令或操作数的地址。
汇编语⾔⼜被称为第⼆代计算机语⾔。
汇编语⾔产⽣的原因对于绝⼤多数⼈来说,⼆进制程序是不可读的,当然有能⼈可以读,⽐如第⼀代程序员,但这类⼈快灭绝了,直接看⼆进制不容易看出来究竟做了什么事情,⽐如最简单的加法指令⼆进制表⽰为00000011,如果它混在⼀⼤串01字符串中就很难把它找出来,所以汇编语⾔主要就是为了解决⼆进制编码的可读性问题。
汇编语言寄存器详解汇编语言是一种底层程序设计语言,与高级语言相比,汇编语言更接近于计算机硬件层面。
在汇编语言中,寄存器是一种非常重要的概念,它们用于存储数据和指令,以及进行计算和操作。
在本文中,我们将详细介绍汇编语言中常用的寄存器及其作用。
1. 通用寄存器通用寄存器是汇编语言中最基本的寄存器,它们可以用于存储数据、指针和地址等信息。
在x86架构中,通用寄存器有8个,分别为:AX,BX,CX,DX,SI,DI,BP和SP。
其中,AX,BX,CX和DX是16位寄存器,也就是说它们可以存储16位的数据。
SI和DI是用于存储指针和地址的寄存器,BP和SP 则是用于存储栈指针的寄存器。
2. 段寄存器在汇编语言中,除了通用寄存器以外,还有一种特殊的寄存器,叫做段寄存器。
段寄存器用于存储内存中某个段的起始地址,它们可以帮助程序员在内存中定位某个数据或指令。
在x86架构中,有4个段寄存器,分别为:CS,DS,SS和ES。
其中,CS用于存储代码段的地址,DS用于存储数据段的地址,SS用于存储堆栈段的地址,ES则可以用作附加段寄存器。
3. 标志寄存器标志寄存器是一种特殊的寄存器,它们用于存储程序运行中的各种状态信息。
在x86架构中,有一个标志寄存器,叫做FLAGS寄存器,它包含了各种标志位,用于表示程序运行中的各种状态信息。
其中,比较常用的标志位有:ZF(零标志位),CF(进位标志位),OF(溢出标志位)等。
这些标志位可以帮助程序员判断程序运行中的各种状态,从而进行相应的处理。
总的来说,寄存器是汇编语言中非常重要的概念,程序员需要熟练掌握各种寄存器的作用和用法,才能够编写出高效、正确的汇编程序。
第二章寻址方式在8086微处理器中,一条指令通常由操作码加上操作数构成。
指令形式为:操作码[操作数1], [操作数2]; 注释其中,操作码指明执行的动作,操作数指明操作的对象。
由于寄存器数量有限,操作数不可能都放在寄存器中,实际上,操作数既可以放在寄存器中,也可以放在主存贮器中,这样就涉及到操作数的寻址问题。
我们将寻址操作数存放地址的方式称为寻址方式。
本章的内容包括:主存储器和物理地址的形成寻址方式常量与变量的定义2.1 主存贮器和物理地址的形成一、主存贮器计算机存贮系统分为:主存贮器(内存)、辅助存贮器(外存)。
●主存容量小、存取速度快、价格高;●辅存容量大、存取速度慢、价格低。
主存贮器的基本存贮单位是“位”(bit ),每8位组合成一个“字节”;每相邻的两个字节称为“字”;相邻的四个字节称为“双字”。
为了区别各个存贮单元,给每个单元编号,称为地址。
地址:字节单元的编号,也称为物理地址。
低字节放低位,高字节放高位。
例如:0004单元存放内容为1234H 。
0 10FFFFFH 低地址 高地址 从0~0FFFFFH ,共有220个单元,20根地址线。
表示:(0004)字=1234H二、存储器物理地址的形成早期的8086微处理器,有20根地址线,寻址范围2^20 = 1M 字节。
但是,8086内部为16位结构,与地址相关的寄存器均为16位,从而导致可寻址范围为64K。
因此,设计成为将主存分段使用,每段最大为64K字节。
用CS、DS、SS、ES保存当前可用段的段首地址。
规定:段首地址只能从任一“小段”的首地址开始,也就是必须最低4位为0,如果所有的段首地址都是这样,则可以忽略最低4位,而只将高16位放到段寄存器中。
因此,计算物理地址时,应将段寄存器内容左移4位,恢复段首址原值,然后再与本段中待访问单元的偏移地址相加,得到访问单元的物理地址。
因此,被访问单元物理地址PA = 段首址*16+偏移地址。
汇编语⾔考试复习资料汇编语⾔期末复习资料整理第⼆章1、寄存器组(1)通⽤寄存器数据寄存器EAX(32位) AX(16位) AH(8位)(⾼位) AL(8位)(低位)累加器EBX(32位) BX(16位) BH(8位)(⾼位) BL(8位)(低位)基址变址ECX(32位) CX(16位) CH(8位)(⾼位)CL(8位)(低位)计数器EDX(32位) DX(16位) DH(8位)(⾼位) DL(8位)(低位)数据指针或变址寄存器ESP(32位) SP(16位)堆栈指针寄存器EBP(32位) BP(16位)基址指针寄存器EDI(32位) DI(16位)⽬的变址寄存器ESI(32位) SI(16位)源变址寄存器(2)专⽤寄存器EIP(32位) IP(16位)指令指针寄存器EFLAGS(32位) FLAGS(16位)标志寄存器ESP (32位) SP(16位)堆栈指针寄存器2、标志位的符号表⽰、3、段寄存器CS(16位)代码段 DS(16位)数据段SS(16位)堆栈段 ES(16位)附加段4、段寄存器和相应存放偏移地址的寄存器之间的默认组合第三章1、七种寻址⽅式(举例)⽴即寻 MOV AX,3069H寄存器寻 MOV AL,BH在内存中的五种寻址直接寻 MOV AX,[2000H]寄存器间接寻 MOV AX,[BX]寄存器相对寻 MOV AX,COUNT[SI] 或者 MOV AX,[SI+COUNT](不推荐) 基址变址寻址 MOV AX,[BP][DI]相对基址变址寻址 MOV AX,MASK[BX][SI]2、指令系统I.数据传送指令(1)通⽤数据传送指令MOV 传送MOVSX 带符号扩展传送⽤源操作数的符号位来填充⽬的操作数的⾼位数据位。
例:MOVSX EAX,CL把CL寄存器中的8位数,符号扩展为32位数,送到EAX寄存器中。
MOVZX 带零扩展传送恒⽤0来填充⽬的操作数的⾼位数据位例:MOVZX DX,AL把AL寄存器中的8位数,零扩展成16位数,送到DX寄存器中。
第1章自测练习一、选择题(四选一)1.某个加法运算结果使标志ZF=1,则标志SF为A。
A 0B 1C 不改变原来的状态D 不确定2.可以为存储器操作数提供偏移地址的寄存器组是B。
A AX、BX、CX、DXB BX、BP、SI、DIC SP、IP、BP、DXD CS、DS、ES、SS3.8086/8088确定下一条执行指令物理地址的计算表达式为D。
A DS× 16+EAB ES× 16+EAC SS×l6+SPD CS×l6+IP4.某系列微机对存储器分段,如果每个段最多的字存储单元(16位二进制)是32K,那么表示段内字节单元偏移地址的二进制位数应是C位。
A 14B 15C 16D 205.十进制数-100的8位二进制数的补码为 D 。
A 10011011B 01100100C 10011101D 100111006.下列各个8位二进制数的补码中,绝对值最大的是 A 。
A 10001000B 11111110C 00000100D 000000017.16位有符号数的补码所表示的十进制数的范围是B。
A -32767~+32768B -32768~+32767C -65535~+65536D 0~655358.对数值83A7H作逻辑非运算后的结果是D。
A 83A8H B、73A8H C、7C59H D、7C58H9.指令“mov cx,[bp+16]”的源操作数采用的段寄存器是 B 。
A CSB SSC DSD ES10.指向程序堆栈区的段寄存器是 B 。
A CSB SSC DSD ES11.有效地址是指 C 。
A 存储器操作数的物理地址B 存储器操作数的段地址C 存储器操作数的偏移地址D 立即数的偏移地址12.寄存器间接寻址方式中,操作数在 C 中。
A 通用寄存器B 段寄存器C 主存单元D 堆栈13.指令“mov ax,es:[bx][si]”源操作数的物理地址是D。
汇编语言学习笔记段寄存器一、CPU 的典型构成•CPU 中有很多部件,但一般最主要的有:寄存器运算器控制器 ,如下图是CPU 的主要结构:CPU 的典型构成.png(1)寄存器: 存东西的,比如我们做加法计算 20 + 30 ,那么数据20 和30 先存在寄存器中,在运算器中计算后再存储到寄存器中.CPU 中的寄存器,运算器等部件通过CPU中的控制器(总线)与外面的内存等其他部件相连.•对于程序员来说,CPU中最主要的部件是寄存器,可以通过改变寄存器的内容来实现对CPU的控制.(汇编学的好不好和寄存器学的好不好直接相关)•不同的CPU,寄存器的个数 \ 结构是不同的,8086 是16位的结构的CPU,但是地址总线是20位,可以访问1M的存储空间.•8086 有14个寄存器(都是16位的寄存器(可以存放2个字节))8086的14个寄存器.png二、通用寄存器•AX BX CX DX 这4个寄存器通常用来存放一般性的数据(eg: int a = 10 , int b =10 ) 称为通用寄存器(有时也有特殊用途).•通常,CPU会先将内存中的数据存储到通用寄存器中,然后在对通用寄存器中的数据进行运算.•假如,内存中有块红色内存空间的值是3,现在想把他加1,并将结果存储到内存中的蓝色内存空间,那么处理流程大致如下:数据操作流程.png1.CPU 首先会将红色内存空间中的值放到 AX 寄存器中(通用寄存器)中,即: movax , 红色内存空间 (将右边边红色内存空间的值存到左边AX 中 )2.然后让AX 寄存器(通用寄存器)与1相加.即: add ax ,1 (将右边的值1,与左边AX中的值相加并将结果存入左边AX中)3.最后将值(结果)赋值给蓝色内存空间.即: mov 蓝色内存空间, AX (将右侧AX中的值移动到左侧蓝色内存中)•AX BX CX DX 这4个通用寄存器都是16位的,可以存储2个字节,如下如: 8086通用寄存器.png•注意: 上一代8086 的寄存器都是8位的,为了保证兼容, AX BX CX DX 都可以分为2个8位的寄存器来使用.如下图:通用寄存器的拆分.png高8位低8位的拆分.png三、字节与字•在汇编的数据存储中,有两个比较常用的单位:字节和字. (相当于高级语言中的 int,long,float等数据类型).因此我们在汇编中只能定义两种数据类型的数据,字节类型(byte类型),字类型(word 类型))字节: byte ,1个byte 由8个bit组成,可以存储在8位寄存器中.字:word,1个字由两个字节组成,这两个字节分别称为字的高字节和低字节. •比如数据20000 (4E20H,01001110 00100000B),高字节值78,低字节值32. 字表示.png•1个字可以存储在一个16位寄存器中,这个字的高字节\低字节分别存储在这个存储器的高8位和低8位寄存器中.四、段寄存器•8086 在访问内存时要由相关部件提供内存单元的段地址和偏移地址送入地址加法器合成物理地址•是什么部件提供段地址? 答:段地址在8086的段寄存器中存放. (段segment )代码段寄存器: CS (code segment) 存放代码的数据段寄存器: DS (datasegment ) 存放数据的堆栈段寄存器: SS (stack segment ) 对象放堆里面,局部对象放栈里面附加段寄存器: ES (Extra segment)8086段寄存器.png•8086 有4个段寄存器,CS DS SS ES,当要访问内存时由这4个段寄存器提供内存单元段地址.•每个段寄存的具体作用是什么呢?一旦程序运行装载到内存当中,所有的代码\全局变量\局部变量\对象都装载到了内存当中,所以内存当中存在具体的代码和数据,也存在堆栈等等 ,那么CPU想访问内存段代码,那么他会访问法代码段寄存器,如果CPU想想问堆栈中的数据那么他会访问栈寄存器,依次类推就是这样的.。