我正在为8086处理器编写小内核(在BC3.1中,在Windows XP上作为主机操作系统工作)。内核是多线程的,所以当我使用printf或cout进行调试时(在代码中的某处,printf将InterruptEnable标志设置为1,并且我的计时器中断例程调用了调度并且代码崩溃),我遇到了问题。Borland C++ inline asm问题,用WORD PTR和字符串
正因为如此,我在联汇编写的简单puts功能:
void _printf(char *c)
{
//setup data
asm{
mov ch, 10
mov cl, 0
mov ah, 0x2
mov bx, WORD PTR c
}
loop: asm{
//\0?
cmp [bx], cl
je exit_prc
mov dl, [bx]
int 0x21
inc bx
//is there \n?
cmp [bx], ch
je newline
jmp loop
}
exit_prc: return;
newline: asm{
//insert cr char
mov dl, 0xD
int 21h
jmp loop
}
}
现在,我什么地方调用它,可以说PCB :: PCB()这样的:
_printf(“Counstructor PCBA \ n“);
它工作正常。但是,当我将它称为其他地方时,在其他字符串的其他文件中输出例如“tructor PCBa \ n”。
我不知道发生了什么。内存模型非常庞大。
要调用此从定时器ISR? DOS不可重入。 – 2010-08-15 17:21:28
否定时器ISR只做上下文切换。我可能有20多个线程,并且我也有信号量和事件实现。所以,当我的应用程序挂在一些执行不当的wait()时,我无法使用调试器对其进行跟踪,我唯一的选择是在代码中显示队列大小/元素和当前行以及线程ID。但是,如果我使用标准puts()来执行此操作,则我的Timer ISR会在puts内部的某处被调用,并且会导致在没有调试器的情况下运行时未运行的上下文切换。 – 2010-08-15 19:32:32