有人可以解释三个指令的功能.....
> ORG 1000H
> MOV AX,CS
> MOV DS,AX
Run Code Online (Sandbox Code Playgroud)
我知道什么是代码,数据,理论上的额外段.
但,
1.他们如何在这些计划中实施?
2.为什么他们将整个部分移动到另一部分?(MOV AX,CS; MOV DS,AX;)
(对不起,如果问题是荒谬的)这两条指令的真正概念是什么......
/*以下给出的8086组装程序运行良好.
我可以理解这段代码中每条指令的含义,
除了突出显示的3条指令.*/
代码接受输入,直到0被击中!
Code:
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
Run Code Online (Sandbox Code Playgroud)
Jer*_*fin 10
为了真正解释这个概念,我们必须回到段的基本思想,以及x86如何使用它们(在实模式下).
8086具有20位寻址,但只有16位寄存器.要生成20位地址,它会将段与偏移量组合在一起.该段必须位于段寄存器(CS,DS,ES或SS)中.然后生成一个偏移量(作为立即值,或另一个或两个寄存器的内容).
因此,为了生成一个地址,一个16位的段寄存器向左移位四位,然后在其他寄存器中添加一个16位的偏移量,并且组合的总数实际上被用作地址.大多数指令附加有一个缺省段- push
,pop
和任何相对于bp
将使用ss
.跳跃和这样的使用cs
.一些的字符串指令es
(例如,scans
)和一些使用使用两个区段-例如,movsd
复制从数据[ds:si]
到[es:di]
.大多数其他说明使用ds
.您还可以使用段覆盖来显式指定地址es:bx
.
在任何情况下,在您可以有意义地使用段寄存器之前,首先必须使用您关注的数据的地址(前16位)加载它.一个典型的"小模型"程序将从以下内容开始:
mov ax, @Data
mov ds, ax
Run Code Online (Sandbox Code Playgroud)
在小型模型中,您对数据和代码使用相同的段.要确保它指的是正确的段,您需要从CS获取16位并将其复制到DS.正如其他许多人所提到的那样,没有指令将CS直接转移到DS.这个问题提到了一种可能性; 另一个常见的是:
push cs
pop ds
Run Code Online (Sandbox Code Playgroud)
ORG 1000H告诉汇编程序,后面的代码应放在代码映像中的偏移量1000H处.
另外两条指令将CS复制到DS.它不是复制段本身,只是更新指向数据段的指针.对于小程序(<64K),静态数据(源中的字符串文字,间接跳转表)可以与代码一起放在同一段中.在访问静态数据之前,需要在DS中加载段基指针.加载程序(从磁盘到内存读取程序并启动它运行的操作系统的一部分)必须设置CS以便它可以运行程序,但可能不设置DS,因此程序在启动时将CS复制到DS.
需要两个指令序列,因为"MOV DS,CS"不是合法的8086指令.