简明x86汇编语言教程(4)[修订版]
|
源代码网整理以下在前面的章节中,我们已经了解了寄存器的基本使用方法。而正如结尾提到的那样,仅仅使用寄存器做一点运算是没有什么太大意义的,毕竟它们不能保存太多的数据,因此,对编程人员而言,他肯定迫切地希望访问内存,以保存更多的数据。 源代码网整理以下我将分别介绍如何在保护模式和实模式操作内存,然而在此之前,我们先熟悉一下这两种模式中内存的结构。 3.1 实模式源代码网整理以下事实上,在实模式中,内存比保护模式中的结构更令人困惑。内存被分割成段,并且,操作内存时,需要指定段和偏移量。不过,理解这些概念是非常容易的事情。请看下面的图:
源代码网整理以下段-寄存器这种格局是早期硬件电路限制留下的一个伤疤。地址总线在当时有20-bit。 源代码网整理以下然而20-bit的地址不能放到16-bit的寄存器里,这意味着有4-bit必须放到别的地方。因此,为了访问所有的内存,必须使用两个16-bit寄存器。 源代码网整理以下这一设计上的折衷方案导致了今天的段-偏移量格局。最初的设计中,其中一个寄存器只有4-bit有效,然而为了简化程序,两个寄存器都是16-bit有效,并在执行时求出加权和来标识20-bit地址。 源代码网整理以下偏移量是16-bit的,因此,一个段是64KB。下面的图可以帮助你理解20-bit地址是如何形成的:
源代码网整理以下段-偏移量标识的地址通常记做 段:偏移量 的形式。 软件开发网 www.mscto.com 源代码网整理以下由于这样的结构,一个内存有多个对应的地址。例如,0000:0010和0001:0000指的是同一内存地址。又如, 源代码网整理以下0000:1234 = 0123:0004 = 0120:0034 = 0100:0234 源代码网整理以下作为负面影响之一,在段上加1相当于在偏移量上加16,而不是一个“全新”的段。反之,在偏移量上加16也和在段上加1等价。某些时候,据此认为段的“粒度”是16字节。 软件开发网 www.mscto.com 源代码网整理以下练习题 软件开发网 www.mscto.com 2EA8:D678 26CF:8D5F 453A:CFAD 2933:31A6 5924:DCCF 源代码网推荐 694E:175A 2B3C:D218 728F:6578 68E1:A7DC 57EC:AEEA 源代码网整理以下稍高一些的要求是,写一个程序将段为AX、偏移量为BX的地址转换为20bit的地址,并保存于EAX中。 源代码网整理以下[ 上面习题的答案 ] 源代码网整理以下我们现在可以写一个真正的程序了。 源代码网整理以下经典程序:Hello, world ;;; 应该得到一个29字节的.com文件源代码网推荐 源代码网推荐 .MODEL TINY 源代码网推荐 .CODE 源代码网推荐 源代码网推荐 CR equ 13 源代码网推荐 LF equ 10 源代码网推荐 TERMINATOR equ "$" 源代码网推荐 源代码网推荐 ORG 100h 源代码网推荐 源代码网推荐 Main PROC 源代码网推荐 mov dx,offset sMessage 源代码网推荐 mov ah,9 源代码网推荐 int 21h 源代码网推荐 mov ax,4c00h 源代码网推荐 int 21h 源代码网推荐 Main ENDP 源代码网推荐 源代码网推荐 sMessage: 源代码网推荐 DB "Hello, World!" 源代码网推荐 DB CR,LF,TERMINATOR 源代码网推荐 源代码网推荐 END Main 源代码网推荐 源代码网推荐 ; .COM文件的内存模型是‘TINY" 源代码网推荐 ; 代码段开始 源代码网推荐 源代码网推荐 ; 回车 源代码网推荐 ; 换行 源代码网推荐 ; DOS字符串结束符 源代码网推荐 源代码网推荐 ; 代码起始地址为CS:0100h 源代码网推荐 源代码网推荐 源代码网推荐 ; 令DS:DX指向Message 源代码网推荐 ; int 21h(DOS中断)功能9 - 源代码网推荐 ; 显示字符串到标准输出设备 源代码网推荐 ; int 21h功能4ch - 源代码网推荐 ; 终止程序并返回AL的错误代码 源代码网推荐 源代码网整理以下 源代码网整理以下那么,我们需要解释很多东西。 源代码网整理以下首先,作为汇编语言的抽象,C语言拥有“指针”这个数据类型。在汇编语言中,几乎所有对内存的操作都是由对给定地址的内存进行访问来完成的。这样,在汇编语言中,绝大多数操作都要和指针产生或多或少的联系。 源代码网推荐 源代码网供稿. |
