关于伪指令assume

mic47 2010-12-19 04:01:34
一个汇编程序:
code segment
mov ax,1
add ax,ax

mov ax,4c00h
int 21h
code ends
end

不加前面的assume cs:code也行

但如果这样写:
code segment
start: mov ax,1
add ax,ax

mov ax,4c00h
int 21h
code ends
end start
就不行,请问高人是为什么呢?
...全文
322 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mic47 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shzhfu 的回复:]
引用 9 楼 mic47 的回复:
也就是说,assume cs:code是给code段中的标号找了个段寄存器,就这点作用吗?


是的,只要定义了变量、标号和过程等,就一定要把所在的段进行ASSUME设定,让编译器知道这个“标示符”的所有属性(包括段属性)。否则编译器无法建立“标识符”与“实际地址”之间的对应表。
[/Quote]
那assume ds:data,ss:stack是不是没用啊?
假如我有一个数据和一个栈段
shzhfu 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mic47 的回复:]
也就是说,assume cs:code是给code段中的标号找了个段寄存器,就这点作用吗?
[/Quote]

是的,只要定义了变量、标号和过程等,就一定要把所在的段进行ASSUME设定,让编译器知道这个“标示符”的所有属性(包括段属性)。否则编译器无法建立“标识符”与“实际地址”之间的对应表。
mic47 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shzhfu 的回复:]
引用 7 楼 mic47 的回复:
那这样一段程序,没有设置程序入口,怎么也编译不对啊?
code segment
mov ax,0

s: mov ax,4c00h
int 21h

code ends
end

尽管没有入口地址,但出现了标号s,编译工具是要知道s和哪个段寄存器关联的。
[/Quote]
也就是说,assume cs:code是给code段中的标号找了个段寄存器,就这点作用吗?
shzhfu 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mic47 的回复:]
那这样一段程序,没有设置程序入口,怎么也编译不对啊?
code segment
mov ax,0

s: mov ax,4c00h
int 21h

code ends
end
[/Quote]
尽管没有入口地址,但出现了标号s,编译工具是要知道s和哪个段寄存器关联的。
mic47 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zybzyb1987 的回复:]
第一个程序没有通知程序的运行入口地址,也就是没有start,所以载人程序后,CPU就不用对CS、IP进行设置。
第二个程序既然已经告知程序的运行入口,那么CPU就有义务对CS、IP进行相关设置。那么它设置的依据是什么呢?就是伪指令assume cs:code。你既然让它设置程序入口,又不告诉人家怎么做?不出错才怪!
需要特别注意的是:assume指令中,只有代码段寄存器CS由cpu自动设置,其……
[/Quote]
那这样一段程序,没有设置程序入口,怎么也编译不对啊?
code segment
mov ax,0

s: mov ax,4c00h
int 21h

code ends
end
lxy15329 2010-12-19
  • 打赏
  • 举报
回复
如果对反汇编有些了解,你会知道,其实程序执行时是根据那个程序最后end ?来决定起点在哪里的
znxllyuan 2010-12-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shzhfu 的回复:]
引用 1 楼 zybzyb1987 的回复:
第一个程序没有通知程序的运行入口地址,也就是没有start,所以载人程序后,CPU就不用对CS、IP进行设置。
第二个程序既然已经告知程序的运行入口,那么CPU就有义务对CS、IP进行相关设置。那么它设置的依据是什么呢?就是伪指令assume cs:code。你既然让它设置程序入口,又不告诉人家怎么做?不出错才怪!
需要特别注意的是:assume……
[/Quote]

支持牧人大叔~
shzhfu 2010-12-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zybzyb1987 的回复:]
第一个程序没有通知程序的运行入口地址,也就是没有start,所以载人程序后,CPU就不用对CS、IP进行设置。
第二个程序既然已经告知程序的运行入口,那么CPU就有义务对CS、IP进行相关设置。那么它设置的依据是什么呢?就是伪指令assume cs:code。你既然让它设置程序入口,又不告诉人家怎么做?不出错才怪!
需要特别注意的是:assume指令中,只有代码段寄存器CS由cpu自动设置,其……
[/Quote]

补充:

变量、标号和过程等,在编译时都要换成其地址,包括偏移地址和段地址,但在引用时,有些情况下段地址可以省略,如ds:[偏移地址]中的ds等。那么编译工具要不要把段地址省略,它就看assume把这个段关联给哪个段寄存器了。

所以第一个出现没有变量和标号等,不涉及判断段地址的问题;而第二个程序出现了标号,就要看这个标号关联到哪个段寄存器。
znxllyuan 2010-12-19
  • 打赏
  • 举报
回复
同意1L
masmaster 2010-12-19
  • 打赏
  • 举报
回复
同意LS观点。
zybzyb1987 2010-12-19
  • 打赏
  • 举报
回复
第一个程序没有通知程序的运行入口地址,也就是没有start,所以载人程序后,CPU就不用对CS、IP进行设置。
第二个程序既然已经告知程序的运行入口,那么CPU就有义务对CS、IP进行相关设置。那么它设置的依据是什么呢?就是伪指令assume cs:code。你既然让它设置程序入口,又不告诉人家怎么做?不出错才怪!
需要特别注意的是:assume指令中,只有代码段寄存器CS由cpu自动设置,其他如DS,SS只是一个默认使用的约定,而其实际值为多少,CPU是不管的,所以一定要根据程序需要手动的将其设置为相关段的地址。

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧