gpt4 book ai didi

c - 使用 Open Watcom 内联汇编从结构指针访问结构成员

转载 作者:行者123 更新时间:2023-11-30 15:04:18 27 4
gpt4 key购买 nike

我有一些代码可以写入和读取 VGA 的 I/O 端口。我正在尝试在内联汇编器中实现工作 C 代码功能。我正在使用 Open Watcom 2.0 并针对 DOS 16 位进行编译。

为了写入 VGA 上的调色板,我想出了这个。这无法正常工作。

编辑:setPaletteColor 的代码并不完全准确。我已更新以反射(reflect)实际代码。

void setPaletteColor (unsigned char index, rgbColor *p_color)
{
_asm
{
; tell VGA card we are going to update a palette register
mov dx,PALETTE_MASK
mov al,0xff
out dx,al

; tell VGA which register we will be updating
mov dx,PALETTE_REGISTER_WR
mov al,index
out dx,al

; update the color in the register at index
mov dx,PALETTE_DATA
mov al,*p_color
out dx,al
mov al,*p_color // this is actually *(p_color+1) but this actually gets the next structure not the next data member, so I left it out of the code I typed for my question.
out dx,al
mov al,*p_color // same here, actually is *(p_color+2)
out dx,al
}
}

为了阅读,我有这个。这也无法正常工作。

void getPaletteColor (unsigned char index, rgbColor *p_color)
{
unsigned char *p_red = &p_color->red;
unsigned char *p_green = &p_color->green;
unsigned char *p_blue = &p_color->blue;
_asm
{
; tell VGA card we are going to read a palette register
mov dx,PALETTE_MASK
mov al,0xff
out dx,al

; tell VGA which register we will be reading
mov dx,PALETTE_REGISTER_RD
mov al,index
out dx,al

; read the data into the color struct at 'p_color'
mov dx,PALETTE_DATA
in al,dx
mov *p_red,al
in al,dx
mov *p_green,al
in al,dx
mov *p_blue,al
}
}

现在这是可以运行的纯 C 版本。

void setPaletteColor (unsigned char index, rgbColor *p_color)
{
outp(PALETTE_MASK,0xff);
outp(PALETTE_REGISTER_WR, index);
outp(PALETTE_DATA,p_color->red);
outp(PALETTE_DATA,p_color->green);
outp(PALETTE_DATA,p_color->blue);
}

供阅读。

void getPaletteColor (unsigned char index, rgbColor *p_color)
{
outp(PALETTE_MASK,0xff);
outp(PALETTE_REGISTER_RD, index);
p_color->red = inp(PALETTE_DATA);
p_color->green = inp(PALETTE_DATA);
p_color->blue = inp(PALETTE_DATA);
}

注意:我不能使用“.”在内联汇编中使用运算符或“->”运算符,因为编译器不支持它。

这是 rgbColor 结构的定义。

typedef struct rgbColorTag
{
unsigned char red;
unsigned char green;
unsigned char blue;
} rgbColor;

最佳答案

一个好的问题应该描述它是如何不起作用的。只是说它“不起作用”让我认为这是一个语法错误,因为我不知道 Watcom 风格的内联汇编。我只是假设它与 MSVC 风格类似,并且在 asm 中使用 C 解引用运算符是一个语法错误(例如在 mov al,*p_color 中)。

显然这是 Open Watcom 的有效语法,但是您将加载相同的字节 3 次。也许尝试 mov al, *(p_color+1) 作为第二个字节?尽管这可能只是进行 C 指针数学运算,并获取下一个结构的开始。检查您的编译器手册以获取可用的语法选项。

<小时/>

您也可以将指针加载到寄存器中并自己使用其偏移量(使用诸如 mov al, [si+1] 之类的寻址模式)。这取决于 3 个结构成员按顺序排列且没有填充,但我认为这应该是一个安全的假设。您始终可以检查编译器的 asm 输出以查看它如何布置结构。

由于您的结构按正确的顺序排列,您应该能够使用 OUTS 循环其中的 3 个字节。 。甚至是 REP OUTS,这样您就不需要编写循环。

    cld
mov si, p_color ; get the function arg in a register
mov dx, PALETTE_DATA
mov cx, 3
rep outsb ; OUT 3 times, to port DX, using data from DS:[SI] (and do SI++ post-increment)

同样,对于阅读来说,

    cld
mov di, p_color
mov dx, PALETTE_DATA
mov cx, 3
rep insb ; IN 3 times, to port DX, using data from DS:[DI] (and do DI++)

关于c - 使用 Open Watcom 内联汇编从结构指针访问结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40336338/

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