变量代入内嵌汇编怎么就不对了呢……
有一段内嵌汇编:
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;
这是为什么?
[解决办法]
错字 而编译时汇编中的变量会被一个地址取代
所以这个地址不能是局部变量
[解决办法]
因为如果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;