打印到屏幕VGA变量偏移

时间:2013-06-10 22:22:10

标签: assembly vga as86

我正在尝试通过在我的C代码中调用以下函数来在屏幕上显示字符:

.global _putInMemory

;void putInMemory (int segment, int address, char character)
    _putInMemory:
        mov bp,sp
        push ds
        mov ax,[bp+2]
        mov si,[bp+4]
        mov cl,[bp+6]
        mov ds,ax
        mov [si],cl
        pop ds
        ret
像这样:

    int segment_start = 0xB000;
    putInMemory(segment_start, 0x8140, 'R');
    putInMemory(segment_start, 0x8141, 0x1F);
    putInMemory(segment_start, 0x8142, 'A');
    putInMemory(segment_start, 0x8143, 0x1F);

但是,这只显示没有颜色的第一个字母,但是当我在这样的代码中指定它时,它可以正常工作:

putInMemory(0xB000, 0x8140, 'R');
putInMemory(0xB000, 0x8141, 0x1F);
putInMemory(0xB000, 0x8142, 'A');
putInMemory(0xB000, 0x8143, 0x1F);

如果我将int存储在变量中,我不明白为什么它不起作用。 int太小了吗? 我正在使用bcc编译器

修改 正确的代码是:

;void putInMemory (int segment, int address, char character)
_putInMemory:
    push bp
    mov bp,sp
    push ds
    mov ax,[bp+4]
    mov si,[bp+6]
    mov cl,[bp+8]
    mov ds,ax
    mov [si],cl
    pop ds
    pop bp
    ret

1 个答案:

答案 0 :(得分:1)

确保您知道并遵循调用约定bcc使用。典型的编译器期望在函数调用之间保留bpsi寄存器(以及其他寄存器)。编译器可能正在使用bp来解决您的segment_start局部变量,但是您会销毁bp,因此在第二个函数调用时会传递一些垃圾,从而产生观察到的行为。

尝试保存并恢复bpsi(就像使用ds一样),看看它是否解决了问题。