【汇编语言】寄存器与内存

本篇主要为寄存器和内存中相互传送数据,文章涉及的CPU为8086,文章中涉及到的内存地址皆为16进制

前言

在CPU中,用16位的寄存器来存储字型数据,用8位的寄存器来存储字节型数据

在内存中,用两个连续的内存单元存储字型数据,用一个内存单元存储字节型数据

如图:

image-20210807175319513

  1. 字节型因为就存在一个单元中,所以概念十分简单,如上图

    例:

    0号单元存放的字节型数据是什么?

    答案:20H

    3号单元存放的字节型数据是什么?

    答案:00H

  2. 字型因为存在两个单元中,所以规定了字单元的概念。即第N个单元和第N+1个单元构成一个字单元。

    例1:

    0号单元存放的字型数据是什么?

    答案:4E20H

    解析:将 0 号单元和 0 + 1 号单元看为一个字单元,这个字型数据的低位字节存放在这个字单元的低地址处,高位字节存放在这个字单元的高地址处。

    即高地址为4EH, 低地址为20H

    例2:

    2号单元存放的字型数据是什么?

    答案:0012H

    例3:

    1号单元存放的字型数据是什么?

    答案:124EH

1. DS和[address]

CPU在读写内存的时候需要给出地址,而内存地址由段地址和偏移地址构成,DS用来确认段地址,[adress]用来确认偏移地址。这与CS用来确认指令的段地址,IP用来确认偏移地址十分相似。

1.1 DS怎么写入数据

以下写法是错误的

MOV DS, 1000 ; DS指向段地址1000

以下写法是正确的

MOV AX, 1000
MOV DS, AX

DS只能间接的从其他寄存器传入数据

1.2 怎么使用偏移地址

偏移地址直接使用[偏移地址]表示

从内存到寄存器:

格式:mov 寄存器, [偏移地址]

从寄存器到内存:

格式:mov [偏移地址], 寄存器

例:

如何从把1000:0008中的数据传入AX寄存器中?

MOV AX, 1000 
MOV DS, AX    ;先将段地址确定
MOV AX, [0008] ;然后将偏移地址为8的内存上的数据传送到AX中

如何将AX寄存器中的数据传送到1000:0008中?

MOV BX, 1000
MOV DS, BX
MOV [0008], AX

2. 练习题与debug测试

2.1 练习

内存中的情况如图:

image-20210808093854512

写出下列指令执行后,内存中的值

mov ax, 1000H
mov ds, ax
mov ax, 2C34H
mov [0], ax
mov bx, [0]
sub bx, [2]
mov [2], bx

答案以及过程:

image-20210808100130506

2.2 debug测试

将上面的汇编代码在debug环境下进行测试

  1. 在内存中写入对应的值

    image-20210808100735605
  2. 将汇编指令写入其他内存处,并且修改CS:IP,让CS:IP指向指令即将执行的内存处 image-20210808101358451

  3. 执行将2C34送入内存的指令,可以看出 高地址存放着 2C, 低地址存放着34
    image-20210808101803557

  4. 将相减后BX中的1B12存放到内存1000:2处,高地址存放1B, 低地址存放12
    image-20210808102043525

猜你喜欢

转载自blog.csdn.net/qq_45978890/article/details/119509844