我正在爲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