百韵网 >>  正文

汇编语言关于assume的用法 汇编中assume的作用?

来源:www.baiyundou.net   日期:较早时间

assume伪指令用于向汇编程序说明所定义的逻辑段属于何种类型的逻辑段。说明的方法是将逻辑段的段名和对应的段寄存器关联起来。但除了CS寄存器外,其他逻辑段的地址需要程序员自己装入寄存器中。(来自清华版教材)

具体为什么,我理解如下:

dseg segment
    data db '1'
dseg ends
cseg segment
    assume  cs:cseg,ds:dseg,es:dseg
start:
    mov ax,dseg
    mov ds,ax
    
    mov dl,data;注意这里
    mov ah,02h
    int 21h
    
    mov ah,4ch
    int 21h
cseg ends
    end start

在这样的一个程序中,当执行"mov dl,data"时,cpu知道data变量是定义在dseg段,但是怎么找到data的地址的呢?这时候assume就派上了用场,它将ds和dseg相关联。变量在dseg段,就从ds寄存器里寻址。寻址的地址在哪呢?"mov ax,dseg mov ds,ax",就起到了这样的作用,它将逻辑段的地址装入寄存器中。

为什么cs寄存器就不需要呢?人家就是这样规定的,至少在8086汇编上是这样。



assume对除了CS以外的其它段寄存器,仅仅只是关联了段名,以便在访问段内变量时程序可以知道用哪个段寄存器,并没有在程序加载时将段地址装入段寄存器。

所以,将段地址装入段寄存器的工作,必须由用户在程序中自己编写代码,并在程序开始运行时执行代码完成装入工作。

仅仅对CS段寄存器,会在关联段名的同时,在程序加载时自动将段地址装入段寄存器。

编写程序,是写给编译软件的。

由编译软件,编译成机器码,再去控制CPU。

但是,编译软件,对assume语句,并不生成机器码。

所以,必须有mov ax,data,mov ds,ax,CPU才能受控。
----
assume语句,是伪指令,仅仅是写给编译软件的。

编译软件,并不把它生成机器码。

ASSUME 是汇编语言(MASM)的伪指令,其作用只能告诉编译器(汇编器)你在这个程序中声明的所有段,无法做到将段地址写入段寄存器。

  assume:段寄存器的说明语句;
  在汇编语言源程序中可以定义多个段,每个段都要与一个段寄存器建立一种对应关系。建立这种对应关系的说明语句格式如下:
  ASSUME 段寄存器名:段名[,段寄存器名:段名, ……]
  其中:段寄存器是CS、DS、ES、SS、FS和GS,段名是在段定义语句说明时的段名。
  在一条ASSUME语句中可建立多组段寄存器与段之间的关系,每种对应关系要用逗号分隔。例如,
  ASSUME CS:CODE1, DS:DATA1
  上面的语句说明了:CS对应于代码段CODE1,DS对应于数据段DATA1。
  注意:代码段寄存器不能由程序员在源程序中对其赋值,其值是由操作系统在装入它进入系统运行时自动赋值的。

汇编中assume的作用?~

编写汇编语言的程序,要用编译软件来编译。

assume,就是通知编译软件的,说明段寄存器和定义段的关系。

编译软件,比较弱智,你随便瞎写一个对应关系,它都辨别不出来真假。

程序正确与否,全靠 MOV...这种针对 CPU 的指令,和 ASSUME 基本无关。

就不用琢磨它了。

要用assume把段跟段寄存器对应起来的原因是原来的DOS找到的空闲内存的地址不是固定的,无法找到一个地址在任何时候都是空闲的。于是DOS需要可以重定位的程序,而当时的定位方式就是设置段寄存器的值使该程序能在可分配(空闲)的内存中可用。那就需要知道某个段被重定位时候需要修改哪个段寄存器的值才能正确执行。assume提供这种段和重定位代码时需要对应修改的寄存器的关系给编译器,编译器再这个信息写到二进制文件中去。比如DOS下的exe程序记录在文件头中。

相关要点总结:

13475202468:assume用法及例句
韶雷答:例句:we assume his guilt(我们假定他是有罪的)。 扩展资料 assume的例句:It is a misconception to assume that the two continents are similar(关于这两块大陆相似的假设是一种误解);He contented himself by assuming an air of superiority(他表现出一副高高在上的样子以获得自我满足...

13475202468:汇编语言
韶雷答:SEGMENT是段定义伪操作,段定义伪操作的格式如下:segment_name SEGMENT ...segment_name ENDS CODES SEGMENT 即定义一个名为codes的段。ASSUME是明确段和段寄存储器的关系的伪操作其格式为:ASSUME register_name:assignment 其中段寄存器名必须是CS、DS、ES和SS中的一个。ASSUME CS:CODES 就是...

13475202468:汇编语言assume cs:code,ds:datarea 中的:是什么意思
韶雷答:在汇编时其实内部只有偏移地址寻址,而没有变量名寻址。所以汇编时汇编软件会把你写的变量换成偏移地址。而变量是在你假定的段里查找得到偏移地址。一般指令程序放在代码段中,段地址来源于代码段寄存器CS,涉及到一个堆栈操作时,段寄存器为SS,涉及到一个操作数时,段寄存器为DS或者ES。assume cs:code...

13475202468:关于WIN32汇编伪指令assume的问题
韶雷答:assume伪指令把寄存器预先定义为结构指针 assume esi:ptr EXCEPTION_RECORD 此时esi就成为了一个指针 这样就可以使用[esi].regEip ……assume esi:nothing 不再使用esi寄存器做指针的时候要用assume esi:nothing取消定义。

13475202468:assume名词
韶雷答:一、assume的基本释义及用法介绍 assume作为动词,意为假定;假设;认为;承担(责任);就(职);取得(权力);呈现(外观、样子);显露(特征)。例句:It is reasonable to assume (that) the economy will continue to improve.认为经济将继续好转是有道理的。The court assumed responsibility for the girl's...

13475202468:请教8086汇编语言中ASSUME伪指令的作用!
韶雷答:先回答你的第一个问题,书上是你那样说的,至于你的第一个疑问是因为ASSUME伪指令只是让数据段寄存器DS与你的数据存储地址,代码段寄存器CS和你的代码段所存储的地址一一对应起来,但是如果你不人为把你的数据段存储地址DSEG传给DS的话,系统是无法获得DSEG的具体物理地址的。对于第二疑问,因为CS:IP是...

13475202468:汇编语言中assume cs:code,ds:data 是什么意思?
韶雷答:这是段分配语句,是条伪指令,一般放在代码段的第一条位置,段分配语句仅仅是建立段寄存器和段名之间关系,不具有赋值功能。比如创建了几个段,如何知道它是代码段,它是数据段,通过这条语句就可以知道,因为段名是可以任意取的,可以把code取成代码段,也可以是其他名字,通过这条语句就可以把他们的...

13475202468:assume的用法是什么?
韶雷答:suppose的用法如下:1、suppose用作连词引导条件状语从句时,它必须置于主句之前,但supposing用作连词引导 条件状语从句时,则可置于主句之前,也可以置于主句之后。如:We'd love to come and see you on Saturday, supposing I don't have to work that day.我想星期六来看你,假若那天我不上班的话...

13475202468:assume和suppose区别
韶雷答:相同点:都可以表示假定、假设。不同点:assume指有很少或完全无根据的武断推测或不合逻辑的推理,往往意味着把一件尚未证实或尚存在意见分歧的事作为自己论断的基础。suppose指缺乏确切事实,根据一些现象进行的推测,也可指为论证而提出合乎逻辑推理的某种假定,有时仅表示自己的意见。二:用法区分 suppose...

13475202468:assume和presume的区别到底是什么
韶雷答:其用法区别是:一、assume:指把一件尚未证实的事作为事实或真相,含有较强的武断成分。如:I assume you always get up at the same time.我想你总是在同一个时间起床。Assume this to be true.假定这是真的。二、presume :指根据过去的经验或某些现实的感觉把某事认为事实,虽然还没有确定的...

(编辑:本站网友)
相关推荐
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图
@ 百韵网