gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:17:58 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com