-
-
[旧帖]
[讨论]由汇编指令mov ax,0和mov ax,[0]来看Debug和masm对指令的不同处理
0.00雪花
-
发表于:
2011-12-13 22:51
2052
-
[旧帖] [讨论]由汇编指令mov ax,0和mov ax,[0]来看Debug和masm对指令的不同处理
0.00雪花
以前有人在群里问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]
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)