注册 登录
编程论坛 汇编论坛

新手求解,定义段的作用

tclgyq 发布于 2012-05-04 15:52, 986 次点击
为什么看没个汇编程序都需要设什么数据段,堆栈段,代码段。有什么作用?求解
17 回复
#2
马甲1号2012-05-04 16:01
去看编译原理
#3
tclgyq2012-05-04 16:39
看了,有点抽象,是分配内存单元,但是代码的执行是怎么跟这些内存单元联系的,C语言里面也没有这么定义段的,新手勿喷
#4
zklhp2012-05-04 16:42
C语言里面也没有这么定义段的,新手勿喷

简单来说 这就是C语言这种高级语言与汇编这种低级语言的区别

你说的这些个代码段 数据段 是CPU的设计(此处指80x86) 也就是CPU要这个东西

对于高级语言 编译器连接器自动做好了这些事 你不知道有这个东西 很正常 而汇编比较原始 比较贴近硬件 所以 你得设置这个
#5
zklhp2012-05-04 16:44
但是代码的执行是怎么跟这些内存单元联系的

对于8086是 通过设置段寄存器来达到这个目的的 对于80386以上的保护模式是通过选择子来实现的 总之是有一个机制 这个机制是CPU层面的 这也导致了汇编的不可移植
#6
zklhp2012-05-04 16:46
记得要结题给分


[ 本帖最后由 zklhp 于 2012-5-4 16:49 编辑 ]
#7
tclgyq2012-05-04 16:46
执行汇编程序的时候,这些代码是怎么跟设置的这些段联系的啊
#8
zklhp2012-05-04 16:48
以下是引用tclgyq在2012-5-4 16:46:51的发言:

执行汇编程序的时候,这些代码是怎么跟设置的这些段联系的啊

assume cs:code,ds:data,ss:stack

data segment
    dw 0123h,0456h
data ends

stack segment
    dw 0,0
stack ends

code segment

start:    mov ax,stack
    mov ss,ax
    mov sp,16

    mov ax,data
    mov ds,ax

比如这段8086汇编代码就做了相应的工作。。
#9
tclgyq2012-05-04 16:58
assume cs:code,ds:data,ss:stack

data segment
    dw 0123h,0456h
data ends

stack segment
    dw 0,0
stack ends

code segment

start:    mov ax,stack
    mov ss,ax
    mov sp,16


    mov ax,data
    mov ds,ax
数据段,堆栈段,代码段,代码段的内容怎么和前面数据段,堆栈段的内容联系的


#10
tclgyq2012-05-04 16:58
请您解释清楚点,分给你
#11
zklhp2012-05-04 17:22
我说的够明白了。。。。。

;这个是伪指令 可有可无
assume cs:code,ds:data,ss:stack

;定义数据段
data segment
    dw 0123h,0456h
data ends

;定义堆栈段
stack segment
    dw 0,0
stack ends

;定义代码段
code segment

start:   
    ;堆栈段段地址放到ss寄存器里了 这不就建立联系了么。。。
    mov ax,stack
    mov ss,ax
    mov sp,16

    ;数据段段地址放到ds寄存器里了 这不就建立联系了么。。。
    mov ax,data
    mov ds,ax

代码段由加载器来做 不用我们设置

如果你看了注释还不懂 可以等其他人或者看书 我能说的就这些了
#12
zklhp2012-05-04 17:23
不明白可以再问 欢迎提问~~~
#13
马甲1号2012-05-04 19:07
啊, 可恶, zklhp大牛强分
#14
有容就大2012-05-25 13:14
;数据段段地址放到ds寄存器里了 这不就建立联系了么。。。
    mov ax,data
    mov ds,ax
可不可以写成;
    mov dx,data
    mov ds,dx

?
#15
于祥2012-05-25 20:36
回复 14楼 有容就大
可以的
#16
有容就大2012-05-25 21:39
回复 15楼 于祥
貌似 ax bx cx dx 没多大区别啊
书上那样写是习惯还是有一定的原因?
#17
zklhp2012-05-26 13:36
以下是引用有容就大在2012-5-25 21:39:53的发言:

貌似 ax bx cx dx 没多大区别啊
书上那样写是习惯还是有一定的原因?


简单来说没区别 如果研究的深是有区别的
#18
有容就大2012-05-26 14:26
以下是引用zklhp在2012-5-26 13:36:50的发言:



简单来说没区别 如果研究的深是有区别的
这个可能和具体的指令方式有关系 比如16位 mov bx [ax]可能就出错吧。
1