君未知 发表于 2014-2-12 16:23:35

请问第四章的入口地址start有什么用

本人是新手,目前学习到第四章,发现小甲鱼讲的start:入口地址不知道有什么用,用编译器编译连接后,在用debug调试感觉没有什么区别,寄存器的值有start和没有start怎么都一样

无念道长 发表于 2014-2-12 16:40:20

能不能贴一下具体代码
start是一个标号,在编译阶段,被编译器翻译为地址(也就是16位的内存地址),一般程序最后会有一个"end start",程序运行前,会先找end,找到后面的标号(也就是地址),从地址后开始执行,而你写出来的语句,都是按照顺序存储在内存中的,所以一步一步执行,如果标号处正好是程序开始的位置,那写和没写一样,当你看到第六章时,在code segment里面使用数据时,就能看出来不一样了,程序从start开始以后,后面定义ds为code segment开始,那时,调用数据时就是从code segment开始搜索数据地址,而程序真正开始执行的语句是从start(也就是end 后面的标号)开始的。

君未知 发表于 2014-2-12 16:52:43

无念道长 发表于 2014-2-12 16:40 static/image/common/back.gif
能不能贴一下具体代码
start是一个标号,在编译阶段,被编译器翻译为地址(也就是16位的内存地址),一般程 ...

我的代码是
assume cs:code
code segment
start:mov ax,2
         mov bx,ax
         add bx,bx
code ends
end start

无念道长 发表于 2014-2-12 16:56:56

本帖最后由 无念道长 于 2014-2-12 16:58 编辑

君未知 发表于 2014-2-12 16:52 static/image/common/back.gif
我的代码是
assume cs:code
code segment

好吧,接上面我的回答,assume是伪指令,在编译的时候不形成机器码,所以程序从code segment开始执行,下一句就直接是start标号开始的语句,所以效果上,跟没有start一样,没区别,如果代码改成这样:assume cs:code,ds:data
data segment
      dw 0,0,0,0,0,0,0,0
data ends
code segment
         mov ax,2
         mov bx,ax
         add bx,bx
code ends
end
你可以用debug试试,用-u查看一下代码,看看代码和以前还一样么。

君未知 发表于 2014-2-12 17:05:14

无念道长 发表于 2014-2-12 16:56 static/image/common/back.gif
好吧,接上面我的回答,assume是伪指令,在编译的时候不形成机器码,所以程序从code segment开始执行,下 ...

哦,明白了,谢谢你

HB无影 发表于 2014-2-13 11:56:30

是啊!在代码段前定义一个数据段或者堆栈段就一清二楚了!!!
无念道长解释的很详细!!!
页: [1]
查看完整版本: 请问第四章的入口地址start有什么用