《汇编语言》寄存器物理地址(第二章第二节)
汇编语言寄存器和指令操作的整理
与DS联用, 指示数据段中某操作数的偏移量, 或与某一位移量共同构成操作数的偏移量. 串处理操作时, DI指示附加段中目的地址, 并有自动增量或减量的功能
段寄存器l CS 代码段
存放当前程序的指令代码
l DS 数据段
存放程序所涉及的源数据或结果
l SS 堆栈段
当运算结果的最高位为1时, SF为1, 否则为0. 最高位表示符号数的正和负
6. TF 跟踪标志位
用于调试程序时进入单步方式工作. TF=1时, 每条指令执行完后产生一个内部中断, 让用户检查指令运行后寄存器, 存储器和各标志位的内容. TF=0时, CPU工作正常, 不产生内部中断
7. IF 中断允许标志位
l POP DST ;出栈指令: 弹出栈顶元素, 后将栈顶指针向栈底方向移动一个字
l XCHG OPR1, OPR2 ;交换指令: 将这两个操作数交换
地址传送指令:
l LEA DST, SRC ;装载有效地址指令: 该指令将源操作数的偏移量OA装载到目的操作数中
算术运算指令加法指令:
l ADD DST, SRC ;DST+SRC的和存放到DST中去
l ADC DST, SRC ;带进位加法指令, DST+SRC+CF
l INC DST ;增1指令
减法指令:
l LOOPZ/LOOPE, LOOPNZ/LOOPNE ;前者用于找到第一个不为0的事件, 后者用于找到第一个为0的事件
子程序调用指令:
l imme: 立即数
l DST: 目的操作数
l SRC: 源操作数
l mem: 存储器操作数
汇编语言手册
寄存器与存储器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(溢出标志位)等。
这些标志位可以帮助程序员判断程序运行中的各种状态,从而进行相应的处理。
总的来说,寄存器是汇编语言中非常重要的概念,程序员需要熟练掌握各种寄存器的作用和用法,才能够编写出高效、正确的汇编程序。
汇编语言—寄存器
1.1、传送指令
指令的语法 MOV reg,reg MOV mem,reg MOV reg,mem MOV mem,immed MOV reg,immed MOV mem,accum MOV accum,mem MOV segreg,reg16 MOV segreg,mem16 MOV reg16,segreg MOV mem16,segreg MOV reg32,controlreg MOV controlreg,reg32 MOV reg32,debugreg MOV debugreg,reg32 举例 mov bp,sp mov array[di],bx mov bx,pointer mov [bx],15 mov cx,256 mov total,ax mov al,string mov ds,ax mov es,psp mov ax,ds mov stack_save,ss mov eax,cr0 mov eax,cr2 mov eax,cr3 mov eax,cr4 mov cr0,eax mov edx,dr0 mov dr0,ecx 周期数 1 1 1 1 1 1 1 2, 3 2, 3 1 1 22 12 21, 46 14 4 DR0-DR3, DR6,DR7=11 DR4,DR5=12 DR0-DR3, DR4,DR5=12 DR6,DR7=11
1.6、出栈指令
POP reg POP mem POP segreg POPA POPAD POPF POPFD pop cx pop param pop es popa popad popf popfd 1 3 3 5 5 6, pm=4 6, pm=4
汇编语言第二章 寻址方式
第二章寻址方式在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寄存器中。
汇编语言习题答案 (2)
第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想想问堆栈中的数据那么他会访问栈寄存器,依次类推就是这样的.。
《汇编语言》第二章2
2.8 段的概念
错误认识:
内存被划分成了一个一个的段,每一个段有一 个段地址。
其实:
内存并没有分段,段的划分来自于CPU,由于 8086CPU用“(段地址×16)+偏移地址=物 理地址”的方式给出内存单元的物理地址, 使得我们可以用分段的方式来管理内存。
更多精彩资编程源请关注:
2.12 代码段
对于8086PC机,在编程时,可以根据需 要,将一组内存单元定义为一个段。
可以将长度为 N( N≤64KB )的一组代 码,存在一组地址连续、起始地址为 16 的倍数的内存单元中,这段内存是用来 存放代码的,从而定义了一个代码段。
更多精彩资编程源请关注:
问题分析:CPU运行的流程
内存中存放的机器码和对应汇编指令情况: (初始:CS=2000H,IP=0000H)
更多精彩资编程源请关注:
问题分析结果:
(1)mov ax,6622 (2)jmp 1000:3 (3)mov ax,0000 (4)mov bx,ax (5)jmp bx (6)mov ax,0123H (7)转到第(3)步执行
更多精彩资编程源请关注:
2.10 CS和IP
在任何时候,CPU将CS、IP中的内容当作 指令的段地址和偏移地址,用它们合成 指令的物理地址,到内存中读取指令码, 执行。 如果说,内存中的一段信息曾被CPU执行 过的话,那么,它所在的内存单元必然 被CS:IP指向过。
更多精彩资编程源请关注:
2.9节~2.12节 小结(续)
3、8086CPU的工作过程:
汇编寄存器功能详解
汇编寄存器功能详解汇编语言是一种底层语言,与计算机硬件直接交互。
在汇编语言中,寄存器是一组特殊的存储单元,用于暂时存储数据或指令。
它们在处理器中的位置较为接近,可以快速访问。
在汇编语言中,寄存器被分为通用寄存器、数据段寄存器、指令指针寄存器、标志寄存器等几个类别,每个寄存器都有特定的功能。
一、通用寄存器通用寄存器是CPU中最常见的寄存器,用于存放临时数据和计算的结果。
通用寄存器是命名的,有固定的用途,分别是AX(累加寄存器)、BX(基址寄存器)、CX(计数寄存器)、DX(数据寄存器)、SI(源变址寄存器)、DI(目的变址寄存器)、SP(堆栈指针寄存器)和BP(基址指针寄存器)。
1. AX寄存器(Accumulator Register):是累加器寄存器,用于存放算术和逻辑运算的结果。
在一些特定指令中,它还可以充当乘法或除法运算的除数或被除数。
2. BX寄存器(Base Register):是基址寄存器,通常用于存放数据内存的基址。
它也可以充当累加器或存放地址偏移量的累加器。
3. CX寄存器(Count Register):是计数寄存器,在一些循环指令中用于记录循环迭代的次数。
此外,它还可以充当数据传输或移位指令的位数计数器。
4. DX寄存器(Data Register):是数据寄存器,通常用于存放数据操作的源数据或目标数据。
它也可以存放除法运算的余数或乘法运算的高位结果。
5. SI寄存器(Source Index Register):是源变址寄存器,用于存放源数据的偏移地址。
在字符串或数组的操作中,它通常与DI寄存器共同使用。
6. DI寄存器(Destination Index Register):是目的变址寄存器,用于存放目标数据的偏移地址。
在字符串或数组的操作中,它通常与SI寄存器共同使用。
7. SP寄存器(Stack Pointer Register):是堆栈指针寄存器,用于指向栈顶位置。
汇编语言之寄存器详解
汇编语⾔之寄存器详解上图是cpu中三个组成部分:寄存器运算器控制器。
其中寄存器是cpu中程序员⽤指令读取的唯⼀部件(调剂界⾯中的寄存器窗⼝)。
如果是16位cpu,就是处理,传输,暂时存储的数据长度都是16位。
所以16位的cpu,寄存器也是16位。
《汇编语⾔》这本书中使⽤的是16位寄存器位例⼦来讲的,所以下⾯的内容也都是16位寄存器的。
ps:查看处理器型号以及⼏核cpu,我现在的电脑4核64位寄存器名字16位的寄存器有:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。
32位寄存器就是前⾯加个E,64位前⾯加个R。
vs中解决⽅案平台选择x86——32位寄存器,可以存数32位⼆进制数据vs中解决⽅案平台选择x64——64位各种类型的寄存器在下⾯介绍各个寄存器的时候,都⽤16位的寄存器作为介绍。
同种类型的32位和64位寄存器功能⼀样,只是处理的数据宽度更⼤了。
同时介绍⼀些汇编指令(汇编指令不区分⼤⼩写)。
1.通⽤寄存器——AX BX CX DX作⽤:存放⼀般性的数据传送指令:movemov 转移指令,⼤部分的寄存器都可以⽤这个指令来改变其值。
常⽤的有:不仅限于下⾯⼏种1.move 某⼀个合法寄存器某⼀个合法寄存器将⼀个寄存器的内容传送到另⼀个寄存器⽐如:move 段寄存器(ds,cs),通⽤寄存器——段寄存器的值不能直接通过数据来设定2.move 某⼀个合法寄存器数据将数据直接传⼊寄存器3.move 某⼀个合法寄存器 [内存单元的偏移地址]将⼀个内存单元中的内容存⼊⼀个寄存器中,后⾯将DS寄存器的时候再讲。
算术运算指令:add,subadd 寄存器,数据/寄存器/内存单元add 内存单元,寄存器(如何记住⼀个⼆进制数据左移1位相当于乘以2,左移n位,相当于乘以2的N倍:⼀个10进制的数左移1位,相当于乘以10,左移n位,相当于乘以10的N倍。
)2.CS,IP——代码段CS(code)IP(instruction pointer)是最关键的两个寄存器,代码段寄存器和指令指针寄存器,他们的内容提供了cpu要执⾏指令的地址。
图文详解通俗易懂的汇编语言寄存器
图⽂详解通俗易懂的汇编语⾔寄存器⽬录认识寄存器计算机架构中的寄存器通⽤寄存器AX 寄存器BX 寄存器CX 寄存器DX 寄存器索引寄存器状态和控制寄存器物理地址什么是段段寄存器CS 寄存器什么是 Code SegmentDS 寄存器栈栈和 SS 寄存器栈顶越界问题下⾯我们就来介绍⼀下关于寄存器的相关内容。
我们知道,寄存器是 CPU 内部的构造,它主要⽤于信息的存储。
除此之外,CPU 内部还有运算器,负责处理数据;控制器控制其他组件;外部总线连接CPU 和各种部件,进⾏数据传输;内部总线负责 CPU 内部各种组件的数据处理。
那么对于我们所了解的汇编语⾔来说,我们的主要关注点就是寄存器。
为什么会出现寄存器?因为我们知道,程序在内存中装载,由 CPU 来运⾏,CPU 的主要职责就是⽤来处理数据。
那么这个过程势必涉及到从存储器中读取和写⼊数据,因为它涉及通过控制总线发送数据请求并进⼊存储器存储单元,通过同⼀通道获取数据,这个过程⾮常的繁琐并且会涉及到⼤量的内存占⽤,⽽且有⼀些常⽤的内存页存在,其实是没有必要的,因此出现了寄存器,存储在 CPU 内部。
认识寄存器寄存器的官⽅叫法有很多,Wiki 上⾯的叫法是Processing Register,也可以称为CPU Register,计算机中经常有⼀个东西多种叫法的情况,反正你知道都说的是寄存器就可以了。
认识寄存器之前,我们⾸先先来看⼀下 CPU 内部的构造。
CPU 从逻辑上可以分为 3 个模块,分别是控制单元、运算单元和存储单元,这三部分由 CPU 内部总线连接起来。
⼏乎所有的冯·诺伊曼型计算机的 CPU,其⼯作都可以分为5个阶段:取指令、指令译码、执⾏指令、访存取数、结果写回。
取指令阶段是将内存中的指令读取到 CPU 中寄存器的过程,程序寄存器⽤于存储下⼀条指令所在的地址指令译码阶段,在取指令完成后,⽴马进⼊指令译码阶段,在指令译码阶段,指令译码器按照预定的指令格式,对取回的指令进⾏拆分和解释,识别区分出不同的指令类别以及各种获取操作数的⽅法。
汇编语言之寄存器(详细介绍)
汇编语言之寄存器(详细介绍)1、寄存器32位寄存器有16个,分别是:4个数据寄存器(EAX、EBX、ECX、EDX)。
2个变址和指针寄存器(ESI和EDI);2个指针寄存器(ESP和EBP)。
6个段寄存器(ES、CS、SS、DS、FS、GS)。
1个指令指针寄存器(EIP);1个标志寄存器(EFlags)。
2、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位通用寄存器:EAX、EBX、ECX和EDX。
对低16位数据的取存,不会影响高16位的数据,这些低16位寄存器分别命名为AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:ah~al、BX:bh~bl、CX:ch~cl:DX:dh~dl)。
每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可合可分”的特性,灵活地处理字/字节的信息。
AX和al通常称为累加器,用累加器进行的操作可能需要更少时间,累加器可用于乘、除、输入/输出等操作,它们的使用频率很高。
BX称为基地址寄存器,它可作为存储器指针来使用。
CX称为计数寄存器,在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用cl来指明位移的位数。
DX称为数据寄存器,在进行乘、除运算时,它可以为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据、保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
3、变址寄存器32位CPU有2个32位通用寄存器ESI和EDI,其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。
汇编语言学习笔记之物理地址
汇编语⾔学习笔记之物理地址物理地址CPU访问内在单元时,要给出内存单元的地址。
所有的内存单元构成的存储空间是⼀个⼀维的线性空间,每⼀个内存单元在这个空间中都有惟⼀的地址,我们将这个惟⼀的地址称为物理地址。
CPU通过地址总线送⼊存储器的必须是⼀个内存单元的物理地址。
在CPU向地址总线上发出物理地址之前,必须在内部先形成这个物理地址。
不同的CPU可以有不同的形成物理地址的⽅式。
下⾯讨论8086CPU是如何在内部形成内存单元的物理地址的。
8086CPU16位结构的CPU,具有下⾯⼏⽅⾯的结构特性:运算器⼀次最多可以处理16位的数据;寄存器的最⼤宽度为16位;寄存器和运算器之间的通路为16位。
8086CPU读写内存的过程:1. CPU中的相关部件提供两个16位的地址,⼀个称为段地址,另⼀个称为偏移地址;2. 段地址和偏移地址通过内部总线送⼊⼀个称为地址加法器的部件;3. 地址加法器将两个16位地址合成为⼀个20位的物理地址;4. 地址加法器通过内部总线将20位物理地址送⼊输⼊输出控制电路;5. 输⼊输出控制电路将20位物理地址送上地址总线;6. 20位物理地址被地址总线传送到存储器。
地址加法器采⽤物理地址=段地址*16+偏移地址的⽅法⽤段地址和偏移地址合成物理地址。
CPU可以⽤不同的段地址和偏移地址形成同⼀个物理地址。
例如:CPU要访问21F60H单元,则它给出的段地址SA和偏移地址EA满⾜SA*16+EA=21F60H即可。
如果给定⼀个段地址,仅通过变化偏移地址来进⾏寻址,最多可定位多少内存单元?偏移地址16位,变化范围为0~FFFFH,仅⽤偏移地址来寻址最多可寻64KB个内存单元。
⽐如给定段地址1000H,⽤偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH。
“数据在21F60H内存单元中”对于8086CPU的意思是:数据存在内存2000:1F60单元中;或者,数据存在内存的2000段中的1F60单元中。
汇编语言-寄存器
汇编语⾔-寄存器2.1 通⽤寄存器AX, BX, CX, DX 这4个寄存器通常⽤来存放⼀般性的数据,被称为通⽤寄存器。
8086CPU这5个寄存器都可以分为两个可以独⽴使⽤的8位寄存器来⽤:AX可分为AH和AL;BX可分为BH和BL;CX可分为CH和CL;DX可分为DH和DL;AX的低8位(0 - 7)构成AL寄存器,⾼8位(8 - 15)构成了AH寄存器。
AH和AL寄存器是可以独⽴使⽤的8位寄存器。
2.2 字在寄存器中的存储考虑兼容性8086CPU可以⼀次性处理⼀下两种尺⼨的数据。
字节:记为byte,⼀个字节由8个bit组成,可以存在8位寄存器中。
字:记为word,⼀个字由俩个字节组成,这两个字节分别称为这个字的⾼位字节和低位字节。
2.3 ⼏条汇编指令汇编指令控制CPU完成的操作⽤⾼级语⾔表述MOV ax,18将18送⼊寄存器ax ax = 18ADD ax,8将寄存器ax中的数值加上8ah = ax + 8注意指令的两个操作对象的位数应当是⼀致的。
例:ax为16位寄存器,只能放4位16进制位数,所以多余的⾼位会丢失。
2.4 物理地址CPU访问内存单元时,要给出内存单元的地址。
所有内存单元构成的存储空间时⼀个⼀维的线性空间,每⼀个内存单元在这个空间中都有唯⼀的地址,我们将这个唯⼀的地址称为物理地址。
CPU通过地址总线送⼊存储器,必须是⼀个内存单元的物理地址。
在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。
不同的CPU可以有不同的形成物理地址的⽅式。
物理地址 = 段地址 × 16 + 偏移地址段地址×16 就是左移4位24 = 16。
4位2进制等于⼀位16进制所以16进制向左移⼀位。
段地址×16必然是16的倍数,所以⼀个段的起始地址也是16的倍数;偏移地址位16位,16位地址的寻址能⼒为64kb,所以⼀个段的最⼤为64kb。
64kb = 216 / 1024; 216 = 65536 byte;2.5 段寄存器8086CPU有4个段寄存器:CS, DS, SS, ES。
汇编学习笔记之寄存器
寄存器8086/8088 包括四个16为数据寄存器,两个16为指针寄存器,两个16位变址寄存器,一个16为指令指针,四个16位段寄存器,一个16位标志寄存器,这14个寄存器分为四组通用寄存器:AX BX CX DX 通用寄存器SP 堆栈指针BP 基址指针SI 源地址DI 目的地址SP BP SI DI 也为通用寄存器控制寄存器:IP 指令指针FLAG 标志寄存器段寄存器:CS 代码段寄存器DS 数据段寄存器SS 栈段寄存器ES 附加段寄存器1. 标志寄存器16位的标志寄存器FLAG包含九个标志,分为两组第一组:6个主要受加减运算和逻辑运算结果的影响,成为运算结果标志第二组:3个不受运算结果的影响,称为状态控制标志运算结果标志:1> 进位标志CF (Carry Flag)主要用于反映运算是否产生进位或借位,如果运算结果的最高位(字操作数为第15位,字节操作数为第7位)产生一个进位或借位,则CF被置为1,否则置为0,移位指令把操作数的最高位或最地位移入CF。
在进行多字节数的加减运算时,要使用到该标志。
在比较无符号整数的大小是,要使用到该标志。
2> 零标志ZF (Zero Flag)用于反映运算结果是否为0,如果结果为0 ,则置ZF为1,否则置为0.在判断运算结果是否为0时,用到该标志。
3> 符号标志SF(Sign Flag)用于反映运算结果的符号位,SF与运算结果的最高位相同,如果运算结果的最高位为1,则SF 置为1,否则被清0,在8086/8088中,有符号数采用补码的形式表示,所以SF反映运算结果的符号,如果运算结果为正,则SF为正(补码最高位为0),则被置0,运算结果为负,置为14> 溢出标志OF (OverFlow Flag)反映有符号数加减运算是否溢出,如果运算结果超出了8位或16位有福好的数的表示范围,即在字节运算时大于127或小于-128,在字的运算时大于65535或小于–65536,称为溢出溢出时OF =1;未溢出OF =0;5> 奇偶标志PF (Parity Flag)奇偶标志反映运算结果中1 的个数,如果1的个数为偶数,则PF =1 ,否则PF =0利用奇偶标志可以进行奇偶校验检查。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS ES SS CS 地 址 加 法 IP 器 地 址 总 线 AB
本课件由汇编网()制作提供
物理地址PA = 段地址 + 偏移地址 = ( 段寄存器 ) × 10H + 偏移地址 或段寄存器的内容左移4位,加上偏移地址
例:某内存单元的段地址由DS、偏移地址由BX给出。
2.5 16位结构的CPU
概括的讲,16位结构描述了一个CPU具有 以下几个方面特征:
1、运算器一次最多可以处理16位的数据。 2、寄存器的最大宽度为16位。 3、寄存器和运算器之间的通路是16位的。
2.6 8086CPU给出物理地址的方法
8086有20位地址总线,可传送20 位地址,寻址能力为1M。 8086内部为16位结构,它只能传送 16位的地址,表现出的寻址能力却 只有64K。
2.7 “段地址×16+偏移地址=物理地址” 的本质含义
两个比喻说明:
说明“基础地址+偏移地址 = 物理地址” 的思想:第一个比喻 说明“段地址×16+偏移地址=物理地址” 的思想:第二个比喻 8086CPU就是这样一个只能提供两张3位 数据纸条的CPU。
2.8 段的概念
错误认识:
内存被划分成了一个一个的段,每一个 段有一个段地址。
通用寄存器
数据寄存器(AX,BX,CX,DX) 地址指针寄存器(SP,BP) 变址寄存器(SI,DI)
5
2.1 通用寄存器
8086CPU所有的寄存器都是16位的, 可以存放两个字节。 AX、BX、CX、DX 通常用来存放一般 性数据被称为通用寄存器。 下面以AX为例,我们看一下寄存器的 逻辑结构。
2.1 通用寄存器
以AX为例,8086CPU的16位寄存器分 为两个8位寄存器的情况:
2.1 通用寄存器
AX的低8位(0位~7位)构成了AL寄存 器,高8位(8位~15位)构成了AH寄 存器。 AH和AL寄存器是可以独立使用的8位寄 存器。 8086CPU的8位寄存器数据存储情况 一个8位寄存器所能存储的数据的最大 值是多少? 答案:28-1。
2.3 几条汇编指令
1
汇编指令不区分大小写
2.3 几条汇编指令
CPU执行下表中的程序段的每条指令后, 对寄存器中的数据进行的改变。
2.3 几条汇编指令
地址寄存器
包括指针和变址寄存器SI、DI、SP、 BP四个16位寄存器。顾名思义,它们 可用来存放存储器的偏移地址。另外, 它们也可以作为通用寄存器用。严格 地说,用来存放存储器偏移地址的寄 存器都应该叫地址寄存器,如BX基址 寄存器、IP指令指针寄存器等。
控制寄存器
IP 指令指针寄存器:用来存放代码段中的偏移地址, 指出当前正在执行指令的下一条指令所在单元的偏 移地址。 FLAGS标志寄存器:其中的某位代表CPU的一个标 志,最低位为D0,最高位为D15。8086CPU的标 志寄存器共有9个标志,分别为6个条件码标志和3 控制标志。其含义如下:
《汇编语言》课件
第2章 寄存器(CPU工作原理)
2.1 通用寄存器 2.2 字在寄存器中的存储 2.3 几条汇编指令 2.4 物理地址 2.5 16位结构的CPU 2.6 8086CPU给出物理地址 的方法
2.7 “段地址×16+偏移地址 =物理地址”的本质含义 2.8 段的概念 2.9 段寄存器 2.10 CS和IP 2.12 代码段
2.6 8086CPU给出物理地址的方法
8086CPU采用一种在内部用两个16位 地址合成的方法来形成一个20位的物 理地址。 8086CPU相关部件的逻辑结构
地址加法器
地址加法器合成物理地址的方法: 物理地址=段地址×16+偏移地址 物理地址=段地址×10H+偏移地址 例如: 8086CPU访问地址为123C8H的内存单元代码段数据段 附加 Nhomakorabea 堆栈段
CS
DS ES SS
IP
BX、SI、DI等地址 寄存器 BX、SI、DI等地址 寄存器 SP或BP
本课件由汇编网()制作提供
例1段寄存器与其偏移地址如下,写出其相应 的物理地址及含义。 CS=1896H,IP=1655H 当前要执行的指令的物理地址 =18960H+1655H=19FB5H DS=2896H,EA=1655H 当前要访问的数据的物理地址 =28960H+1655H=29FB5H ES=1896H,EA=2655H 当前要访问的数据的物理地址 =18960H+2655H=1AFB5H SS=1896H,SP=3655H 当前要访问的堆栈的物理地址 =18960H+3655H=1BFB5H
由段地址×16引发的讨论
由段地址×16引发的讨论
观察移位次数和各种形式数据的关系:
(1)一个数据的二进制形式左移1位,相当于该数据乘以2; (2)一个数据的二进制形式左移N位,相当于该数据乘以2的 N次方; (3)地址加法器如何完成段地址×16的运算?
以二进制形式存放的段地址左移4位。
例2 段寄存器与内存的分段情况如图。观察各 段的大小及分布,判断其地址范围,标出每个 段首地址和末地址。
代码段共64KB单元,它 的地址范围应该是 210E0H~310DFH。 附加段只有2KB,地址范 围在34600H~34CFFH 之间。 数据段为16KB,其地址 范围为34D00H~ 38CFFH。 你懂了吗? 堆栈段只有512个字节单 元,它的地址范围是 84180H~8437FH。
2.9 段寄存器
段寄存器就是提供段地址的。 8086CPU有4个段寄存器: CS、DS、SS、ES
当8086CPU要访问内存时,由这4个 段寄存器提供内存单元的段地址。
段的类型 8086汇编语言中把逻辑段分为四种类型, 分别是代码段、数据段、附加段和堆栈段。 各段的逻辑地址对应表:
段名 段寄存器 偏移地址
2.1 通用寄存器
一个16位寄存器可以存储一个16位的数 据。(数据的存放情况) 一个16位寄存器所能存储的数据的最大 值为多少? 答案:216-1。
2.1 通用寄存器
8086上一代CPU中的寄存器都是8位的; 为保证兼容性,这四个寄存器都可以分 为两个独立的8位寄存器使用。 AX可以分为AH和AL; BX可以分为BH和BL; CX可以分为CH和CL; DX可以分为DH和DL。 8086CPU的8位寄存器存储逻辑
标志名
进位标志 符号标志 零标志 溢出标志 辅助进位 标志 奇偶标志
标志
CF SF ZF OF AF
值为1
CY NG ZR OV AC
值为0
NC PL NZ NV NA
PF DF
IF
PE DN
EI
PO UP
DI
方向标志
中断标志
2.4 物理地址
CPU访问内存单元时要给出内存单元 的地址。所有的内存单元构成的存储 空间是一个一维的线性空间。 每一个内存单元在这个空间中都有唯 一的地址,这个唯一的地址称为物理 地址。
2.2 字在寄存器中的存储
一个字可以存在一个16位寄存器中, 这个字的高位字节和低位字节自然 就存在这个寄存器的高8位寄存器 和低8位寄存器中。
关于数制的讨论
由于一个内存单元可以存放 8位数据, CPU中的寄存器又可存放 n 个 8位数据。 也就是说,计算机中的数据大多 是由1~N个8位数据构成的。 用十六进制来表示数据可以直观的看 出这个数据是由哪些8位数据构成的。
段起始地址:小段首地址
~ ~ ~
0000F H 0001F H 0002F H
溢出标志
方 向 标 志
中断标志 跟踪标志号标志 零标志 奇偶标志 符 进位标志 辅助进位标志
在DEBUG调试环境下以字母缩写的形式 表示各个标志位的状态。
进入DEBUG后,用R命令查看寄存器状 态时,可以看到除了跟踪标志以外的标 志位的状态。
例1 两个二进制数相加运算,有关标志 位自动发生变化。 10011010 + 01001011 11100101 CPU会自动地把标志位设为:CF=0, SF=1,ZF=0,OF=0,即无进位,结 果为负数,结果不为0,没有溢出。
因为是重点所以再重复一次:地址加法器的工作原理 可表示为: 物理地址PA = 段地址 + 偏移地址 = ( 段寄存器 ) × 16 + 偏移地址 = ( 段寄存器 ) × 10H + 偏移地址 即段寄存器的内容左移4位,加上偏移地址
DS ES SS CS 地 址 加 法 IP 器 地 址 总 线 AB
本课件由汇编网()制作提供
要点:
物理地址PA = 段地址 + 偏移地址 = ( 段寄存器 ) × 10H + 偏移地址 物理地址20位,段地址20位,偏移地址16位。 (段地址由16位的段寄存器给出,可将段地址直接用16位表示)
由16位段寄存器决定有216 = 64 K个段值 由16位偏移地址决定每个段的大小为0 ~ 64K 每个段最大64 K,但不一定是64 K,可据需要分配。
2.8 段的概念
我们也可以认为地址10000H~1007FH、 10080H~100FFH 的内存单元组成两个段, 它们的起始地址( 基础地址 )为10000H 和10080H,段地址为:1000H 和1008H, 大小都为80H。
2.8 段的概念