为什么assume了DS以后,在代码里面还要再次mov ax,data;mov ds,ax呢?该如何解决
为什么assume了DS以后,在代码里面还要再次mov ax,datamov ds,ax呢?感觉assume了以后,就不再需要去mov这个
为什么assume了DS以后,在代码里面还要再次mov ax,data;mov ds,ax呢?
感觉assume了以后,就不再需要去mov这个DS寄存器的值了吧。
为什么代码里面我还是常常看到:
Assembly codeSTACK 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只是给编译器一个信息,告诉编译器相关段寄存器和段的联系。但是,计算机并不执行它,要想真正将段地址存放到相关段寄存器中,需要用汇编指令来完成。