李忠 发表于 2013-1-14 09:56:43

再论代码move ax,data mov ds,ax的意义

看到有人提了个问题:
疑惑在于assume定义过各段的含义了,为什么在代码段内还要再写一遍数据段地址呢,代码段的地址不是自动加载到cs的吗      首先,一个程序可以分多个段,即,多个代码段、多个数据段和多个栈段。每个程序都必须有一个入口点,即,本程序第一个要执行的指令的位置,包括段地址(将要赋给CS)和偏移地址(将要赋给IP)。当操作系统加载完程序后,从该位置进入你的程序执行。这也就是为什么当你的程序开始执行时,CS和IP都自动赋值的原因。

      其次,当访问数据段时,一般默认是用DS。如
mov ax,      这里,默认是使用段寄存器DS。如果你想用其它段寄存器,需要指令前缀。在汇编语言中,就是使用段超越前缀:
mov ax,      在这里,强制使用段寄存器ES。

      因此,assume伪指令的作用是,为一个段指示默认的段寄存器。一旦你用了assume ds:data1,es:data2,那么,当访问data1段时,默认使用段寄存器DS,访问data2段时,默认使用段寄存器ES。否则,必须使用段超越前缀。

      最的,和CS与IP不同,段寄存器DS、ES、FS、GS和SS在程序开始执行时,不能赋值,则必须手工来做。原因很简单,程序可能包含了好多数据段和栈段,应当访问哪个段,应当由程序的编写者自己决定,直接赋值太武断了。比如,可能我希望先访问data2,而不是data1:

mov ax,data2
mov ds,ax

NGtailang 发表于 2013-1-14 13:18:46

你希望先访问data2,而不是data1:
是不是可以把 cs: ip先指向 data2呢???

李忠 发表于 2013-1-14 13:30:29

额滴神,data1和data2是数据段,怎么可以用CS:IP指向它呢?

林之白狼 发表于 2013-1-15 10:15:10

李忠 发表于 2013-1-14 13:30 static/image/common/back.gif
额滴神,data1和data2是数据段,怎么可以用CS:IP指向它呢?

CPU是不区分段的吧?他只会把CS:IP所指向的指令当做要执行的命令

李忠 发表于 2013-1-15 10:25:20

林之白狼 发表于 2013-1-15 10:15 static/image/common/back.gif
CPU是不区分段的吧?他只会把CS:IP所指向的指令当做要执行的命令

不明白你的意思。不知所云。
页: [1]
查看完整版本: 再论代码move ax,data mov ds,ax的意义