我正在编写基于部分汇编和C代码的16位Turbo C ++ 3.0版程序。我必须在程序集块中使用C代码的局部变量。我在Borland C ++ 5和MS VC ++ 6中调试了以下代码。它工作正常但是这些编译器是32位因此我必须在Turbo C中执行此操作。在Turbo C ++中它显示错误:“操作码和oprends的无效组合”代码是:
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
}
有没有办法将变量用于汇编代码。代码示例将不胜感激。
答案 0 :(得分:4)
在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]
答案 1 :(得分:0)
在程序集中使用局部变量所需要做的就是将代码留在寄存器中。如果你的寄存器用完了,你必须将它移到内存中,然后再次使用它时重新加载它。
变量名实质上是变量所在的宏,在实现中(出于汇编目的),它是寄存器或内存中的插槽。 HTH
答案 2 :(得分:0)
你最不可能做到这些,因为寄存器和变量的大小不匹配(8位对16位):
mov al, R
mov al, G
mov al, B
这里的汇编程序可能需要不同的语法:
mov cx, X
mov dx, Y
请尝试这些:
mov al, byte ptr [R] ; I don't remember if the brackets are required here
mov cx, [X]