本篇主要为寄存器和内存中相互传送数据,文章涉及的CPU为8086,文章中涉及到的内存地址皆为16进制
前言
在CPU中,用16位的寄存器来存储字型数据,用8位的寄存器来存储字节型数据
在内存中,用两个连续的内存单元存储字型数据,用一个内存单元存储字节型数据
如图:
-
字节型因为就存在一个单元中,所以概念十分简单,如上图
例:
0号单元存放的字节型数据是什么?
答案:20H
3号单元存放的字节型数据是什么?
答案:00H
-
字型因为存在两个单元中,所以规定了字单元的概念。即第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 练习
内存中的情况如图:

写出下列指令执行后,内存中的值
mov ax, 1000H
mov ds, ax
mov ax, 2C34H
mov [0], ax
mov bx, [0]
sub bx, [2]
mov [2], bx
答案以及过程:

2.2 debug测试
将上面的汇编代码在debug环境下进行测试
-
在内存中写入对应的值
-
将汇编指令写入其他内存处,并且修改CS:IP,让CS:IP指向指令即将执行的内存处
-
执行将2C34送入内存的指令,可以看出 高地址存放着 2C, 低地址存放着34
-
将相减后BX中的1B12存放到内存1000:2处,高地址存放1B, 低地址存放12