在C中的_asm块中使用局部变量

时间:2011-10-04 21:43:15

标签: c++ c assembly

我正在编写基于部分汇编和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 
}

有没有办法将变量用于汇编代码。代码示例将不胜感激。

3 个答案:

答案 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]