首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

由汇编指令mov ax,0和mov ax,[0]来看Debug和masm对指令的不同处理,该如何处理

2012-03-18 
由汇编指令mov ax,0和mov ax,[0]来看Debug和masm对指令的不同处理以前有人在群里问mov ax,0和mov ax,[0]什

由汇编指令mov ax,0和mov ax,[0]来看Debug和masm对指令的不同处理
以前有人在群里问mov ax,0和mov 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 汇编程序的毛病。

插入图片,一个是外面的可以外链的图床;或者是上传到自己的 csdn 空间里。

热点排行