关于MOV指令的一些疑问
本帖最后由 zhouyg1992 于 2011-6-18 20:50 编辑假如我在数据段这么定义了一个变量X DB 1,2,3
然后如果我想把数1传送给AL那么下面这些指令哪个才是正确的MOV AL,X还是MOV AL,?这俩指令又有何区别?还有MOV AX,OFFSET X这个指令跟上面两个又有何区别?真混的慌。谁告诉我呀!新手 MOV AL,X是正确的
第二种写法不被允许,可以联想一下bx与区别
MOV AX,OFFSET X是把偏移地址送到AX中,结果为0,因为它指向的就是x的起点处,没有偏移量 再说明白点呗 还是不能理解。我看书上有这种形式的:MOV ,AX 那怎么第二条就不对呢? 你再看下头两集的视频呗,si明显是通用寄存器啊 这个我知道 我只是高不清楚这几个指令到底是怎么回事? MOV AX,
MOV AX,
那这两个指令本质上有啥区别? 其实mov al,不是不可以用
你要弄清楚,为啥mov al,可以用,而它不能用
因为bx,si有它默认的段,所以用时,CPU知道要从哪个段的偏移地址来读取
自己定义的变量就不同了,用的时候需要加上段地址mov al,ds:
这么说明白了么 zhouyg1992 发表于 2011-6-2 22:06 static/image/common/back.gif
MOV AX,
MOV AX,
那这两个指令本质上有啥区别?
如果X的值是100的话,那就没啥区别
只不过一个是常量,一个是变量
只是写指令的时候,注意格式,加上段地址 那如果我想把1 或者 2或者 3 传送给ax怎么做? 刚看完前3章,我觉得这个貌似是传递内存单元要用的 一定还要和DS配套用才可以吧 貌似是个变量,可能是错误的,如果有个具体的值在配合DS应该是正确的 嘿嘿,个人浅显的看法
传值的话 mov ax,1 不就可以了吗
要么 你就把1的值先放进地址中 在movax,2是偏移地址当然自己要知道DS的地址 MOV AL,X ;标记1 执行后的结果为:(AL)=1Bh(也就是十进制的27)
MOV BL, ;标记2 执行后的结果为:(BL)=00
MOV CX,OFFSET X ;标记3 执行后的结果为: (cx)=0000
上面是debug后的结果。可是总感觉哪里有些不对劲啊。 哦 错了 原程序是这样的。
.MODEL SMALL
.DATA
X DB 27,57,45
.STACK
.CODE
.STARTUP
MOV AL,X
MOV BL,
MOV CX,OFFSET X
.EXIT 0
END
MOV AL,X ;标记1 执行后的结果为:(AL)=1Bh(也就是十进制的27)
MOV BL, ;标记2 执行后的结果为:(BL)=00
MOV CX,OFFSET X ;标记3 执行后的结果为: (cx)=0000
上面是debug后的结果。可是总感觉哪里有些不对劲啊。 注意标记2 并不是其我们期望的结果。这是怎么回事呢?还有标记2跟标记3又有何区别呢,结果都一样啊、? mov ax,与mov ax,本质上有何区别呢? 看完前5章了,我谈谈自己的看法Mov ax,与mov ax,区别 这个应该是系统会自动默认把bx作为偏移地址,而 估计需要你在前面加个段地址,比如mov ax,es,如果不加段地址,系统可能就无法找到真正的物理地址,至于为什么‘这个应该是系统会自动默认把bx作为偏移地址’ 我也不知道,你可以看书本121页 程序5.9这里面可能会有你要的答案(汇编代码这里写了2个关于段地址的指令)
页:
[1]