c++ - 在 C 中的 _asm block 中使用局部变量

标签 c++ c assembly

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

相关文章:

c - Aarch64 程序集中的系统调用调用

c++ - 如何返回复杂的返回值?

gcc - Libffi 可以为 Cortex-M3 构建吗?

c++ - C/C++ 中奇怪的数组到指针的转换

c++ - 容器中的 begin() 和 end() 方法应该始终具有相同的返回类型吗?

c - 使用二维寻址一维指针数组

c - 系统调用是如何工作的

c - float 相等性检查

c++ - 使用 std::wstring 初始化结构

C++ 右值 move 语义,关于流的问题