1

我试图通过在我的 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
4

1 回答 1

1

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

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

于 2013-06-10T22:53:35.457 回答