精华内容
下载资源
问答
  • 话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字型数据,就是获取它的高位字节0+1位和低位字节0位的数据数据由高地址位向低地址位读) 问题: (1)0地址单元中...

    在内存中字的存储

    这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字型数据,就是获取它的高位字节0+1位低位字节0位的数据,数据由高地址位向低地址位读)

    问题:

    (1)0地址单元中存放的字节型数据是多少?  #  20H
    (2)0地址字单元中存放的字型数据是多少?  # 4e20H
    (3)2地址字单元中存放的字节型数据是多少? # 12H
    (4)2地址单元中存放的字型数据是多少?      #  0012H
    (5)1地址字单元中存放的字型数据是多少?  # 12aEH

    结论:就是我上面说的,字型数据就是它和它的下一位地址单元的数据(数据由高地址位向低地址位读)

    数据段寄存器DS和偏移量[address]

    用法和cs和ip差不多,都是段寄存器的值*16+偏移量的值

    为给DS数据段寄存器值

    因为CPU的段寄存器都比较害羞,没法给他们直接赋值(cs代码寄存器用的是jmp cs:ip),所以段寄存器采用以下方法赋值

    mov ax,1234H    # 将ax寄存器赋值为1234H
    
    mov ds,ax    # 通过ax寄存器 间接赋值

    字的传送

    mov ax,[1]    # []中的是偏移量 意思是将12341内存位置的字形数据赋给ax寄存器
    
    mov al,[1]    # 将12341内存位置的字节形数据赋给al(低位)寄存器
    
    mov  [1],ax    # 将ax寄存器字形数据赋给12341内存位置的值
    
    mov [1],al    # 将al寄存器的字节形数据赋给12341内存位置
    

    问题1:

    内存中的情况如下图,写出下面指令执行后寄存器ax,bx,cx中的值?

    解析:

    问题2:

    内存中的情况如下图,写出下面指令执行后寄存器ax,bx,cx中的值?

    解析:

    NB的move指令

    mov 通用寄存器,数据		# mov ax,1234H
    mov 通用寄存器,寄存器		# mov bx,ax / mov bx,ds(将段寄存器的值赋给通用寄存器)
    mov 段寄存器,寄存器		# mov ds,ax(因为无法直接给段寄存器赋值,所以用通用寄存器当中介)
    mov 内存单元,寄存器		# mov [0],ax(将ax寄存器中的值赋给ds*16+0这个内存单元)
    mov 内存单元,寄存器		# mov ax,[0](内存单元ds*16+0的值赋给ax寄存器)
    

    sub,add指令

    数据段

    我们上面操作的实际上就是数据段,具体来看下是怎样操作数据段的

    累加123B0H~123BAH的内存单元的操作

    小结:

    (1)字在内存中存储时 ,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放再高地址单元中。
    (2)用 mov 指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。
    (3)[address]表示一个偏移地址为address的内存单元。
    (4)在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。
    (5)mov、add、sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。

    (2) 内存中的情况如图3.6所示

    各寄存器的初始值:cs=2000h,ip=0,ds=1000h,ax=0,bx=0;

    ①   写出CPU执行的指令序列(用汇编指令写出)。

    ②   写出CPU执行每条指令后,CS、IP和相关寄存器的数值。

    ③   再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?

    答案:我以为jmp了以后cp的值也会改变,实际上就是它jmp的内个CP:IP

    指令序列

    CS

    IP

    DS

    AX

    BX

    初始值

    2000h

    0

    0

    0

    0

    1

    mov ax,6622h

    2000h

    3h

    0

    6622h

    0

    2

    jmp 0ff0:0100

    ff0h

    100h

    0

    6622h

    0

    3

    mov ax,2000h

    ff0h

    103h

    0

    2000h

    0

    4

    mov ds,ax

    ff0h

    105h

    2000h

    2000h

    0

    5

    mov ax,[8]

    ff0h

    108h

    2000h

    c389h

    0

    6

    mov ax,[2]

    ff0h

    10bh

    2000h

    ea66h

    0

    转载于:https://www.cnblogs.com/x54256/p/8082595.html

    展开全文
  • 什么是段寄存器数据寄存器

    千次阅读 2020-04-01 12:18:19
    寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。 2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边...

    https://zhidao.baidu.com/question/2114222516098572027.html

     

    寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。
    用途:
    1.可将寄存器内的数据执行算术及逻辑运算。
    2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。
    3.可以用来读写数据到电脑的周边设备。

    8086有8个8位数据寄存器,

    一): 这些8位寄存器可分别组成16位寄存器:
    AH&AL=AX:累加寄存器,常用于运算;
    BH&BL=BX:基址寄存器,常用于地址索引;
    CH&CL=CX:计数寄存器,常用于计数;
    DH&DL=DX:数据寄存器,常用于数据传递。

    二): 为了运用所有的内存空间,8086设定了四个段寄存器,
    专门用来保存段地址:
    CS(Code Segment):代码段寄存器;
    DS(Data Segment):数据段寄存器;
    SS(Stack Segment):堆栈段寄存器;  
    ES(Extra Segment):附加段寄存器。
    当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,
    通过设定段寄存器 CS,DS,SS 来指向这些起始位置。

    通常是将DS固定,而根据需要修改CS。
    所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。 
    所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。
    8086以内存做为战场,用寄存器做为军事基地,以加速工作。

    除了前面所提的寄存器外,还有一些特殊功能的寄存器:
    IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;
    SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。
    BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;
    SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;
    DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。

    还有一个标志寄存器FR(Flag Register),有九个有意义的标志(
    OF: 溢出标志位OF用于反映有符号数加减运算所得结果是否溢出。
    如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0.
    DF: 方向标志DF位用来决定在串操作指令执行时有关指针寄存器发生调整的方向。

     

    在汇编语言中,堆栈操作的最小单位是字,也就是说,只能以字或双字为单位。

    SS:SP指向栈顶(SS为堆栈段寄存器,SP为堆栈指针,二者一相加,就构成了堆栈栈顶的内存地址)。

    https://blog.csdn.net/andrewniu/article/details/80566277

    CS、IP和PC寄存器
    https://www.cnblogs.com/zhuge2018/p/8466288.html
     

    https://www.cnblogs.com/Erma/p/9737351.html

    展开全文
  • 段寄存器

    千次阅读 2021-01-15 12:46:20
    一、段寄存器有哪些 ? 段寄存器有ES、CS、SS、DS、FS、GS、LDTR、TR共8个。 通常我们用汇编读写某一个地址时,如下: Mov dword ptr ds:[0x123846],eax 这时我们把eax 的值往地址去写,写的地址是: ds.base +...

    一、段寄存器有哪些 ?

    段寄存器有ESCSSSDSFSGSLDTRTR8个。

    ES:扩展段。在串操作时(比如cmovs)目标操作数的基址是ES,源操作数是DS

    CS:代码段,配合EIP使用。

    SS: 堆栈段,凡是基址是EBPESP的,段前缀就是SS

    DS:数据段,默认的都是DS

    FSGS80386 之后定义的。

    段寄存器结构:

    段寄存器的大小是 96 位

    段寄存器结构可以抽象成以下结构

    struct Segment

    {

      WORD Selector;  //16位段选择子,可见部分.  使用OD 或者X64dbg看段寄存器只会显示16位的段选择子可见部分.当读段寄存器(如mov ax,CS)的时候,只会返回这16位。或者push seg 操作针对的都是这16位。如果目标操作数是32位(如mov eax ,CS),则将16位零扩展成32位赋给目标操作数。但是写的时候,就会涉及到96位

      WORD Attribute; //16位表示的段属性, 表示了当前段寄存器是可读的可写的还是可执行的

      DWORD Base;     //32位表示的基址,表示段从哪里开始

      DWORD limit;    //32位表示,表示的是基址的长度. base + limit 可以确定一个段的大小

    }

    在x86下.我们可以看如下寄存器表示图.

    寄存器名称

    段选择子(Select)

    段属性(Attributes)

    段基址(Base)

    段长(Limit)

    ES(附加扩展段)

    0x0023

    可读,可写

    0x00000000

    0xFFFFFFFF

    CS(代码段)

    0x001B

    可读,可写

    0x00000000

    0xFFFFFFFF

    SS(堆栈段)

    0x0023

    可读,可写

    0x00000000

    0xFFFFFFFF

    DS(数据段)

    0x0023

    可读,可写

    0x00000000

    0xFFFFFFFF

    FS(分段机制)

    0x003B

    可读,可写

    0x7FFDF000

    0xFFF

    GS

    未使用

    未使用

    未使用

    未使用

     

    二、段寄存器读写

    可以使用MOV指令对段寄存器进行读写。

    读操作时,可以读到段寄存器的段选择子部分的16位。例如 mov ax,es 指令会把es寄存器的段选择子读到ax。

    写操作时,会写入96位,其中源操作数的16位写入到段寄存器的段选择子部分,另外80位会根据段选择子从GDT表(全局描述表)中获取。因此,

    1 .mov ax,cs

    2. mov ds,ax

    实际上是把cs完整的复制给了ds。

    三、段属性探测

    CS代码段属性探测

    int Var = 0;

    int main()

    {  

        __asm   

        {      

            mov ax,cs      

            mov ds,ax       

            mov dword ptr ds:[Var],eax         ;等价于 mov dword ptr cs:[Var],eax  

        }

    }

    将CS赋值到AX中. AX赋值给DS. 此时DS就代表CS了. 如果以把eax之给 CS.则会出现错误.

    说明权限确实是不可写.

    其它代码段段属性探测

    int Var = 0; int main()

    {   

        __asm   

        {       

            mov ax,ss

            mov ds,ax       

            mov dword ptr ds:[Var],eax   

        }

    }

    段基地址探测

    通常我们用汇编读写某一个地址时,如下:
    Mov dword ptr ds:[0x123846],eax
    这时我们把eax 的值往地址去写,写的地址是:
    ds.base + 0x123456

    int main()

    {

        __asm

        {

            mov ax,fs

            mov gs,ax

            mov eax,gs:[0]

        }

    }

    段长探测

    在段地址探测中,访问有效地址等价于段.base + 偏移地址

    int main()

    {

        __asm

        {

            mov ax, fs

            mov gs, ax

            mov eax, gs: [0]  //fs.base + 0 读取

            mov eax,gs:[0x1000]//fs.base + 0x1000

            mov eax, dword ptr ds : [eax + 0xFFF] ;

           // mov eax,gs:[0x1000] //fs.base + 0x1000 读取

        

        }

    }

    展开全文
  • 段寄存器中代码段数据段堆栈段附加段

    这里写图片描述段寄存器中代码段数据段堆栈段附加段

    展开全文
  • 数据直接送入寄存器 将一个寄存器中的内容送入另一个寄存器 也可以使用mov指令将一个内存单元中的内容送入一个寄存器中。从哪一个内存单元送到哪一个寄存器中呢?在指令中必须指明。寄存器寄存器名来指明,内存...
  • Intel 8086 CPU 段寄存器

    2019-09-21 19:16:38
    段寄存器的产生源于Intel 8086 CPU体系结构中数据总线和地址总线的宽度不一致。 数据总线的宽度,也即是ALU(算数逻辑单元)的宽度,平常说一个CPU是“16位”或者“32”位指的就是这个。 8086CPU的数据总线是16位。可...
  • 汇编语言-- 段寄存器DS[Address]初识

    千次阅读 2020-03-31 21:59:43
    2.8086CPU不支持将数据直接放入到段寄存器中。 3.执行指令时,8086CPU自动获取ds中的数据为内存单元。 4.mov指令中的[]说明操作对象是一个内存单元。[]中的数表示偏移地址。 5.定位一个内存单元的地址需...
  • 段寄存器详解

    2021-05-26 05:05:14
    段寄存器均为16位寄存器功能CS(code segment)代码段地址寄存器,存放代码段的起始地址DS(data segment)数据段地址寄存器,存放数据段的起始地址SS(stack segment)堆栈段地址寄存器,存放堆栈段的起始地址ES(extra ...
  • 32位的处理器运行在保护模式下时,除了先前的4个段寄存器,还引入了两个新的段寄存器FS/GS,这些寄存器都是16比特位宽。64位模式下的段寄存器有特殊性,后面有一节介绍。 IA-32处理器中的段寄存器(C...
  • 段地址和段寄存器

    千次阅读 2020-09-16 10:45:28
    1、8086外部提供了20位的地址总线,CPU内部只能提供16位地址 两个16位地址转换为20位 地址加法器合成物理地址的方法: ...CS、DS、SS、ES当8086要访问内存时,由这4个段寄存器提供内存单元的段地址 CS和IP是.
  • 含义编辑 段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。 段寄存器SS指向用于堆栈的...段寄存器DS指向数据段,ES指向附加
  • 一、通用寄存器 寄存器 编号(二进制) 编号(十进制) 64位 32位 16位 8位 累加寄存器 RAX EAX AX AL ... 计数寄存器 ... 数据寄存器 R...
  • 段选择符 段寄存器

    万次阅读 2016-08-27 15:57:48
    ds:数据段寄存器,指向包含静态数据或者全局数据段。 其它三个段寄存器作一般用途,可以指向任意的数据段。 cs寄存器还有一个很重要的功能:它包含一个两位的字段,用以指明CPU的当前特权级(CPL)。值为0...
  • 通用寄存器和段寄存器

    千次阅读 2016-01-18 08:45:25
     这些寄存器除了各自规定的专门用途外,他们均可以用于传送和暂存数据,可以保存算术逻辑运算中的操作数和运算结果;  8个通用寄存器的专门用途如下:  AX 字乘法,字除法,字I/O  BX 存储器指针  CX 串...
  • 段寄存器通常有CS DS SS ES...当一个段选择符(segment selector)装入段寄存器的可见部分,处理器同时也把该段描述符的其它数据装入到段寄存器的隐藏部分,这包括段开始的基地址、段长度、访问控制信息等。这些信息缓
  • 8086段寄存器

    千次阅读 2020-08-21 14:20:20
    8086的访问内存的时候:物理地址=段地址×16+偏移地址,这个段地址由段寄存器来提供。8086有4个段地址寄存器,分别是CS,DS,ES,SS。其中CS是最为关键的,因为CS:IP指示了CPU需要读取的地址。IP是指令指针寄存器,...
  • 通用寄存器寄存器和变量差不多,目的都是用于保存一些即将操作的数据 ...EDX(Data) 寄存器数据寄存器,常用来存放八字长数据的高32位,可以作为其他用途 EBX(Base) 寄存器:基址寄存器,常用...
  • 8086微处理器的寄存器

    千次阅读 2020-02-22 16:46:24
    目录1. 通用寄存器1.1 数据寄存器1.2 地址寄存器...8086的寄存器组可分为8个通用寄存器(4个数据寄存器,4个地址寄存器),1个标志寄存器,1个指令指针寄存器及4个段寄存器。 1. 通用寄存器 通用存储器在处理器中数...
  • 段寄存器和8种地址寻址方式

    千次阅读 2017-11-28 17:13:26
    ...段寄存器是因为对内存的分段管理而设置的。...1. 取命令:段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。
  • Windows核心编程_FS段寄存器

    千次阅读 2018-06-21 16:40:24
    Windows核心编程_FS段寄存器FS段寄存器Windows用来存储一些进程信息的,FS段的首地址是存储这些进程信息的首地址:在内核态FS指向GDT表的:0x30地址, 在用户态FS=0x3B也就是说当切换到用户态时,操作系统会把进程下...
  • 同类学习笔记总结: (一)、8086汇编学习之基础...我们主要分析一下在单个段的程序与多个段的程序中,每个段寄存器的值是如何安排的,段的位置关系,内存大小等问题。一、只有一个段的程序:程序实例: 利用栈将程
  • 全局变量或静态变量,放在数据段, 局部变量放在栈中, 用new产生的对象放在堆中, 内存分为4段,栈区,堆区,代码区,全局变量区 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量...
  • 段寄存器和段描述符

    千次阅读 2019-12-19 14:34:23
    段描述符2.0 S+Type数据段描述符代码段描述符系统段描述符2.1 赋值原理2.2 段权限检查1.4.0 数据段权限检查1.4.1 代码段权限检查2.2 其它检查有效位检查段类型检查3. 系统段描述符-门描述符3.0 调用门设置和使用3.1...
  • 段寄存器的结构

    千次阅读 2013-04-02 20:17:40
    用户的数据段寄存器 ,否则会产生 #GP 异常 2.1.3 SS 寄存器 SS  寄存器是 data segment register 的其中一种,除了要遵循上面的 data segment register 规则外。 它还 必须 : 在  SS...
  • 汇编语言--段寄存器

    万次阅读 2020-09-08 21:53:12
    我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元,可以用分段的方式来管理内存。 ... 段寄存器:8086CPU有4个段寄存器:CS、DS、SS、ES,提供内存单元的段地址 ...
  • 汇编语言:寄存器相关概念初理解(通用寄存器、段寄存器、专用寄存器) 1.寄存器分类 一图抵千言: 2.详细介绍及注意事项 (1)AX BX CX DX被称为通用寄存器(可被分割为2个8位寄存器),存放数据的,数据寄存器(16...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 210,552
精华内容 84,220
关键字:

数据段寄存器