有一段内嵌汇编:asm
    push ax
    push dx
    push bx    mov dx, Addr+$b
    mov al, 30h
    out dx, al
    mov al, 70h
    out dx, al
    mov al, 0b0h
    out dx, al
    mov dx, Addr+$f
    mov al, 30h
    ……
    ……
    ……
end;
其中的Addr是基地址,需要变换的。我在把这个Addr设置为Const的时候,
Const
  Addr = $210;
是可以正常执行的。但是,如果把它设置为变量,就不行了
var
  Addr: Word;
然后在程序中设置
  Addr:= $210;这是为什么? 

解决方案 »

  1.   

    刚分步了下,用常量const的话,
    执行完mov dx, Addr+$b后,dx显示,值为539
    而用变量的话,显示为51200另外,若基地址发生变化,比如由$210变为$280,用常量后,dx是随之变化的,
    而用变量,dx都是51200...这种情况怎么办?
      

  2.   

    因为如果addr 为 const 时, 是以立即数的形式编译的.  mov dx, Addr + $b 这一句被编译为:  mov dx, $21b ==================================================而 addr 为 var 时, 是以指针的形式编译的:
    ......................
    mov word [ebp - $02], $0210  //ebp - $02 为变量 addr 的指针.
    mov dx, [ebx + $9] ;  // ebx + $9 = ebp - $02 + $B  ,   这里就乱了.
    ............这样写就可以了:asm
      push ax
      push dx
      push bx
      
      mov dx, addr
      add dx, $b
      //mov dx, Addr+$b
      ……
      ……
      ……
    end;