第5章的实验,还没学到后面。有几个问题,如下:
1、mov [al],bx 或 mov [bl],al 或mov [bl],ax为何不对?8086硬性规定?那括号里我就想用8位寄存器而不想用16位的怎办?

2、如下图这段程序我想将某一段内存空间置0,以便我观察后续程序结果,mov [bx],0 也不行,似乎后面跟常量就不行,一定要是寄存器名字;

3、对于我最终用masm5.0与link生成的EXE文件,我在WIN文件夹下,直接双击运行,并不能实现最终结果(置0或复制等),必须得是在虚拟DOS界面里用debug加载,运行,看结果,这是什么原理?
------解决思路----------------------
1. 用于间接寻址的寄存器,必须要和当时的地址位长一致吧;16 位模式下,就要用 16 位的寄存器,所以 AL 是不可以的;而且,16 位下,不是所以的寄存器都可以用作间接寻址的,由于指令编码位的限制,只有 BX/SI/DI/BP 可以,其它的都不支持。
2. mov [bx],0 这个指令,这样的表示无法看出来要操作的内存单元的大小,是字节,还是字?所以,应该指明了,如 mov byte ptr [bx], 0 或 mov word ptr [bx], 0。如果是较大片的空间置 0,使用 〔b]rep stosb[/b] 指令更合适。
------解决思路----------------------
3. 直接双击运行个 dos16 类的程序,通常会一闪而过吧;即便是暂停下来了,也是无法再运行其它程序来查看你这个程序的运行结果的,若是再另外打开个诸如 debug 什么的,它们却不在一个空间里,windows 对每个 dos 程序都使用一个各自独.立的虚拟空间的。
------解决思路----------------------
2. 那些指令,不是什么新的指令,就是对你指令的明确化而已。对内存操作,当然是要确定操作的大小的,只是有些指令可以说明如 mov [bx], al 这样的就是字节大小的操作,一般是可以不加 byte ptr 的。
3. 当然不能对当前系统某段空间置 0。windows 是个保护模式的系统,对内存有分级权限控制的;更何况其中的 dos 只是个虚拟的 dos 环境,对其中任意内存的修改只是在那个虚拟的环境里进行,不影响到 windows 自身,更不会影响到另外打开的 dos 环境。