【问题标题】:Printing to screen VGA variable offset打印到屏幕 VGA 可变偏移
【发布时间】:2023-03-14 01:47:01
【问题描述】:

我正在尝试通过在我的 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

【问题讨论】:

    标签: assembly vga as86


    【解决方案1】:

    确保您了解并遵循 bcc 使用的调用约定。典型的编译器会期望在函数调用中保留bpsi 寄存器(以及其他)。编译器可能正在使用bp 来处理您的segment_start 局部变量,但您破坏了bp,所以在第二个函数调用时会传递一些垃圾,从而产生观察到的行为。

    尝试保存和恢复bpsi(就像您对ds 所做的那样),看看它是否能解决问题。

    【讨论】:

    • 我尝试将bpsids 推入堆栈并通过在函数末尾以相反的顺序弹出它们来检索它们,但这似乎并没有解决它
    • 尝试保存所有寄存器然后(方便地使用pusha/popa) - 编译器可能正在使用任何调用者保存的寄存器来保存segment_start 变量。
    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多