我正在写8086处理器的小内核(工作在BC3.1中,Windows XP作为主机操作系统)。内核是多线程的,所以当我使用printf或cout进行调试时会遇到问题(在代码中的某个地方,printf将InterruptEnable标志设置为1,并且我的计时器中断例程调用dispatch,并且我的代码崩溃)。
因此,我在内联asm中编写了简单的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“。
我不知道这是怎么回事。内存模型非常庞大。
发布于 2010-08-16 01:30:40
首先,至少在我看来,您选择了一个相当糟糕的名称--您拥有的几乎是一个puts,而不是一个printf。其次,对于您正在尝试完成的任务,您可能希望尝试使用Borland的cprintf、cputs等--它们使用DOS控制台输出例程,并且它们很有可能不启用中断。
如果这不起作用,似乎仍然没有什么理由使用内联汇编。我会这样做:
// warning: untested -- and it's been a while since I wrote any code like this,
// so it's probably a little wrong.
//
void myputc(char ch) {
union REGS in, out;
// set up registers here:
in.h.ah = 2;
in.h.dl = ch;
intdos(&in, &out);
}
void myputs(char huge *s) {
while (*s) {
if (*s == '\n')
myputc('\r');
myputc(*s++);
}
} 如果你真的想使用汇编语言,我的建议是把它写成一个单独的纯汇编语言模块:
; Again: not tested and I haven't done this in a while, so use with care.
;
.model large, c
.code
LF = 10
CR = 13
putc proc
mov dl, al
mov ah, 2
int 21h
ret
putc endp
puts proc string: ptr char
mov si, string
lodsb
next:
cmp al, LF
jnz printit
mov dl, CR
mov ah, 2
int 21h
printit:
mov dl, al
mov ah, 2
int 21h
lodsb
test al, al
jnz next
ret
puts endp
end https://stackoverflow.com/questions/3488233
复制相似问题