汇编寄存器功能详解
汇编语言——寄存器

汇编语⾔——寄存器⼀、栈的基本概念栈有两个基本的操作:⼊栈和出栈。
⼊栈:将⼀个新的元素放到栈顶;出栈:从栈顶取出⼀个元素。
栈顶的元素总是最后⼊栈,需要出栈时,⼜最先被从栈中取出。
栈的操作规则:后进先出8086CPU提供的栈机制8086CPU提供⼊栈和出栈指令:(最基本的)PUSH(⼊栈)POP (出栈)push ax:将寄存器ax中的数据送⼊栈中;pop ax :从栈顶取出数据送⼊ax。
push和pop指令也可以在内存和寄存器传输数据(以栈的形式)8086CPU的⼊栈和出栈操作都是以字为单位进⾏的。
⽰例:1 2 3 4 5 6 7 8 9 10 11假设将10000H~1000FH这段内存当作栈来使⽤(其实CPU并不知道这段是代码段,数据段还是栈段,都是⼈为设定的)下⾯⼀段指令的执⾏过程:mov ax,0123H# AX=0123Hpush ax # 将AX的值推⼊栈中mov bx,2266H# BX=2266Hpush bx # 将BX的值推⼊栈中mov cx,1122H# CX=1122Hpush cx # 将CX的值推⼊栈中pop ax # 将栈顶的2个内存单元取出放到AX寄存器中,AX=1122Hpop bx # 将栈顶的2个内存单元取出放到BX寄存器中,BX=2266Hpop cx # 将栈顶的2个内存单元取出放到CX寄存器中,CX=0123H那么问题来了,在执⾏push和pop的时候,如何知道哪个单元是栈顶单元?8086CPU中,有两个寄存器:段寄存器SS 存放栈顶的段地址寄存器SP 存放栈顶的偏移地址任意时刻,SS:SP指向栈顶元素。
⼆、push和pop指令push 指令的执⾏过程在执⾏push ax指令时,主要做了⼀下2件事(1)先将SP=SP–2(2)将ax中的内容送⼊SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
pop 指令的执⾏过程在执⾏pop ax指令时,主要做了⼀下2件事(1)先将SS:SP指向的内存单元处的数据送⼊ax中;(2)SP = SP+2,SS:SP指向当前栈顶下⾯的单元,以当前栈顶下⾯的单元为新的栈顶。
汇编语言入门汇编指令及寄存器详解教程

汇编语⾔⼊门汇编指令及寄存器详解教程⽬录前⾔什么是汇编语⾔汇编语⾔产⽣的原因汇编与⼆进制的关系寄存器寄存器作⽤存取速度⽐较寄存器分类常⽤寄存器⽤途寄存器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. 寄存器功能. 寄存器的一般用途和专用用途. 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. 汇编程序. 汇编程序是将汇编语言源程序翻译成二进制代码程序的语言处理程序,翻译的过程称为汇编。
在8086汇编语言中ax,_bx,_cx,_dx四个寄存器的常见用途

在8086汇编语言中ax, bx, cx, dx四个寄存器的常见用途1. 引言1.1 概述在8086汇编语言中,AX、BX、CX和DX是四个常见的寄存器。
这些寄存器具有不同的功能和用途,可以提供对数据的临时存储和处理。
它们在程序设计中扮演着重要的角色,并且对于编写高效且功能完善的汇编代码至关重要。
1.2 文章结构本文将详细讨论AX、BX、CX和DX四个寄存器的常见用途。
首先,我们将探讨AX寄存器及其在累加、函数返回值传递以及数据处理和运算中的作用。
然后,我们将研究BX寄存器,在基址寄存器、指针地址存储以及字符串操作方面的应用。
接下来,我们将介绍CX寄存器在计数与循环控制、位移与移位操作以及I/O 端口控制方面的功能。
最后,我们将讲解DX寄存器在数据传输、中断向量以及I/O端口地址存储方面所起到的重要作用。
1.3 目的通过深入理解AX、BX、CX和DX四个常用寄存器以及它们各自的应用领域,读者将能够更好地理解如何在8086汇编语言中使用这些寄存器,并且能够优化自己的编程技巧。
此外,对于那些希望进一步学习汇编语言的人来说,本文还可作为入门指南,提供了有关寄存器功能和用途的基本知识。
2. AX寄存器的常见用途:2.1 累加器:AX寄存器是8086汇编语言中最常用的累加器。
作为一个通用寄存器,它被广泛用于执行不同类型的运算,例如加法、减法、乘法和除法操作。
在进行加法或减法运算时,我们可以将待操作的数值加载到AX寄存器,并且可以通过执行ADD或SUB指令来实现加法或减法操作。
以乘法为例,其中一个乘数会被放入AX寄存器中,并通过执行MUL(无符号)或IMUL(有符号)指令与另一个操作数进行相乘。
2.2 存储函数返回值:在很多情况下,子程序会将其返回值保存在AX寄存器中。
当调用某个函数或子程序时,该函数或子程序可能会要求将结果返回给调用者。
这时候,函数会将结果保存在AX寄存器中,并通过RETN指令将控制权交还给调用者,从而返回函数的执行结果。
汇编语言的指令和寄存器

5.XLAT是(查表转换指令)把BX+AL为偏移的字节指向的值传送到AL。DS位段偏移量。
6.MOVSX(符号传送指令)8到16,把高8位全弄成符号位。
7.MOVZX(领扩展指令)8到16,把高8位全弄成0;
8.BSWAP(字节交换指令)特指32位的数。针对本个数。
4》结果的特征将放在FLAGS中:
1.CF:进位标志。
2.PF:奇偶标志。
3.AF:辅助进位标志。
4.ZF:零标志。
5.OF:溢出标志。
(5)奇偶标志 PF
(6)辅助进位标志AF
2>.状态控制标志
(1)方向标志DF
(2)中断允许标志IF
(3)追踪标志TF
3》1.lea是送偏移量;到寄存器
2.LDS是把一个32位的数,分别送到DS和BX中,LDS BX,list
3.SAHF是把AH送到FLAGS的低八位中,
复习一下汇编的基础知识,主要是Intel 8086的CPU。16机器
1.通用寄存器
(1)数据寄存器
数据寄存器共有4个寄存器AX、BX、CX、DX,用来保存操作数或运算结果等信息。
AX寄存器称为累加器。使用频度最高,用于算术、逻辑运算以及与外设传送信息等。
BX寄存器称为基址寄存器。常用于存放存储器地址。
CX寄存器称为计数器。一般作为循环或串操作等指令中的隐含计数器。
DX寄存器称为数据寄存器。常用来存放双字数据的高16位,或存放外设端口地址。
(2)变址和指针寄存器
变址和指针寄存器包括SI、DI、SP、BP 4个16位寄存器,主要用于存放某个存储单元的偏移地址。
汇编语言中寄存器介绍

汇编语言中寄存器介绍寄存器是汇编语言中非常重要的概念,它们用于存储和操作数据。
在本文中,将介绍汇编语言中常用的寄存器,并详细解释它们的功能和用途。
1. 通用寄存器通用寄存器是最常用的寄存器,在汇编语言中使用频率较高。
通常有四个通用寄存器,分别是AX、BX、CX和DX。
这些寄存器既可用于存储数据,也可用于进行算术运算。
例如,将数据从内存加载到通用寄存器中,进行加法或减法运算,然后将结果存回内存。
2. 累加器寄存器累加器寄存器是AX寄存器的别名。
AX寄存器在处理循环和计数时非常有用。
它还可以用于存储需要频繁访问的数据,例如需要进行累加或累减的数值。
3. 基址寄存器基址寄存器是BX寄存器的别名。
它与偏移量配合使用,用于计算内存地址。
通常在存储大量数据的数组或缓冲区中使用。
4. 计数器寄存器计数器寄存器是CX寄存器的别名。
CX寄存器在处理循环时非常有用。
它可以作为循环计数器,用于控制循环的次数。
5. 数据寄存器数据寄存器是DX寄存器的别名。
它可以存储需要进行输入/输出操作的数据,例如从键盘读取的字符或向屏幕输出的字符。
数据寄存器还可以用于存放在算术运算中需要使用的常数。
6. 标志寄存器标志寄存器用于存储处理器运行过程中的状态信息,例如进位标志、零标志、符号标志等。
它们对于程序的条件分支非常重要,可以根据不同的标志位执行相应的操作。
7. 段寄存器段寄存器用于指示在内存中的位置。
在实模式下,由于地址总线的限制,内存地址仅能表示64KB。
因此,通过使用段寄存器,可以将内存地址拓展到1MB甚至更大。
常用的段寄存器有CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)和ES(附加段寄存器)。
8. 指令寄存器指令寄存器(IP)用于存储当前执行的指令在内存中的地址。
它是程序执行的关键寄存器之一,能够实现指令的顺序执行。
在汇编语言中,寄存器是程序设计中不可或缺的组成部分。
通过合理地使用和操作寄存器,能够提高程序的执行效率和性能。
汇编语言学习笔记段寄存器

汇编语言学习笔记段寄存器一、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想想问堆栈中的数据那么他会访问栈寄存器,依次类推就是这样的.。
汇编语言8086和8088中寄存器

1980年代,汇编语言8086和8088在个人电脑中广泛应用。
这两种语言使用16位和8位寄存器,这些寄存器是编程中不可或缺的组成部分。
接下来我将根据这两种汇编语言的寄存器,深入探讨其特性和用途,帮助你全面了解这一主题。
一、汇编语言8086和8088中寄存器的基本概念在汇编语言8086和8088中,寄存器是一种保存数据的特殊存储器。
它们用于存储指令中的临时数据和位置区域。
这两种汇编语言使用的寄存器包括通用寄存器、段寄存器和指令指针寄存器。
通用寄存器用于存储操作数和中间结果,段寄存器用于存储内存访问的段位置区域,指令指针寄存器用于存储当前执行指令的位置区域。
二、8086和8088中的通用寄存器1. AX寄存器AX寄存器是一个16位的累加器,用于存储算术运算的结果。
在8086和8088中,它可以分为AH和AL两个8位寄存器,分别存储较高位和较低位的数据。
2. BX寄存器BX寄存器是一个16位的基址寄存器,用于存储数据的基址。
在8086和8088中,它也可以分为BH和BL两个8位寄存器。
3. CX寄存器CX寄存器是一个16位的计数寄存器,用于存储循环次数。
在8086和8088中,它可以分为CH和CL两个8位寄存器。
4. DX寄存器DX寄存器是一个16位的数据寄存器,用于存储I/O端口的数据。
在8086和8088中,它也可以分为DH和DL两个8位寄存器。
三、8086和8088中的段寄存器1. CS寄存器CS寄存器是一个16位的代码段寄存器,用于存储当前执行代码段的基位置区域。
在8086和8088中,它存储着指向当前代码段的位置区域。
2. DS寄存器DS寄存器是一个16位的数据段寄存器,用于存储当前数据段的基位置区域。
在8086和8088中,它存储着指向当前数据段的位置区域。
3. SS寄存器SS寄存器是一个16位的堆栈段寄存器,用于存储当前堆栈段的基位置区域。
在8086和8088中,它存储着指向当前堆栈段的位置区域。
汇编学习笔记之寄存器

寄存器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利用奇偶标志可以进行奇偶校验检查。
汇编指令-状态寄存器、cmp、test、jz等指令详细说明

汇编指令-状态寄存器、cmp、test、jz等指令详细说明⼀、状态寄存器⾸先看看:状态寄存器(即标志寄存器)PSW(Program Status Word)程序状态字(即标志)寄存器,是⼀个16位寄存器,由条件码标志(flag)和控制标志构成,如下所⽰:条件码:①OF(Overflow Flag)溢出标志,溢出时为1,否则置0.标明⼀个溢出了的计算,如:结构和⽬标不匹配。
②SF(Sign Flag)符号标志,结果为负时置1,否则置0。
③ZF(Zero Flag)零标志,运算结果为0时置1,否则置0。
④CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位。
⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产⽣的进位置。
有进位时1,否则置0。
⑥PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0。
控制标志位:⑦DF(Direction Flag)⽅向标志,在串处理指令中控制信息的⽅向。
⑧IF(Interrupt Flag)中断标志。
⑨TF(Trap Flag)陷井标志。
test和cmp指令运⾏后都会设置标志位,为举例⽅便说⼀下jnz和jz测试条件JZ ZF=1JNZ ZF=0即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转)Jnz=jump if not zero⼆、test指令和cmp指令好,接着来看test和cmp1、test指令test属于逻辑运算指令功能:执⾏BIT与BIT之间的逻辑运算测试(两操作数作与运算,仅修改标志位,不回送结果)。
Test对两个参数(⽬标,源)执⾏AND逻辑操作,并根据结果设置标志寄存器,结果本⾝不会保存。
EST AX, BX 与 AND AX, BX 命令有相同效果语法:TEST r/m,r/m/data影响标志:C,O,P,Z,S(其中C与O两个标志会被设为0)运⽤举例:1.Test⽤来测试⼀个位,例如寄存器:test eax, 100b; b后缀意为⼆进制jnz ******; 如果eax右数第三个位为1,jnz将会跳转jnz跳转的条件⾮0,即ZF=0,ZF=0意味着零标志没被置位,即逻辑与结果为1。
汇编语言中SPBPSIDI作用

汇编语言中SPBPSIDI作用在汇编语言中,SP、BP、SI和DI是四个通用寄存器,它们分别代表栈指针(Stack Pointer)、基址指针(Base Pointer)、源变址指针(Source Index)和目的变址指针(Destination Index)。
这四个寄存器在程序中具有不同的作用,下面将逐个进行详细介绍。
1. SP(栈指针):栈指针(Stack Pointer)是用来指示当前栈顶的内存地址的寄存器。
栈是一种后进先出(LIFO)的数据结构,在程序执行过程中,经常会用到栈来进行临时数据的存储和函数调用的过程。
SP寄存器存储着当前栈顶的地址,通过改变SP的值,可以实现栈的增长和收缩。
通常在函数调用过程中,参数和局部变量都会被存储在栈中,而SP的值则用于跟踪这些数据的位置。
2. BP(基址指针):基址指针(Base Pointer)主要用于指示栈帧的基地址。
在函数调用时,BP寄存器会被用作当前函数栈帧(Stack Frame)的基址。
栈帧是用来存储函数调用过程中的相关信息,如局部变量、返回地址等。
通过BP指向栈帧的基址,可以方便地访问这些信息。
同时,BP还可以被用作局部变量的参考,通过BP+偏移量的方式可以访问到函数内的局部变量。
3. SI(源变址指针):源变址指针(Source Index)主要用于数据传输中作为数据源地址的指针。
在一些数据操作指令中,SI寄存器常用于指向源数据的内存地址。
通过修改SI寄存器的值,可以实现数据的遍历和复制等操作。
SI寄存器可以和其他寄存器一起使用,如与AX寄存器组合使用可以进行字符串的操作。
4. DI(目的变址指针):目的变址指针(Destination Index)主要用于数据传输中作为数据目的地址的指针。
与SI寄存器类似,DI寄存器用于指向目标数据的内存地址。
通过修改DI寄存器的值,可以实现数据的存储和移动等操作。
DI寄存器也可以和其他寄存器一起使用,如与AX寄存器组合使用可以进行字符串的操作。
汇编中BPSP有何区别分别怎么使用

汇编中BPSP有何区别分别怎么使用在汇编语言中,BP(Base Pointer)和SP(Stack Pointer)是两个非常重要的寄存器。
它们分别用于提供程序的基址和栈顶地址,并且在程序执行过程中起到了关键的作用。
1. BP(Base Pointer):BP寄存器作为基址寄存器,主要用于引用数据段中的变量。
它常用于进程的运行时堆栈和局部变量的访问。
BP寄存器通常在函数调用和返回时使用,帮助程序跟踪保存在堆栈中的局部变量和函数参数。
BP寄存器可以通过以下指令来设置和访问:-MOV指令:将一个值复制到BP寄存器。
-PUSH指令:将BP寄存器中的值推入堆栈。
-POP指令:将堆栈中的值弹出并存储到BP寄存器。
使用BP寄存器的典型场景是在函数调用过程中保存旧的BP值,然后将堆栈指针移动到栈顶。
这样可以为局部变量分配空间,并通过BP寄存器引用这些变量。
例如,以下是一个使用BP寄存器的示例代码片段:```assemblymain:MOVBP,SP;保存当前BP值SUBSP,4;为局部变量分配空间...;其他指令...MOVSP,BP;恢复堆栈指针POPBP;恢复旧的BP值RET;返回```2. SP(Stack Pointer):SP寄存器用于跟踪堆栈的栈顶地址。
堆栈是一种后进先出(LIFO)数据结构,用于存储临时数据、函数调用信息和局部变量。
SP寄存器可以通过以下指令来设置和访问:-MOV指令:将一个值复制到SP寄存器。
-PUSH指令:将一个值推入堆栈并递减SP寄存器的值。
-POP指令:将堆栈中的值弹出并递增SP寄存器的值。
使用SP寄存器的典型场景是在函数调用过程中为函数参数和临时变量分配空间,并在函数返回时恢复堆栈指针。
以下是一个使用SP寄存器的示例代码片段:```assemblymain:SUBSP,4;为局部变量分配空间PUSH10;将10推入堆栈...;其他指令...ADDSP,4;恢复堆栈指针RET;返回```总结起来,BP用于引用数据段中的变量,主要用于函数调用和返回过程中的局部变量的访问;SP用于跟踪堆栈的栈顶地址,主要用于为函数参数和临时变量分配空间。
汇编语言-寄存器

汇编语⾔-寄存器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。
汇编语言寄存器和指令操作的整理

汇编语言寄存器和指令操作的整理汇编语言是一种与机器语言紧密相关的低级语言。
它使用寄存器和特定的指令操作来进行数据的加载、存储、运算和控制。
寄存器是位于CPU内部的高速存储器。
它们可以暂时存储数据,供CPU进行运算和操作。
汇编语言使用多个寄存器进行数据的临时存储和处理。
在x86架构的计算机系统中,常见的寄存器包括:1.通用寄存器:程序员可以随意使用的寄存器,用于存储临时数据和地址。
在32位模式下,共有8个32位通用寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP),在64位模式下,有16个64位通用寄存器(RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP、R8~R15)。
2.段寄存器:用于存储段地址,分别包括代码段寄存器(CS)、数据段寄存器(DS)、附加段寄存器(ES)、栈段寄存器(SS)和指令指针寄存器(IP)。
3.标志寄存器:用于存储程序运行状态和执行结果的标志位,包括进位标志(CF)、零标志(ZF)、符号标志(SF)、溢出标志(OF)等。
除了寄存器,汇编语言还使用一些特定的指令操作来完成各种功能。
常见的指令操作包括:1.数据传输指令:用于将数据从一个位置(如寄存器、内存)传送到另一个位置。
常见的数据传输指令有MOV(将数据从源操作数传送到目标操作数)、LEA(加载有效地址)等。
2.算术运算指令:用于对数据进行加、减、乘、除等数学运算。
常见的算术运算指令有ADD(加法)、SUB(减法)、MUL(乘法)、IDIV(整数除法)等。
3.逻辑运算指令:用于对数据进行逻辑上的与、或、非、异或等运算。
常见的逻辑运算指令有AND(与运算)、OR(或运算)、NOT(取反运算)、XOR(异或运算)等。
4.控制指令:用于控制程序的流程和状态。
常见的控制指令有JMP(无条件跳转)、JZ(零标志跳转)、LOOP(循环执行)、CALL(调用子程序)等。
5.输入输出指令:用于与外部设备进行数据的输入和输出。
汇编寄存器功能详解

汇编寄存器功能详解汇编语言是一种底层语言,与计算机硬件直接交互。
在汇编语言中,寄存器是一组特殊的存储单元,用于暂时存储数据或指令。
它们在处理器中的位置较为接近,可以快速访问。
在汇编语言中,寄存器被分为通用寄存器、数据段寄存器、指令指针寄存器、标志寄存器等几个类别,每个寄存器都有特定的功能。
一、通用寄存器通用寄存器是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要执⾏指令的地址。
汇编语言入门汇编指令及寄存器详解教程

汇编语言入门汇编指令及寄存器详解教程汇编语言是一种低级编程语言,与计算机硬件直接相关。
它使用一组基本的指令和寄存器来编写程序。
本篇教程将介绍汇编语言的基本指令和寄存器,帮助读者入门汇编语言编程。
一、汇编语言概述及基本概念汇编语言是机器语言的助记符表示。
它采用英文单词来表示机器指令,以便程序员更容易理解和编写。
汇编语言程序需要通过汇编器将其转换为机器语言,然后可以在计算机上运行。
1.1 汇编指令汇编指令是汇编语言中的基本指令,用于执行计算机的各种操作。
常见的汇编指令包括数据传输指令、算术运算指令、逻辑运算指令和控制转移指令等。
下面介绍几个常用的汇编指令:1.1.1 MOV指令MOV指令用于将数据从一个位置复制到另一个位置。
语法格式如下:MOV 目标操作数, 源操作数其中,目标操作数表示数据的目的位置,源操作数表示数据的来源位置。
例如,MOV AX, BX表示将寄存器BX中的数据复制到寄存器AX中。
1.1.2 ADD指令ADD指令用于实现加法运算。
语法格式如下:ADD 目标操作数, 源操作数其中,目标操作数表示运算结果的存储位置,源操作数表示参与加法运算的数据。
例如,ADD AX, BX表示将AX寄存器中的数据与BX 寄存器中的数据相加,并将结果存储在AX寄存器中。
1.1.3 JMP指令JMP指令用于实现无条件跳转。
语法格式如下:JMP 目标地址其中,目标地址表示跳转的目标位置。
例如,JMP 100表示跳转到地址为100的指令处执行。
1.2 寄存器寄存器是一种用于存储和处理数据的硬件组件。
在汇编语言中,寄存器被广泛应用于各种数据传输和运算操作。
下面介绍几个常用的寄存器:1.2.1 通用寄存器通用寄存器是汇编语言中最常用的寄存器,用于存储数据和执行运算。
常见的通用寄存器有AX、BX、CX和DX等。
1.2.2 段寄存器段寄存器用于存储程序的段地址。
在实模式下,8086处理器有4个段寄存器:CS、DS、ES和SS。
汇编-32位寄存器的功能及其使用

汇编-32位寄存器的功能及其使用2011-06-10 12:16汇编-32位寄存器的功能及其使用总体上来讲32位寄存器可以分为一下几种:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)首先介绍一下易失性一些寄存器在函数中常常是变化的,而另外一些却是不变的。
这是编译器所决定的。
因为寄存器是不会自动保存的(虽然有些汇编语言会自动保存,但是x86 是不会的),所以编码时要自己保存。
这句话的意思是:当一个函数被调用,是不保证在函数返回时,易失寄存器上的值不变的;但是函数必须负责保存非易失寄存器中的值。
微软编译器的寄存器使用习惯如下:1) 易失寄存器: ecx, edx2) 非易失寄存器 : ebx, esi, edi, ebp3) 其他特殊寄存器 : eax, esp (discussed later)eaxEax 是一个32 为通用寄存器,一般的用途有两个:保存函数的返回值或者作为计算用的专用寄存器。
在技术上来说,eax 是一个易失寄存器,因为他的值是不能保存的,eax 的值会在函数返回前设置为函数的返回值。
除了ESP 寄存器,EAX 的这个功能(即保存返回值)可能是最重要的值得被记住的。
eax 还会在数据计算时要用,比如乘法和除法。
这种用法我们会在指令使用一文讲解。
下面是C 语言中函数返回的例子:return 3; // 返回3对应的汇编语言:mov eax, 3 ; 置EAX=3ret ; 返回ebxEbx 是一个非易失通用寄存器。
它没有特定的用途,但是常被置为一个函数中常用的值(如0 ),以此来加快计算速度。
ecxEcx 是一个易失通用寄存器。
常被用作函数的参数或者是循环的计数器。
__fastcall 的函数会将第一和第二个参数放置在ecx 和edx 寄存器中。
(完整版)汇编寄存器功能详解

数据寄存器(AX、BX、CX、DX)1.寄存器AX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;2.寄存器BX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;3.寄存器CX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;4.寄存器DX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址;变址寄存器(SI、DI)寄存器SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便指针寄存器(BP、SP)寄存器BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
指针寄存器不可分割成8位寄存器。
作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们主要用于访问堆栈内的存储单元,并且规定:BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶段寄存器(CS、DS、ES、SS、FS、GS)段寄存器是根据内存分段的管理模式而设置的。
内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址CS 代码段寄存器(Code Segment Register),其值为代码段的段值DS 数据段寄存器(Data Segment Register),其值为数据段的段值;ES 附加段寄存器(Extra Segment Register),其值为附加数据段的段值SS 堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;FS 附加段寄存器(Extra Segment Register),其值为附加数据段的段值GS 附加段寄存器(Extra Segment Register),其值为附加数据段的段值在16位CPU系统中,它只有4个段寄存器,所以,在此环境下开发的程序最多可同时访问4个段;在32位CPU系统中,它共有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段.指令指针寄存器指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据寄存器(AX、BX、CX、DX)1.寄存器AX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;2.寄存器BX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;3.寄存器CX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;4.寄存器DX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址;变址寄存器(SI、DI)寄存器SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便指针寄存器(BP、SP)寄存器BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
指针寄存器不可分割成8位寄存器。
作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
它们主要用于访问堆栈内的存储单元,并且规定:BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶段寄存器(CS、DS、ES、SS、FS、GS)段寄存器是根据内存分段的管理模式而设置的。
内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址CS 代码段寄存器(Code Segment Register),其值为代码段的段值DS 数据段寄存器(Data Segment Register),其值为数据段的段值;ES 附加段寄存器(Extra Segment Register),其值为附加数据段的段值SS 堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;FS 附加段寄存器(Extra Segment Register),其值为附加数据段的段值GS 附加段寄存器(Extra Segment Register),其值为附加数据段的段值在16位CPU系统中,它只有4个段寄存器,所以,在此环境下开发的程序最多可同时访问4个段;在32位CPU系统中,它共有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段.指令指针寄存器指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。
在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。
所以,在理解它们的功能时,不考虑存在指令队列的情况。
16位标志寄存器9个标志位,它们主要用来反映CPU的状态和运算结果的特征。
1.进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位。
如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
2.奇偶标志PF(Parity Flag)奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。
如果“1”的个数为偶数,则PF的值为1,否则其值为03.辅助进位标志AF(Auxiliary Carry Flag) 在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:(1)、在字操作时,发生低字节向高字节进位或借位时;(2)、在字节操作时,发生低4位向高4位进位或借位时。
4.零标志ZF(Zero Flag) 零标志ZF用来反映运算结果是否为0。
如果运算结果为0,则其值为1,否则其值为0。
在判断运算结果是否为0时,可使用此标志位5.符号标志SF(Sign Flag) 符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。
在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。
运算结果为正数时,SF的值为0,否则其值为16.溢出标志OF(Overflow Flag) 溢出标志OF用于反映有符号数加减运算所得结果是否溢出。
如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0(“溢出”和“进位”是两个不同含义的概念)7.中断允许标志IF(Interrupt-enable Flag)中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。
但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。
具体规定如下(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求8.追踪标志TF(Trap Flag)当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。
这种方式主要用于程序的调试。
9.方向标志DF(Direction Flag) 方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
具体规定在第5.2.11节——字符串操作指令——中给出。
在微机的指令系统中,还提供了运算和逻辑运算结果的影响,后者受一些控制指令执行的影响16位微机的内存管理模式Intel公司的80X86系列的CPU基本上采用内存分段的管理模式。
它把内存和程序分成若干个段,每个段的起点用一个段寄存器来记忆,所以,学习微机汇编语言,必须要清楚地理解存储器的分段含义、存储单元的逻辑地址和其物理地址之间的转换关系我们知道:计算机的内存单元是以“字节”为最小单位进行线性编址的。
为了标识每个存储单元,就给每个存储单元规定一个编号,此编号就是该存储单元的物理地址存储单元的物理地址是一个无符号的二进制数。
但为了书写的简化,物理地址通常用十六进制来表示。
16位CPU内部有20根地址线,其编码区间为:00000H~0FFFFFH,所以,它可直接访问的物理空间为1M(220)字节。
而16位CPU内部存放存储单元偏移量的寄存器(如:IP、SP、BP、SI、DI和BX 等)都是16位,它们的编码范围仅为:00000H~0FFFFH。
这样,如果用16位寄存器来访问内存的话,则只能访问内存的最低端的64K,其它的内存将无法访问。
为了能用16位寄存器来有效地访问1M的存储空间,16位CPU采用了内存分段的管理模式,并引用段寄存器的概念。
16位微机把内存空间划分成若干个逻辑段,每个逻辑段的要求如下:逻辑段的起始地址(通常简称为:段地址)必须是16的倍数,即最低4位二进制必须全为0;逻辑段的最大容量为64K,这由16位寄存器的寻址空间所决定;按上述规定,1M内存最多可分成64K个段,即65536个段(段之间相互重叠),至少可分成16个相互不重叠的段。
物理地址的形成方式由于规定段地址必须是16的倍数,所以,其值的一般形式为:XXXX0H,即:前16位二进制位是变化的,后四位是固定为0。
鉴于段地址的这种特性,我们可以仅保存其前16位二进制来达到保存整个段地址,其后四位可通过“左移补0”来获得;在确定了某个存储单元所属的内存段后,我们也只知道其所处内存位置的范围,还不能确定其具体位置。
要想确定内存单元的具体位置,还必须知道该单元离该段地址有多远。
我们通常把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也可称为有效地址(EA—Effective Address)或偏移量(Offset)等。
有了段地址和偏移量,就能唯一地确定某一内存单元在存储器内的具体位置。
由此可见,存储单元的逻辑地址分为两部分:段地址和偏移量。
由逻辑地址得到其物理地址(PA—Physical Address)的计算方法如下:物理地址PA=段地址×16 + 偏移量对物理地址来说,当段地址变化时,只要对其偏移量进行相应的调整就可对应同一个物理地址,所以,同一个物理地址可有多个逻辑地址。
在汇编语言程序中,存储单元通常不是用其物理地址标识的,而是用其逻辑地址标识的。
逻辑地址的段地址由段寄存器给出,偏移量可由寄存器(SI、DI、BP和BX 等)给出,也可用符号地址或具体的数值给出。
段寄存器的引用段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。
段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。
另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。
段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。
该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。
通常,缺省的数据段寄存器是DS,只有一个例外,即:在进行串操作时,其目的地址的段寄存器规定为ES访问存储器方式缺省的段寄存器可选用的段寄存器偏移量取指令CS IP堆栈操作SS SP一般取操作数DS CS、ES、SS 有效地址串操作源操作数DS CS、ES、SS SI 目标操作数ES DI指针寄存器BP SS CS、DS、ES 有效地址段寄存器及其指针寄存器的引用关系:取指令所用的段寄存器和偏移量一定是用CS和IP堆栈操作所用的段寄存器和偏移量一定是SS和SP串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI其它情况,段寄存器除了其默认引用的寄存器外,还可以强行改变为其它段寄存器汇编中寄存器的详解数据寄存器(AX、BX、CX和DX 16位EAX、EBX、ECX和EDX 32位)数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的16位CPU 中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息.寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;寄存器BX称为基地址寄存器(Base Register)。