首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

为什么assume了DS以后,在代码里面还要再次mov ax,data;mov ds,ax呢?该如何解决

2012-03-09 
为什么assume了DS以后,在代码里面还要再次mov ax,datamov ds,ax呢?感觉assume了以后,就不再需要去mov这个

为什么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只是给编译器一个信息,告诉编译器相关段寄存器和段的联系。但是,计算机并不执行它,要想真正将段地址存放到相关段寄存器中,需要用汇编指令来完成。

热点排行