960050023 发表于 2012-5-24 10:08:18

程序加载后cs与code的关系(段寄存器与段名的关系)

assume cs:codesg
codesg segment
    dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
    dw 0,0,0,0,0
start:
    mov ax,cs   
    mov ss,ax
    mov sp,1ah   
    mov ax,0
    mov ds,ax
    mov bx,0
    mov cx,8
s:
    push
    pop cs:
    add bx,2
    loop s
   
    mov ax,4c00h
    int 21h
codesg ends
end start
这个是王爽著汇编语言教材实验5的第一题代码
1:如上程序那么程序被加载后cs与code表示的段地址之间有没有什么关系:
2:为何在第三小问中,可以通过cs和ds的关系来给出code段的段地址和data段的段地址
3:倘若去除下面程序中的start,那么cpu是不是通过默认第一条机器码为指令,然后根据该指令在code段中,从而将该段中的所有机器码都当做指令运行吗

assume cs:code
code segment

    mov ax,cs   
    mov ss,ax
    mov sp,1ah   
    mov ax,0
    mov ds,ax
    mov bx,0
    mov cx,8
s:
    push
    pop cs:
    add bx,2
    loop s
       dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
    dw 0,0,0,0,0

    mov ax,4c00h
    int 21h
code ends
end


xiaolongxia 发表于 2012-5-24 10:25:56

第一题的第二问:因为在代码中将stack标志和data标志分别赋给了ss段寄存器和ds段寄存器!
第三问:你可以自己编译下,然后debug下,看看呗!

960050023 发表于 2012-5-24 10:34:26

xiaolongxia 发表于 2012-5-24 10:25 static/image/common/back.gif
第一题的第二问:因为在代码中将stack标志和data标志分别赋给了ss段寄存器和ds段寄存器!
第三问:你可以自 ...

但是在整个代码中
code可没有赋给cs啊

960050023 发表于 2012-5-24 10:35:07

960050023 发表于 2012-5-24 10:34 static/image/common/back.gif
但是在整个代码中
code可没有赋给cs啊

我电脑是64位啊没有debug 啊怎么办啊

960050023 发表于 2012-5-24 10:37:20

960050023 发表于 2012-5-24 10:34 static/image/common/back.gif
但是在整个代码中
code可没有赋给cs啊

我电脑是64位没debug下了个虚拟机不会用啊

xiaolongxia 发表于 2012-5-24 10:44:41

960050023 发表于 2012-5-24 10:37 static/image/common/back.gif
我电脑是64位没debug下了个虚拟机不会用啊

cs段没有指定,但是,end start告诉了cpu从start标志出开始执行,执行的时候,cs:ip就执行了start标志的第一句代码,间接的将code赋值到了cs中!

论坛上有关于64位电脑使用dos的方法!你找找看

960050023 发表于 2012-5-24 11:12:13

xiaolongxia 发表于 2012-5-24 10:44 static/image/common/back.gif
cs段没有指定,但是,end start告诉了cpu从start标志出开始执行,执行的时候,cs:ip就执行了start标志的 ...

code段的段地址决定cs 还是cs决定code段的段地址

Ginx 发表于 2012-5-24 11:32:35

本帖最后由 Ginx 于 2012-5-24 11:33 编辑

第一问:在程序加载的时候,assume 伪指令在程序加载的时候,会自动把cs和cscode关联
第三问。是

xiaolongxia 发表于 2012-5-24 11:36:00

960050023 发表于 2012-5-24 11:12 static/image/common/back.gif
code段的段地址决定cs 还是cs决定code段的段地址

不是谁决定谁,‘code’在编译的时候会被编译成一个段地址,而cs:ip指向的代码,cpu将会将其视为指令!而cs:IP一开始指向那里,就由‘end 标志’中的标志决定了,也就是说cpu一开始执行‘标志’那里,而这时候,cs的值就跟‘code’一样!你可以想象成,将code的值赋给了cs段寄存器!不存在谁决定谁!
‘code’标识的段地址,是编译时就定下来的!

xiaolongxia 发表于 2012-5-24 11:43:54

你第一题的代码写错了!!!!

xiaolongxia 发表于 2012-5-24 11:47:48

我个人的理解:对于想’code segment‘可以将code理解为段地址,以后使用他给别的寄存器赋值,它都代表了‘codesegment ’到 ‘code ends’这段数据或者代码的段地址!其他类似stack segment也一样的!

960050023 发表于 2012-5-24 11:50:43

xiaolongxia 发表于 2012-5-24 11:36 static/image/common/back.gif
不是谁决定谁,‘code’在编译的时候会被编译成一个段地址,而cs:ip指向的代码,cpu将会将其视为指令!而 ...

如果END 后面没有表示那怎么办

960050023 发表于 2012-5-24 11:52:17

960050023 发表于 2012-5-24 11:50 static/image/common/back.gif
如果END 后面没有表示那怎么办

如果end后面没有标志那怎么办

xiaolongxia 发表于 2012-5-24 11:58:48

程序将从有效代码的第一句开始执行!像你写的代码,将会从0123h开始,cpu将其当作指令开始执行,具体当成什么指令,就要看这些机器码对应什么指令了!(0123h在内存中存放,是‘23 01’ 存放的)所以,一定要在末尾用end 标志,告诉编译器在哪里开始执行代码!具体cpu如何从指定的标志开始执行就不是你现在要关心的了!

960050023 发表于 2012-5-24 12:06:08

xiaolongxia 发表于 2012-5-24 11:58 static/image/common/back.gif
程序将从有效代码的第一句开始执行!像你写的代码,将会从0123h开始,cpu将其当作指令开始执行,具体当成什 ...

很好谢谢 怎样把分给你啊

960050023 发表于 2012-5-24 12:07:42

xiaolongxia 发表于 2012-5-24 11:43 static/image/common/back.gif
你第一题的代码写错了!!!!

错在哪里啊

xiaolongxia 发表于 2012-5-24 12:11:02

代码本身没错,可是我跟实验5的第一题没对上......

960050023 发表于 2012-5-24 13:09:14

xiaolongxia 发表于 2012-5-24 12:11 static/image/common/back.gif
代码本身没错,可是我跟实验5的第一题没对上......

实验五第一题中哪些被定义的数据保存在哪里啊

阔怀 发表于 2015-8-22 10:25:17

{:1_1:}
页: [1]
查看完整版本: 程序加载后cs与code的关系(段寄存器与段名的关系)