- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在实模式下编写 C 程序。程序将加载到0x2000:0x0000
地址并运行。 DS
寄存器等于CS
,即0x2000
。我也在用 bochs 调试。
我的目标是在屏幕上打印一些文本。所以我需要内联汇编(对于 BIOS INT 10h
)。
这是我的测试文件:
asm("jmp _main");
void putchar(c) char c;
{
asm("mov ah, 0x0e");
asm("mov al, c");
asm("xor bx, bx");
asm("int 0x10");
}
void main ()
{
asm("push cs");
asm("pop ds");
putchar('A');
for(;;);
}
当我用这个命令编译它时...
bcc -W -0 -c test.c -o test.obj
...它正在工作。但是当我试图将它链接到...
ld86 -d isimsiz.obj -o kernel.bin
...它给了我这个错误:
undefined symbol: c
为什么会这样?如何在 BCC 内联汇编下使用 C 变量?
如果您知道有关 BCC 的好的教程,请留下链接。我在网上找不到它:(
提前致谢。
PS:以下是相应 compiler BCC 的手册页和 linker LD86 .
最佳答案
bcc 不支持引用 C 变量。您需要在汇编中编写整个函数:
void putchar(c)
{
#asm
mov ah, 0x0e
mov bx, sp
mov al, [bx+2]
xor bx, bx
int 0x10
#endasm
}
您可能还想检查是否定义了 __FIRST_ARG_IN_AX__
:
void putchar(c)
{
#asm
mov ah, 0x0e
#if !__FIST_ARG_IN_AX__
mov bx, sp
mov al, [bx+2]
#endif
xor bx, bx
int 0x10
#endasm
}
请注意,在 K&R 风格的函数中,函数参数的类型不能小于 int
,因此虽然 void putchar(c) char c;
在语法上是正确的,你不能那样做。顺便说一句,这就是为什么 libc 函数 putchar
采用 int
类型的参数。
如果确实需要使用变量,可以考虑使用全局变量:
unsigned equipment;
int has_floppy() {
#asm
int 0x11 ! get BIOS equipment list
mov _equipment,ax
#endasm
return (_equipment & 1);
}
}
你可以看看dev86 libc有关 bcc 中内联汇编的示例。
关于c - BCC 中的内联汇编(Bruce 的 C 编译器)- 如何使用 C 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39545132/
我正在阅读“Thinking in java”中的泛型章节。该程序在下面。 public class GenericWriting { static void writeExact(List
我一直在阅读 Thinking in python布鲁斯埃克尔。目前,我正在阅读模式概念一章。在本章中,Eckel 展示了单例在 python 中的不同实现。但是我对Alex Martelli的单例代
以下是 Bruce Eckel 的 Thinking in C++ 的一段话(第 1 卷,第 2 版,第 11 章)在“成员指针”标题下: …a pointer needs an address, b
这里引用 Bruce Eckel 的书“Thinking in Java”: The method argument list specifies what information you pass
有谁知道如何在 java 文件中构建 Bruce eckels 的 Thinking 以在 Eclipse 上运行。并且能够把它解释清楚。我已经尝试了好几天了,使用 stackoverflow 但没有
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我有这个小c代码 int main (){ int in [50]; int res [50]; int avg=0; int i=0; int j=
我正在实模式下编写 C 程序。程序将加载到0x2000:0x0000地址并运行。 DS 寄存器等于CS,即0x2000。我也在用 bochs 调试。 我的目标是在屏幕上打印一些文本。所以我需要内联汇编
我是一名优秀的程序员,十分优秀!