注册 登录
编程论坛 汇编论坛

有关“mov ax,bx”的一些疑问!

sxzjw 发布于 2010-06-01 13:29, 1461 次点击
在一次编程中,写了一条“mov ax,es”,masm不给通过。老师一看,说寄存器之间不能直接传值。
这个问题就让我很郁闷。

大家知道,cpu寄存器是内存中最快的了,可是显然如果寄存器之间不能传值,那么很多数据传递非要经过主存,速度不还是被降低了?

我的问题有两个:
1。不能出现“mov ax,es”,是masm5.0编译时候的一种不允许语句?还是对于cpu来说,就不存在直接传递两个寄存器值的硬件电路?

2。如果是cpu的问题,这样设计是问什么?
  如果是masm不允许,那这样又是为什么?

期待各位解答!
9 回复
#2
ONEPROBLEM2010-06-01 14:58
LZ,你的问题太深奥了
应该可以通过啊.
我用DEBUG验证了,可以吧.但也有特殊情况的.
#3
zklhp2010-06-01 17:25
没有5.0 不知道~
#4
sxzjw2010-06-01 23:51
回复 2楼 ONEPROBLEM
版主 是怎么通过的?
能给个版主 使用的原指令吗?我也验证下~
#5
sxzjw2010-06-01 23:53
回复 3楼 zklhp
好像 不能出现mov ax,es;现在一直很郁闷?那版主用哪个版本能通过?
#6
hu9jj2010-06-02 07:30
段寄存器好象是不能直接传递给数据寄存器的。
#7
zklhp2010-06-02 09:02
;#Mode=DOS
;MASMPlus 单文件代码模板 - 纯 DOS 程序
;--------------------------------------------------------------------
;单个文件需要指定编译模式,否则默认是EXE方式,在系统设置中可以设置默认是DOS还是Windows.
;编译模式自带了DOS/COM/CON/EXE/DLL/LIB这几种,如果有必要,可以更改ide.ini添加新的编译模式
;当然,更好的是创建为一个工程.更方便及易于管理,使用方法:按Ctrl多选->创建工程.必须有多个文件

.model small
.stack 200h
.data
    szMsg db 'Hello World!',13,10,'$'
   
.CODE
START:
    mov ax,@data
    mov ds,ax
    mov ax,es
    lea dx,szMsg
    mov ah,9
    int 21h
   
    ;暂停,任意键关闭
    mov ah,1
    int 21h
    mov ah,4ch     ;结束,可以修改al设置返回码
    int 21h
END START

ml.exe /Zm /c /nologo /Fo"es.obj" "E:\MASMPlus\Project\es.asm"
link5.exe /nologo "es.obj";

准备就绪:E:\MASMPlus\Project\es.exe
#8
zklhp2010-06-02 09:04
E:\MASMPlus\Bin>ml
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

usage: ML [ options ] filelist [ /link linkoptions]
Run "ML /help" or "ML /?" for more info

E:\MASMPlus\Bin>
#9
zklhp2010-06-02 09:04
cs 不能赋值 其他的应该是可以的~
#10
sxzjw2010-06-02 12:37
感谢各位的帮助~不过经过我认真的回想和分析,有些想法:
cpu个寄存器之间的值是可以传递的,用这个代码验证,masm是给通过的:
assume cs:code
code segment
 start: mov ax,100
    mov cx,200

    nop
    nop
   
    mov bx,ax
    mov dx,cx
    mov ds,ax
    mov es,cx
        mov bx,cs
        mov es,[bx]


    mov ax,4c00h
    int 21

code ends
end start


但是,不能出现这样的语句:mov es,b800h,也就是说不能直接给段寄存器附数值。这个肯定有错。
解决办法就是先吧值给了ax,再给了b800h。

但有人说  “从基本的cpu工作原理来看,cpu执行“MOV R1,R0”指令,cpu首先要完成的操作是(M->DR(M是主存储器))”。可是masm给通过寄存器之间的传值指令啊?

这是个什么问题?
1