2

I have just started to read about intel 8086 and have a question concerning its memory.

I read that the address bus is 20-bit wide, which means the address space is 1MB, and this space is divided into segments.

the question is:

  1. the four segment registers, CS, DS, SS and ES, are they read only or I can set their values, and which are their default values?

  2. I saw the following assembly tutorial:

    ORG 100h
    MOV AX, 0B800h ; set AX = B800h (VGA memory).
    MOV DS, AX ; copy value of AX to DS.
    MOV CL, 'A' ; CL = 41h (ASCII code).
    MOV CH, 01011111b ; CL = color attribute.
    MOV BX, 15Eh ; BX = position on screen.
    MOV [BX], CX ; w.[0B800h:015Eh] = CX.
    RET
    

Concerning the first line, does that mean this code will exist in address 0x100 in code segment space or in the whole address space

and the line:

MOV [BX], CX

Does that mean every time I reference an address in the MOV instruction, the address should be estimated from the start address of the data segment? (as he wrote that the destination is the value + the value in the data segment reg)

4

2 回答 2

11

首先,我不得不指出,您似乎在这里谈论的是 8086“实模式”寻址,这是一种非常古老的做事方式,几乎不再使用。几乎所有现代操作系统都在“保护模式”下运行,该模式支持许多增强功能(例如平面 32 位和 64 位内存空间寻址、虚拟内存等),这极大地改变了所有这些工作的方式。

据我所知,现在大多数操作系统甚至都没有办法运行这样的代码(在实模式下),所以如果你有兴趣学习汇编以编程现代 PC,你可能想要找到一些更新的资源来学习。

话虽如此,假设您确实有一些理由想要这样做(例如使用某些嵌入式处理器),或者只是出于历史目的而好奇:

  1. 是的,可以修改 8086 实模式段寄存器。执行此操作的指令和选项比修改更通用的寄存器更受限制(例如,没有指令直接将值加载到段寄存器中,这就是为什么在您引用的代码中,值是首先加载到AX,然后AX加载到DS),并且还可以根据您正在使用的段寄存器而有所不同。

    通常,您永远不会想要直接修改CS(“代码段”)寄存器,因为这会导致立即更改处理器正在运行的代码(可能以您真正不想要的方式)。通常的修改方法CS是使用“长跳转”或“长调用”指令,这将同时更新CSIP(指令指针)。同样,SS(“堆栈段”)通常在程序执行开始时设置并且从不更改(但从技术上讲,如果您有一些非常令人信服的理由这样做)。

    DS并且ES是通用数据段寄存器,程序更改这些是相当普遍的,但是他们希望最好地访问他们想要使用的内存(如上面的示例代码所示)。

    至于这些寄存器的初始值,通常由操作系统在调用程序代码之前确定。传统上,在 MS-DOS 中,有两种编写程序的方法,即 .COM 文件或 .EXE 文件。(ORG 100h上面代码中的行表明它打算作为 COM 程序运行。)在 COM 的情况下,MS-DOS 最初会将所有段寄存器设置为相同CS(也就是说,它们都在调用程序之前,指向 DOS 决定将程序加载到内存中的任何位置)。EXE 文件格式稍微复杂一些,允许指定单独的“数据段”,在这种情况下,操作系统将设置DSES在启动程序之前指向该段。在 EXE 程序中,DOS 通常也会为它们设置一个单独的堆栈段 ( SS)。

  2. The ORG 100h行告诉汇编器“假设下面的代码将被加载到地址 100h”。在实模式代码中,像这样的地址总是相对于CS(因此程序实际上可以加载到内存中的许多地方,只要CS设置为正确的值以使代码相对于 100h CS)。

  3. 大多数数据操作的地址(例如MOV)将在DS默认情况下相对于相对计算(对于某些指令,您可以通过明确指定要使用的不同段来更改它,但是是否以及如何做到这一点取决于操作码和您的方式'正在使用它)。但是,有一些指令被设计为默认使用其他段。总之,最好阅读您想了解的每个操作码的文档,以确定它如何使用哪些段寄存器。

于 2013-09-17T00:07:14.897 回答
1

获取英特尔 8088/86 手册。这一切都在那里解释。

是的,您可以更改它们,您必须能够更改它们才能使它们有用。默认情况下使用明显的段(代码对代码,数据对数据),但有些地方可以在数据指令上指定其他段。

org 0x100 表示此代码(或遵循 org 指令的数据)从段内的地址 0x100 开始。

于 2013-09-17T00:03:21.990 回答