当前位置: 网学 > 编程文档 > 汇编语言 > 正文

简明x86汇编语言教程(4)-操作内存

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/18
下载{$ArticleTitle}原创论文样式

好的,只是一个程序崩溃了,而操作系统的其他进程照常运行(同样的程序在DOS中几乎是板上钉钉的死机,因为NULL指针的位置恰好是中断向量表),你甚至还可以调试它。

保护模式还有其他很多好处,在此就不一一赘述了。实模式和保护模式之间的切换问题我打算放在后面的“高级技巧”一章来讲,因为多数程序并不涉及这个。

了解了内存的格局,我们就可以进入下一节——操作内存了。

3.3 操作内存

前两节中,我们介绍了实模式和保护模式中使用的不同的内存格局。现在开始解释如何使用这些知识。

回忆一下前面我们说过的,寄存器可以用作内存指针。现在,是他们发挥作用的时候了。

可以将内存想象为一个顺序的字节流。使用指针,可以任意地操作(读写)内存。

现在我们需要一些其他的指令格式来描述对于内存的操作。操作内存时,首先需要的就是它的地址。

让我们来看看下面的代码:

mov ax,[0]

方括号表示,里面的表达式指定的不是立即数,而是偏移量。在实模式中,DS:0中的那个字(16-bit长)将被装入AX。

然而0是一个常数,如果需要在运行的时候加以改变,就需要一些特殊的技巧,比如程序自修改。汇编支持这个特性,然而我个人并不推荐这种方法——自修改大大降低程序的可读性,并且还降低稳定性,性能还不一定好。我们需要另外的技术。

mov bx,0
mov ax,[bx]

看起来舒服了一些,不是吗?BX寄存器的内容可以随时更改,而不需要用冗长的代码去修改自身,更不用担心由此带来的不稳定问题。

同样的,mov指令也可以把数据保存到内存中:

mov [0],ax

在存储器与寄存器之间交换数据应该足够清楚了。

有些时候我们会需要操作符来描述内存数据的宽度:

操作符 意义
byte ptr 一个字节(8-bit, 1 byte)
word ptr 一个字(16-bit)
dword ptr 一个双字(32-bit)

例如,在DS:100h处保存1234h,以字存放:

mov word ptr [100h],01234h

于是我们将mov指令扩展为:

mov reg(8,16,32), mem(8,16,32)
mov mem(8,16,32), reg(8,16,32)
mov mem(8,16,32), imm(8,16,32)

需要说明的是,加减同样也可以在中使用,例如:

mov ax,[bx+10]
mov ax,[bx+si]
mov ax,es:[di+bp]

等等。我们看到,对于内存的操作,即使使用MOV指令,也有许多种可能的方式。下一节中,我们将介绍如何操作串。

感谢 网友 水杉 指出此答案中的一处错误。
感谢 Heallven 指出.COM程序实例编译失败的问题

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号