为之疯狂 发表于 2014-3-30 18:31:22

这样为什么就不可以?

assume cs:codesg

codesg segment

fishcc: mov ax,1000H
         mov ds,ax
           mov cx,6
           mov ax,   ;为什么这里就不能换成cx一定要是bx,同样通用寄存器?
          
           mov ax,4c00H
           int 21H
codesg ends

end fishcc

oggplay 发表于 2014-3-30 19:31:57

学过C 么?不赋值能用?

为之疯狂 发表于 2014-3-30 19:39:15

oggplay 发表于 2014-3-30 19:31 static/image/common/back.gif
学过C 么?不赋值能用?

mov cx,6   请问c 里面的赋值 可否等于这个?
]

oggplay 发表于 2014-3-30 19:47:27

为之疯狂 发表于 2014-3-30 19:39 static/image/common/back.gif
mov cx,6   请问c 里面的赋值 可否等于这个?
]
mov ax,,表示将CX指向内存的地址的值赋值给ax,上一步mov cx,6,也就是将内存地址为6的值赋给ax

为之疯狂 发表于 2014-3-30 22:55:14

oggplay 发表于 2014-3-30 19:47 static/image/common/back.gif
mov ax,,表示将CX指向内存的地址的值赋值给ax,上一步mov cx,6,也就是将内存地址为6的值赋给ax

但是masm编译器它不允许拿CX来装数据的偏移地址,而只能用BX,我想知道的是,同样是寄存器为什么就不能用CX,或者DX

无名侠 发表于 2014-3-31 20:28:11

在32位汇编中这是可以的
在16位中 只可以使用 bx si di bp sp寻址

志华 发表于 2014-4-1 13:24:22

这有什么为什么的,人家这样规定你就这样用。这就是语法没道理可讲。win32下随便怎么用。

xunxianol 发表于 2014-4-2 16:25:43

6楼正解,这是规定 不用知道为什么

大白鲨 发表于 2014-4-2 20:05:56

这就是规定

snowpower 发表于 2014-4-3 16:03:26

本帖最后由 snowpower 于 2014-4-3 16:05 编辑

这个是16位的规定吧,默认情况它把BX和DS是关联起来的,如果你不是这么写mov ax,ss: ,而是写成mov ax,,那么它和mov ax,ds:是等同的(那个ds的值是你上一步mov ds,ax 留下的结果),但是你写成mov bx, 那么机器根本不知道你的到底想从那个基地址去取(是从ds取还是ss里?),反过来说bp和SS默认是一对的,mov ax, ,是从ss取得基地址,这个不能乱填的,比如以后的学习你发现mov ax , 这种是错误的,因为bx和bp不能同时用在一起,因为它不知道你的意图,从哪取基地址

为之疯狂 发表于 2014-4-4 11:03:34

snowpower 发表于 2014-4-3 16:03 static/image/common/back.gif
这个是16位的规定吧,默认情况它把BX和DS是关联起来的,如果你不是这么写mov ax,ss: ,而是写成mov ax,,那么 ...

厉害,瞬间就懂了
页: [1]
查看完整版本: 这样为什么就不可以?