首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Borland c++与WORD PTR和string的内联asm问题

Borland c++与WORD PTR和string的内联asm问题
EN

Stack Overflow用户
提问于 2010-08-16 00:33:41
回答 1查看 3K关注 0票数 3

我正在写8086处理器的小内核(工作在BC3.1中,Windows XP作为主机操作系统)。内核是多线程的,所以当我使用printf或cout进行调试时会遇到问题(在代码中的某个地方,printf将InterruptEnable标志设置为1,并且我的计时器中断例程调用dispatch,并且我的代码崩溃)。

因此,我在内联asm中编写了简单的puts函数:

代码语言:javascript
复制
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():

代码语言:javascript
复制
 \_printf("Counstructor PCBa\n");

它工作得很好。但是,当我在其他地方调用它时,在包含其他字符串其他文件中,它会输出例如"tructor PCBa\n“。

我不知道这是怎么回事。内存模型非常庞大。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-16 01:30:40

首先,至少在我看来,您选择了一个相当糟糕的名称--您拥有的几乎是一个puts,而不是一个printf。其次,对于您正在尝试完成的任务,您可能希望尝试使用Borland的cprintfcputs等--它们使用DOS控制台输出例程,并且它们很有可能不启用中断。

如果这不起作用,似乎仍然没有什么理由使用内联汇编。我会这样做:

代码语言:javascript
复制
// 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++);
    }
}            

如果你真的想使用汇编语言,我的建议是把它写成一个单独的纯汇编语言模块:

代码语言:javascript
复制
; 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        
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3488233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档