汇编基础知识

段寄存器、指针寄存器、通用寄存器

ds,cs,ss都是汇编中的段寄存器
而ip是状态与控制寄存器,sp为索引寄存器,
cs与ip搭配使用,ss与sp搭配使用;
虽然ds,cs,ss都是段寄存器但是他们的作用却大不相同,(基于8086CPU)

数据段寄存器ds存储程序的而静态数据,代码段寄存器cs存储程序的执行指令。

寄存器分类
在计算机体系结构中,8086CPU,寄存器可以分为以下几类:

1. 通用寄存器: 通用寄存器是用于存储数据和执行算术运算的寄存器。在 x86 架构中,这些通用寄存器通常包括 AX、BX、CX、DX、SI、DI、BP 和 SP。其中,AX、BX、CX 和 DX 寄存器可以分别作为累加器(accumulator)、基址寄存器(base register)、计数器(count register)和数据寄存器(data register)来使用。

2. 段寄存器: 段寄存器用于实现内存分段机制。在 x86 架构中,主要有 CS、DS、ES 和 SS 四个段寄存器。CS(Code Segment)存储代码段的起始地址,DS(Data Segment)存储数据段的起始地址,ES(Extra Segment)可以作为附加数据段寄存器使用,SS(Stack Segment)存储栈段的起始地址。

3. 指针寄存器: 指针寄存器主要用于存储指针或偏移地址。在 x86 架构中,主要有 IP(Instruction Pointer)和 SP(Stack Pointer)两个指针寄存器。IP 寄存器存储下一条要执行的指令的地址,而 SP 寄存器则指示当前栈顶的位置。

4. 索引寄存器: 索引寄存器用于实现数组和数据结构的访问。在 x86 架构中,主要有 SI(Source Index)和 DI(Destination Index)两个索引寄存器。

5. 控制寄存器: 控制寄存器用于控制处理器的运行模式和行为。例如,CR0 寄存器用于存储控制标志,CR3 寄存器用于存储页目录表的基址等。
需要注意的是,不同的体系结构和指令集架构可能具有不同的寄存器组合和功能。上述提到的寄存器是基于 x86 架构的常见寄存器。

这些寄存器的用途
下面分别介绍一下汇编语言中常见寄存器的用途:

1. 通用寄存器:

通用寄存器是最常用的寄存器。它们用于存储数据和执行算术运算。AX、BX、CX 和 DX 这四个寄存器可以分别作为累加器(accumulator)、基址寄存器(base register)、计数器(count register)和数据寄存器(data register)来使用。例如,累加器 AX 可以用于存储操作数,并执行加法、减法、乘法、除法等算术运算。数据寄存器 DX 则用于存储运算结果或被除数。

2. 段寄存器:

段寄存器用于实现内存分段机制。在 x86 架构中,主要有 CS、DS、ES 和 SS 四个段寄存器。CS(Code Segment)存储代码段的起始地址,DS(Data Segment)存储数据段的起始地址,ES(Extra Segment)可以作为附加数据段寄存器使用,SS(Stack Segment)存储栈段的起始地址。通过设置段寄存器的值,程序可以访问不同的内存段,从而实现内存管理和保护。

3. 指针寄存器:
指针寄存器用于存储指针或偏移地址。在 x86 架构中,主要有 IP(Instruction Pointer)和 SP(Stack Pointer)两个指针寄存器。IP 寄存器存储下一条要执行的指令的地址,而 SP 寄存器则指示当前栈顶的位置。例如,在进行函数调用时,程序会将参数和返回地址压入栈中,并使用 SP 指针寄存器管理栈帧。

4. 索引寄存器:

索引寄存器用于实现数组和数据结构的访问。在 x86 架构中,主要有 SI(Source Index)和 DI(Destination Index)两个索引寄存器。SI 寄存器通常作为源数据的偏移量,而 DI 寄存器则用于存储目标数据的地址。例如,在字符串操作中,可以使用 SI 和 DI 寄存器分别管理源字符串和目标字符串的地址。

5. 控制寄存器:

控制寄存器用于控制处理器的运行模式和行为。例如,在保护模式下,CR0 寄存器用于存储控制标志,包括分页机制、保护模式使能、数学协处理器使能等。CR3 寄存器用于存储页目录表的基址,从而实现虚拟内存管理。其他控制寄存器还包括调试寄存器、测试寄存器、时间戳计数器等。

需要注意的是,不同的体系结构和指令集架构可能具有不同的寄存器组合和功能。上述提到的寄存器是基于 x86 架构的常见寄存器。
cpu的工作就是寻址,然后执行指令集完成一些列初始工作

(1)ds (Data Segment) 数据段寄存器
读取一个指定的内存单元上的数据时,通过把数据所在的内存段地址放入到ds寄存器中去,然后读取或者写入数据时就可以通过该ds寄存器内的段地址偏移得到我们的数据,或者偏移后写入数据
例如,我们现在想读取1000:0这个地址上的数据并且往1000:1这个地址写入一个数据时:

    mov ax,1000   //把1000这个段地址写入到ax这个通用寄存器中
    mov ds,ax      //把ax中的段地址1000送入ds数据寄存器
    mov bx,[0]      //把1000这个段地址偏移0位即1000:0地址上的内容读取到bx寄存器去
    mov cx,2020      //把2020这个数据送入到cx寄存器
    mov [1],cx      //最后把cx寄存器中的内容送入1000段地址偏移1位即1000:0001地址去

注:不能直接把数据送入到ds寄存器,因此需要先把数据送入一个通用寄存器再送入数据段寄存器
 

2)cs(代码段寄存器)与ip(指令指针寄存器)
当我们想要声明一段内存单元为代码段让CPU去执行我们代码段里的指令或者代码时,因为指令和代码都是存放在内存单元中的;因此我们需要告诉CPU一个地址,让它去执行该地址的内存单元中的指令或代码;

其中:

cs(Code Segment)是用于存放我们指令所在的段地址
ip (Instruction Pointer)寄存器是用于存放指令所在的地址的偏移地址


注:因为8086CPU是16位的,但是物理地址是20位的,它内存的寄存器只能表现16位的地址,因此使用了ip寄存器来存放偏移地址

在我们想要执行1000:0123地址上的一个指令时,则先修改cs与ip的值:

通过r来修改寄存器的内容
    r cs  回车输入段地址1000
    r ip  回车输入偏移地址

(3)ss(栈寄存器)与sp(栈指针寄存器)
我们知道栈是后进先出(last in frist out)的且始终有一个栈顶指针指向栈顶的,当栈内无元素时,栈顶指针指向的是栈底;我们来讲一下汇编中的栈是怎样的:
CPU中设置了两个寄存器用于存放栈顶的段地址与偏移地址,分别为:

ss (Stack Segment):用于存放栈顶的段地址
sp(Stack Pointer):用于栈顶的偏移地址


其中入栈的步骤分为两步:
入栈汇编指令:push 寄存器名 ----->把寄存器中的值入栈
(1)sp = sp - 2
(2)然后把入栈的寄存器内的数据放入栈的内存单元中


出栈的顺序也是分为两步:
出栈汇编指令:pop 寄存器名 —>把栈顶元素出栈保存到寄存器中
(1)sp = sp + 2
(2)把该内存单元中的数据送到出栈的寄存器中
注:入栈与出栈都是按一个寄存器即一个字(两个字节)来入栈或出栈的(8086是16位的结构),栈一个地址保存一字节数据。

注:
(1)为什么是sp偏移地址加2减2呢
因为push 与 pop 汇编指令执行是占两个字节的
(2)当栈为空时,当栈为空时,栈顶指针指向栈底内存单元地址+2(因为入栈时会先减2)

例如:1000:0 - 1000:000f为栈内存,空栈时,栈的偏移地址sp为多少?
答案:因为此时空栈,栈底的字内存单元地址为000e,加2即是0010


还有一种情况,栈的内存单元地址是1000:0 - 1000:ffff;空栈时,偏移地址sp为多少?
答案:此时空栈的栈底字内存单元为为fffe,加2即时空栈时的栈顶地址;此时加后为10000,只能存放16位,因此剩下0000;此时满栈与空栈的偏移地址均为0


(地址从上到下是上面低位到下面高位的)

在指定的内存输入指令测试入栈与出栈:
    //把bx、cx入栈到1000:0 - 1000:f 这段内存中去
    mov ax,1000
    mov ss,ax
    mov sp,0
    //把数据送入bx、cx寄存器
    mov bx,1234
    mov cx,4567
    //入栈
    push bx
    push cx
    //出栈,后进先出;cx会先出
    pop bx    //会把cx放到bx中
    pop cx


当我们想指定一段内存单元为栈时,因为8086CPU中没有预防我们栈溢出(超出栈内存继续入栈或出栈)问题;因此我们使用时需要小心使用,不要访问到其他内存单元去;而且尽量不要把ds,cs,ss同时使用一片内存
其实这个数据段,代码段和栈都是我们人为给他们指定的,我们可以同时把一段连续的内存分别指定为数据段、代码段和栈(但尽量不要这样做);在CPU中它看到的只是一个完整的逻辑单元

参考链接:浅谈汇编中的ds,cs与ip,ss与sp寄存器_ds寄存器的作用-CSDN博客

8086cpu中的寄存器(cs、ds、es、ss、ip、sp、bp、si、di)_对于8086cpu,已知ss是什么意思?-CSDN博客

【汇编中的寄存器分类与不同寄存器的用途】_通用寄存器_岁月的眸的博客-CSDN博客 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言是一种低级的计算机语言,它直接与计算机硬件进行交互。下面是汇编语言的基础知识整理: 1. 汇编语言的作用:汇编语言用于编写底层程序,如操作系统、驱动程序和嵌入式系统等。 2. 汇编语言的特点:汇编语言是一种符号化的机器语言,使用助记符来代替二进制指令,使程序更易读和理解。 3. 寄存器:寄存器是汇编语言中最基本的数据存储单元,用于存储数据和执行运算。常见的寄存器有通用寄存器、指针寄存器和标志寄存器等。 4. 指令:汇编语言的指令是对计算机硬件进行操作的命令。指令包括数据传输指令、算术运算指令、逻辑运算指令和控制指令等。 5. 内存访问:汇编语言通过内存地址来读取和存储数据。内存地址由段地址和偏移地址组成,通过段地址和偏移地址可以唯一确定内存中的一个位置。 6. 标志位:标志位是标记计算机状态的标志位,用于判断运算结果是否满足某些条件。常见的标志位有零标志位、进位标志位和溢出标志位等。 7. 标号和跳转:汇编语言中可以使用标号来标记程序中的位置,通过跳转指令可以根据条件或无条件地跳转到指定的标号处。 8. 子程序和栈:子程序是一段独立的代码块,可以在程序中被多次调用。栈是一种后进先出的数据结构,用于保存程序执行过程中的临时数据和返回地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值