内存到内存是不可能的。段寄存器到段寄存器也是不可能的。
MOV 变量单元 常量/变量(基本原则)
以下均是合法的MOV指令:
MOV 内存变量 立即数 (单向)
MOV 内存变量 一般寄存器 (双向)
MOV 内存变量 DS/ES/SS/FS/GS(特殊寄存器) (双向)
MOV 内存变量 CS(代码段寄存器) (单向)
MOV 一般寄存器 CS (单向)
MOV 一般寄存器 DS/ES/SS/FS/GS(双向)
MOV 一般寄存器 一般寄存器 (双向)
MOV 一般寄存器 立即数 (单向)
在32位汇编里,CS已不是变量,而是由系统自动指定。
按照80x86的汇编语言来解释:
内存到内存、段寄存器到段寄存器,用MOV指令直接传送是不行的,因为Intel公司设计CPU的时候,没有设计这种功能。
内存到内存、段寄存器到段寄存器,还是可以通过其它方法来传送的。
不能的,因为汇编语言最终还是要终化成机器码的,而在X86有结构中明确说明,如果内存到内存或段寄存器直接进行交换的话,会导致指令字过长而无法识别。所以要想内存到内存必须要先用寄存器做为交换才可以了。比如:
push ax
mov ax,内存地址
mov 内存地址2,ax
pop ax
这样才能完成一个内存到内存的值传递。很显然你是可以看出来内存数需要内存地址去表示,而一个内存地址需要的是16位,两位内存数就需要32位,指令字放哪呢?所以,不可以实现内存直接到内存的,段寄存器也是一样的!
他们的回答,都不对。
这条指令: MOV 30H, 50H,就是正确的。
30H, 50H,这两个操作数,都是内存单元的地址。
你用 KEIL 软件编译,肯定不会报错的。
I:立即数
R:寄存器(不含段寄存器)
S:段寄存器
M:内存
则数据间的传送有:
I->R I->M
R->R R<->M R<->S
M<->S
所以你说的两个都不在上面指出的 是错误的