8051模拟器汇编入门(1)移动内存数值

8051单片机模拟器可以在下面这个网址下载:

https://www.edsim51.com

点击下载按钮:

图片

下载后解压到本地目录得到以下两个文件:

图片

如果jar文件无法识别,去到Java网址www.java.com,下载Java运行环境:

图片

双击edsim51di.jar文件,运行模拟器界面如下:

图片

下面一片是外设区,暂时用不到,中间是汇编语言输入区,左边是寄存器和内存地址。右边是一些接口,暂时也用不到。

使用MOV命令移动内存数据

可以通过多种指令在内存中移动值。目前,我们将只关注MOV指令。移动的语法如下:

MOV 目标, 源

1.将一个数字存储在寄存器(Register)中,我们将寄存器作为目标,并将数字(前面加上一个“#”符号)放在前面。例如,

MOV R0, #5

将会把值5存储在通用寄存器R0中。数字前的“#”符号表示该数字是一个“立即”值—意味着这个数字将作为指令的一部分存储,而不是存储在内存中的某个位置。

图片

在汇编窗口输入命令行,运行后发现R0寄存器的值变为0x05(注:这里0x是一个前缀,表示这个数字是十六位进制的数)。

2.从一个寄存器复制值到另一个寄存器。例如,

MOV R1, R0

将会把当前存储在R1中的值复制到R0中。如果在上一条指令之后执行,R0和R1都将包含值5。请注意,值只是被复制。因此,如果R0中的值被替换,R1将不受影响。

但直接运行该命令会报错,原因是该模拟器不支持直接对寄存器的数值进行移动。

图片

我们需要借助累加器(accumulator)的帮忙,先将寄存器R0的数值拷贝到累加器A中,然后从A中拷贝数值到寄存器R1。

图片

再次运行程序,可以看到R1,R0和ACC都变成了5。

3.通过直接寻址将值复制到RAM中。例如,

MOV 32, #5

将会把值5存储在内存地址为32的字节中。内存地址也可以写成十六进制形式20H,这通常更容易理解。值也可以在寄存器和RAM之间来回复制。

图片

内存地址20数值变为5

也可以将32写成十六位进制20H的形式,这里的H表示该数是十六位进制(Hex),结果一样:

图片

4.通过使用存储在寄存器中的内存地址间接寻址一个内存位置(这只适用于寄存器R0和R1)。例如,

MOV R0, #64

MOV @R0, #5

首先将立即值64(40H)存储在R0中。然后,立即值5被存储在R0中存储的地址本身。结果相当于说,

MOV 64, #5

这将直接把立即值5放入内存地址64中。这样做的好处是内存地址可以被存储、传递、更改和动态指定。

图片

运行代码后,R0寄存器数值变为40H, 40H内存地址数值变为5。

练习1:

1.将立即值2存储在R2中。将R2复制到R3。将立即值7存储在R2中。改变R2会影响R3吗?

2.将R3中的值存储在内存地址42处。在内存显示组件中手动编辑内存地址69,并将其设置为3。将存储在内存地址69处的值复制到R5中。

3.手动将立即值7存储在R0中。将立即值4存储在当前R0指向的内存地址处。

答案:

  1. 图片
  2. 图片图片图片
  3. 图片