我正在尝试通过在我的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
答案 0 :(得分:1)
确保您知道并遵循调用约定bcc
使用。典型的编译器期望在函数调用之间保留bp
和si
寄存器(以及其他寄存器)。编译器可能正在使用bp
来解决您的segment_start
局部变量,但是您会销毁bp
,因此在第二个函数调用时会传递一些垃圾,从而产生观察到的行为。
尝试保存并恢复bp
和si
(就像使用ds
一样),看看它是否解决了问题。