我正在基于部分汇编和 C 代码使用 16 位 Turbo C++ 3.0 版编写一个程序。我必须在汇编 block 中使用 C 代码的局部变量。我在 Borland C++ 5 和 MS VC++ 6 中调试了以下代码。它工作正常,但这些编译器是 32 位,因此我必须在 Turbo C 中执行此操作。在 Turbo C++ 中,它显示错误:“操作码和操作数的组合无效”代码是:
void AssignPixel (int X,int Y,int R,int G, int B )
{
_asm {
mov dx, 0x3c8
mov al, 4
out dx, al
inc dx
mov al, R // ERROR
out dx, al
mov al, G // ERROR
out dx, al
mov al, B // ERROR
out dx, al
mov ah , 0x0c
mov al , 4
mov cx , X // ERROR
mov dx , Y // ERROR
int 0x10
}
有没有办法通过汇编代码使用变量。代码示例将不胜感激。
最佳答案
在 Turbo C 汇编中,变量名代表它们的地址。所以如果你这样做
mov ax, R
您正在将R的地址(即&R
)加载到ax中。但如果你尝试:
mov al, R
你会得到一个错误,因为地址是 16 位宽,而 al
寄存器只有 8 位。
如果你写:
mov al, [R]
这相当于:
mov al, byte ptr [R]
然后您将R
指向的字节加载到al
寄存器中。
(byte ptr
是根据已知操作数的大小自动推导出来的,在本例中为 al
)。
但请注意,汇编器对变量的类型一无所知,因此您独自一人。例如,在您的代码中,R
是一个整数(16 位),但最后一行仅加载一个字节。由于您使用的是小端机器,因此您将获得最低有效字节,这相当于强制转换为 char,这可能是您想要的。
当然,如果你需要R的整个值,只需写:
mov ax, [R]
这相当于:
mov ax, word ptr [R]
关于c++ - 在 C 中的 _asm block 中使用局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7654403/