- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些代码可以写入和读取 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/
搜索有关 Open Watcom 链接器、内联汇编和 C 编译器的手册和文档,因为我发现官方手册不够好。 我特别关注 C 和汇编。 感谢您提供指向教程、书籍等的链接。 最佳答案 回到过去,Watcom
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我有一些代码可以写入和读取 VGA 的 I/O 端口。我正在尝试在内联汇编器中实现工作 C 代码功能。我正在使用 Open Watcom 2.0 并针对 DOS 16 位进行编译。 为了写入 VGA
如何让 Watcom 编译器(在 64 位主机上运行的分支版本 2.0 beta)在 ASM 文件中输出 8086 汇编源代码?从命令提示符运行 wcc -0 main.c 只生成 OBJ 文件。 附
一个普遍的问题。 我正在为 Sybase SQL Anywhere 10 开发。出于向后兼容性的原因,我们几乎所有的存储过程都是用 Transact-SQL 编写的。 使用 T-SQL 代替 Watc
我得到了一个遗留的fortan IV程序,该程序需要为一个遗留的编程语言类进行编译,并且被指示使用http://www.openwatcom.org/index.php/Downloads中的Watc
我在NASM中编写了一个引导加载程序,它将64kb的程序数据从磁盘加载到内存中,从地址0060:0000 [SEG:OFF]开始。我通过在程序集(NASM)中编写一些代码并将其放入磁盘来测试了我的项目
我使用的是Open Watcom IDE V1.9,目标环境是DOS-16bit,镜像类型是exe。 objective-c pu 是 80386。 这是我的源代码: #include void g
是否可以使用 Open Watcom C 编译器(而非 C++)执行 #define NORETURN(x) 宏? 基于 the fine manual我有这个文件test.c: #include
我在我的操作系统 Win XP 上安装了编译器“Open watcom”,我在 Virtual Box 下运行该操作系统。 我以自动模式安装了程序:完整包,并自动更改自动执行和配置文件,其中环境变量所
今天,我了解到 MASM 中的 SEG 运算符默认返回 GROUP 的地址而不是相关表达式的 SEGMENT 的地址,并且有一些选项和方法可以覆盖它。 由于我目前在 Open Watcom 1.9/1
我正在尝试生成 16 位 DOS 可执行文件,但使用的是 gcc 编译器。所以我使用的是古老的 gcc-4.3 ia16 端口。我制作了我的构建的 Docker 镜像:https://registry
我有一个具有以下声明样式的 header : extern struct xvimage *allocimage(char * name, int32_t rs, int32_t cs, int32_
我需要生成一个远跳转指令来跳转到另一个ISR(中断服务例程)。我正在开发一个 32 位 FreeDOS 应用程序。 阅读 OW 手册( cguide.pdf 和 clr.pdf )后,我找到了两种成功
对于此 C 源代码: int add(int a, int b) { return a + b; } ,用于 8086 的 Watcom C 编译器 (wcc -s -ms -os -0 prog.c
我想通过 Watcom C 编译器 生成一个 16 位可执行 BINARY RAW 格式。类似于在实模式下运行的没有任何 header 的 EXE 文件。 我使用Large内存模型,因此代码段和数据段
使用 Windows 7、Matlab R2011a(32 位)和 Open Watcom 1.8 版,我正在尝试编译调用 Fortran 代码的 C MEX 文件。 按照 Matlab 网站 (su
我是一名优秀的程序员,十分优秀!