读书人

为什么assume了DS以后在代码里面还要

发布时间: 2012-03-09 16:54:57 作者: rapoo

为什么assume了DS以后,在代码里面还要再次mov ax,data;mov ds,ax呢?
感觉assume了以后,就不再需要去mov这个DS寄存器的值了吧。
为什么代码里面我还是常常看到:

Assembly code
STACK SEGMENT STACK   DB 64 DUP(?)STACK ENDSDATA SEGMENT   DB 06H,12H,88H,82H,90H,22H,33HDATA ENDSCODE SEGMENT   ASSUME CS:CODE,SS:STACK,DS:DATASTART:MOV AX,DATA      MOV DS,AX      MOV DI,0000H      MOV CL,[DI]      XOR CH,CH      MOV BL,CH      INC DI  A1: MOV AL,[DI]      TEST AL,80H      JE A2      INC BL  A2: INC DI      LOOP A1      MOV [DI],BL      MOV AX,4C00H      INT 21H CODE ENDS      END START



[解决办法]
这里的 assume 语句是告诉编译器各个段是由哪个段寄存器指向的,这样编译器就可以根据所设定的条件在需要时加上段前缀指令;它并不生成对段寄存器进行设置的指令,这个是需要程序自己来做的。所以,就有了 assume 语句之后,代码里自己设置相应的段寄存器。
[解决办法]
嗯 楼上说的对。汇编语言有三类指令:(1)汇编指令,如mov ax,0等,有对应的机器码;(2)伪指令,如assume,db等,由编译器执行,计算机并不执行,没有对应机器码;(3)其他符号,如+、-等,由编译器识别,没有对应机器码。所以,assume只是给编译器一个信息,告诉编译器相关段寄存器和段的联系。但是,计算机并不执行它,要想真正将段地址存放到相关段寄存器中,需要用汇编指令来完成。

读书人网 >汇编语言

热点推荐