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

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

如果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指向的内存地址处。
答案: