C 字符数组似乎覆盖了其他数据

C 字符数组似乎覆盖了其他数据,c,x86-16,inline-assembly,bootloader,C,X86 16,Inline Assembly,Bootloader,我这里有另一段代码,它利用了我前面编写的printchar函数: void prints(char input[],int length){ for (int i=1;i<=length;i++){ printchar(input[i]); } } 并使用printchar()打印单个字母: 正如所料,它再次打印了引导扇区。如果我用常规字符替换数组,它将打印字符的值。 另外,我非常确定printchar()函数工作正常,因为如果我给它一个要打印的字母,它就会像预期的那

我这里有另一段代码,它利用了我前面编写的printchar函数:

void prints(char input[],int length){
 for (int i=1;i<=length;i++){
       printchar(input[i]);
  }
}
并使用printchar()打印单个字母:

正如所料,它再次打印了引导扇区。如果我用常规字符替换数组,它将打印字符的值。 另外,我非常确定printchar()函数工作正常,因为如果我给它一个要打印的字母,它就会像预期的那样打印字母

这是我的printchar函数:

void printc(char in){
    asm volatile("mov ah,0x0e\n"
         "mov al,%0\n"
         "int 0x10\n"
         "mov al,0\n"
    ::"r"(in)
    :"eax","ax"
    ); 
} 

这是一个C问题,不是汇编问题。数组从0开始,而不是1,并且使用分号,而不是逗号,所以
for(int i=1,i正如您所说的,您正在使用引导环境,您确定堆栈设置正确吗(在跳到32位之后)

为确保正确设置,请检查所有段寄存器

此外,如果您处于32位模式,则不能(不应该)使用bios int打印。
你怎么知道它准确地打印了引导扇区呢(int i=1,iI怀疑逗号是复制错误,否则它甚至无法编译。我怀疑您在调用
prints
时没有给出正确的长度,因此打印超出了字符串的末尾。请提供一个示例来说明问题。问题很可能与您调用函数的方式有关。很抱歉,我始终编写,而不是;
for(int i=0,i@MikeCAT哎哟,错过了。现在修好了。这并不能解释它为什么要打印引导扇区。它应该跳过第一个字符。我的操作系统基于实模式,所以我可以使用bios中断。只需检查数据是否正常并且可以从阵列内访问。进行一些if检查以确保所有字符都符合要求ed position first…顺便说一句,链接器实际上会抱怨:如果我不给出任何选项,重新定位将被截断以适应:R_386_16与“.rodata”对抗。
void printc(char in){
    asm volatile("mov ah,0x0e\n"
         "mov al,%0\n"
         "int 0x10\n"
         "mov al,0\n"
    ::"r"(in)
    :"eax","ax"
    ); 
}