现在的位置: 首页 > 综合 > 正文

汇编中debug和Masm不同的处理方式

2013年02月23日 ⁄ 综合 ⁄ 共 1436字 ⁄ 字号 评论关闭

问题1:对于mov ax,12

             debug解释是ax=0012H

             masm解释是ax=000CH

问题2:debug模式下,mov ax,[0]向ax中传送的是ds:0000中的内容

           masm编译器对mov ax,[0]的处理是直接向ax中传送0

   纯属masm编译器的问题

为了达到相同的效果可以用   mov bx,0

                                              mov ax,[bx]

                                   或显式给出数据段地址寄存器:

                                              mov ax,ds:[0]

                               代替   mov ax,[0]


-----------------------------------以下部分为转载---------------------------------------------


由汇编指令mov ax,0mov ax,[0]来看Debug和masm对指令的不同处理
以前有人在群里问mov ax,0mov ax,[0]什么情况下相同,很多人一口否决,说前者传送的是数据0,后者传送的是内存单元ds:0中存储的数据。后来在书上看到了这个知识点,总结了一下贴在这里,希望能纠正一些学习中的人对这个地方的错误认识,同时促进交流学习~~~废话不多说:

我们在debug中写过如下指令:mov ax,[0]
表示将ds:
0处的数据送入ax中。但是在汇编源程序中,指令mov ax,[0]被编译器当作指令mov ax,0 处理。
下面通过具体例子来看一下Debug和汇编编译器masm对指令mov ax,[0]的不同处理。
程序任务:将内存2000:0 2000:1 2000:2单元中的数据送入al,bl,cl中。
一、 在debug 中编程实现:
mov ax,2000
mov ds,ax
mov al,[0]
mov bl,[1]
mov cl,[2]
二、 汇编源程序实现:
Assume cs:code
code segment

mov ax,2000h
mov ds,ax
mov al,[0]
mov bl,[1]
mov cl,[2]

mov ax,4c00h
int 21h

code ends
end

接下来看一下实施情况:
1) Debug 中的情况如图:

2) 将汇编源程序存储为.asm格式的,用masm编译运行成功,然后debug加载调试结果如下:

比较后可以很容易的得出,Debug和masm对mov ax,[0]这类指令的解释是不同的。Debug将”[整数]”解释为一个内存单元,整数
为内存单元的偏移地址;而masm将”[整数]”解释为一个 整数。


那么采取什么方法可以将内存2000:0 2000:1单元中的数据送入al,bl中?
有两种方法可以实现:
1. 先将偏移地址送入bx寄存器中,用[bx]的方式访问内存单元,具体代码:
mov ax,2000h
mov ds,ax
mov bx,0
mov al,[bx]
这样做可以实现将内存单元2000:0中的数据送入al 中,但是不够简洁,我们希望像Debug 中那样,在[]中直接给出偏移地址,于是,有了方法2.
2. 在”[]”前面给出段地址所在的段寄存器,比如:
mov ax,2000h
mov ds,ax
mov al,ds:[0]



------解决方案--------------------------------------------------------
这,纯粹是 Masm汇编程序的毛病。

抱歉!评论已关闭.