+ -
当前位置:首页 → 问答吧 → 关于伪指令assume

关于伪指令assume

时间:2010-12-19

来源:互联网

一个汇编程序:
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
就不行,请问高人是为什么呢?

作者: mic47   发布时间: 2010-12-19

第一个程序没有通知程序的运行入口地址,也就是没有start,所以载人程序后,CPU就不用对CS、IP进行设置。
第二个程序既然已经告知程序的运行入口,那么CPU就有义务对CS、IP进行相关设置。那么它设置的依据是什么呢?就是伪指令assume cs:code。你既然让它设置程序入口,又不告诉人家怎么做?不出错才怪!
需要特别注意的是:assume指令中,只有代码段寄存器CS由cpu自动设置,其他如DS,SS只是一个默认使用的约定,而其实际值为多少,CPU是不管的,所以一定要根据程序需要手动的将其设置为相关段的地址。

作者: zybzyb1987   发布时间: 2010-12-19

同意LS观点。

作者: masmaster   发布时间: 2010-12-19

同意1L

作者: znxllyuan   发布时间: 2010-12-19

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


补充:

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

所以第一个出现没有变量和标号等,不涉及判断段地址的问题;而第二个程序出现了标号,就要看这个标号关联到哪个段寄存器。

作者: shzhfu   发布时间: 2010-12-19

引用 4 楼 shzhfu 的回复:
引用 1 楼 zybzyb1987 的回复:
第一个程序没有通知程序的运行入口地址,也就是没有start,所以载人程序后,CPU就不用对CS、IP进行设置。
第二个程序既然已经告知程序的运行入口,那么CPU就有义务对CS、IP进行相关设置。那么它设置的依据是什么呢?就是伪指令assume cs:code。你既然让它设置程序入口,又不告诉人家怎么做?不出错才怪!
需要特别注意的是:assume……


 支持牧人大叔~

作者: znxllyuan   发布时间: 2010-12-19

如果对反汇编有些了解,你会知道,其实程序执行时是根据那个程序最后end ?来决定起点在哪里的

作者: lxy15329   发布时间: 2010-12-19

热门下载

更多