首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MOV AX,CS和MOV DS,AX的概念

MOV AX,CS和MOV DS,AX的概念
EN

Stack Overflow用户
提问于 2011-03-19 19:12:38
回答 3查看 45.8K关注 0票数 5

有谁能解释一下这三种指令的功能吗?

代码语言:javascript
复制
  ORG 1000H 
  MOV AX,CS
  MOV DS,AX

理论上,我知道代码、数据和额外的片段是什么,但是:

  1. 如何在这个程序中实现?
  2. 为什么整个段被移动到另一个片段中?(MOV AX,CSMOV AX,CS)

这两条指令实际上是做什么的?

除了高亮显示的3条指令外,我可以理解这段代码中每条其他指令的含义。

(程序运行良好。它接受输入,直到0被击中--有一个mov ah,01h和一个int 21h,然后它将al'0'进行比较,如果al'0',则跳转到last,否则就跳入back。)

代码语言:javascript
复制
    ASSUME CS:CODE        
    CODE SEGMENT 
    ORG 1000H
    MOV AX,CS
    MOV DS,AX
BACK:
    MOV AH,01H
    INT 21H
    CMP AL,'0'
    JZ LAST
    JMP BACK
LAST:
    MOV AX,4C00H
    INT 21H
    CODE ENDS

    END

(编者注:.com程序在偏移量100h处加载,所有段寄存器设置相等。org 1000h可能是org 100h的一个错误,因为它看起来像一个.com程序。这个程序不会中断,因为它不使用任何绝对地址,只使用相对跳转。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-19 20:54:39

要真正解释这个概念,我们必须回到段的基本概念,以及x86如何使用它们(在实模式下)。

8086有20位寻址,但只有16位寄存器.为了生成20位地址,它结合了一个段和一个偏移量.段必须在段寄存器(CS、DS、ES或SS)中。然后生成一个偏移量(作为即时值,或另一个或两个寄存器的内容)。

因此,为了生成一个地址,一个16位段寄存器左移4位,然后在其他寄存器中添加一个16位偏移量,然后将合并的总计作为地址。大多数指令都附加了一个默认段-- pushpop和任何与bp相关的部分都将使用ss。跳转之类的使用cs。一些字符串指令es (例如,scans)和一些使用两个片段--例如,movsd将数据从[ds:si]复制到[es:di]。大多数其他指令使用ds。您还可以使用段重写显式地指定像es:bx这样的地址。

在任何情况下,在对段寄存器进行有意义的使用之前,首先必须使用您所关心的数据的地址(前16位)加载它。典型的“小模型”程序将从以下几个方面开始:

代码语言:javascript
复制
mov ax, @Data
mov ds, ax

在微型模型中,数据和代码使用相同的段。为了确保它引用的是正确的片段,您需要从CS获取16位,并将其复制到DS。正如许多其他人所提到的,没有直接将CS移到DS的指令。这个问题提到了一种可能性;另一种常见的可能性是:

代码语言:javascript
复制
push cs
pop ds
票数 12
EN

Stack Overflow用户

发布于 2011-03-19 19:24:41

ORG 1000H告诉汇编程序,下面的代码应该放在代码映像中的偏移量1000 H。

另外两个指令将CS复制到DS。它不是复制段本身,只是更新指向数据段的指针。对于一个小程序(<64K),静态数据(源中的字符串、间接跳转表中的字符串)可以与代码放在同一段中。访问静态数据之前,需要在DS中加载段基指针。加载程序(操作系统中从磁盘读取程序到内存并启动程序的部分)必须设置CS以使其能够运行程序,但不能设置DS,因此程序在启动时将CS复制到DS。

这两个指令序列是需要的,因为"MOV DS,CS“不是合法的8086指令。

票数 8
EN

Stack Overflow用户

发布于 2011-03-19 19:15:31

你做不到

代码语言:javascript
复制
MOV DS, CS

这是一个无效的操作(masm 32:error A2070: invalid instruction operands)。

代码语言:javascript
复制
MOV AX, CS
MOV DS, AX

这2条指令执行与mov ds, cs相同(这是无效的)。这样,汇编程序是快乐的,不抱怨。但我不能告诉您为什么程序员希望数据段与代码段相同

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5364270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档