关于汇编语言中的立即寻址和直接寻址

本文详细阐述了80x86汇编语言中立即寻址与直接寻址的概念,并通过实验揭示了编译软件在处理这两者时的特殊要求。实验表明,尽管语法相似,但在使用编译软件时,必须在直接寻址的表达式外加段超越标记,以避免被误识别为立即寻址。文章最后讨论了这一现象的原因及可能的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 80x86 汇编语言中,立即寻址直接寻址的格式有些相似,区别就在于 [ ] 的有无

看看下面两行:
  MOV   AX,   1000
  MOV   AX,  [ 1000 ]

前一行,是立即寻址是把 1000 这个数,送到 AX 中去;
后一行,是直接寻址,是把存储器中 1000 单元中的数,送到 AX,(默认使用 DS 为段寄存器)。

上面这些说法,在各种《微机原理》、《汇编语言》的教材、参考书中,都是这样介绍的。
在实践中,使用 DEBUG 软件调试程序时,上述说法也是成立的。

但是,(呵呵,就怕出现这个“但是”)
有位网友发现了问题,在使用编译软件(如 MASM 5.0)时:上面写的两行,效果是相同的,都是立即寻址! 都是立即寻址!! 都是立即寻址!!!

开始,做而论道并不相信,怎么可能这样呢 ?
一个没有括号,一个有括号,结果怎么可能相同呢? 怎么可能都是立即寻址呢 ?
在网友的催促下,做而论道进行了实验,结果证明,这位网友说的是正确的。

实验的结果如下:
    MOV   AX,  1000H    ;是把 1000H 这个数,送到 AX 中去
    MOV   AX, [1000H]   ;也是把 1000H 这个数,送到 AX 中去

    MOV   [1000H], AX   ;软件提示:这是错误的指令,立即数不能当做目的地

结果,真是不可想像。

解决方法:在括号外边,写上 DS:,即,加上段超越的标记,才行。
    MOV   AX,  1000H            ;是把 1000H 这个数,送到 AX 中去

    MOV   AX,  DS: [1000H]   ;加上段超越标记,才是把 1000H 单元中的数,送到 AX
    MOV   DS: [1000H], AX   ;加上段超越的标记,才能把 [1000H] 当成存储单元的地址

经过实验,确实是这样,加上了段超越的标记,才能被编译软件认定为直接寻址。

结论:在使用编译软件(如 MASM)进行编译时,即使有了括号,还必须加上段超越的标记,这才是直接寻址,否则就是立即寻址

不过,话还得说回来:在使用 DEBUG 软件时,就不需要用段超越了。
使用 DEBUG 时,可以在这个软件中,直接输入汇编语言。此时,就可以不用段超越的形式了。只由是否使用 [ ],就可以区分出来:
立即寻址、直接寻址。

做而论道翻遍了能找到的书,有老的,也有新出版的,都没有这两种软件两样方法的说法。

做而论道觉得:
 编译软件要求
加上段超越,是编译软件的 BUG,并不是正式的规则。
 而调试软件 DEBUG,不需要加上段超越,这才符合《汇编语言》所介绍的指令格式。
不知道大家以为如何 ?

如果把加上段超越当成正式的规则,那么,(做而论道看过的)所有的书,岂不是都得改写了 !!!

--完--

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值