视频内存访问和后缀增量

时间:2015-08-27 08:38:06

标签: c pointers memory

我在内存访问和postix增量方面遇到了一些问题:/
我需要在启动时访问视频内存,因此,我创建一个指向 0xB8000 地址的指针,然后,我将指针递增以访问下一个位置。

基本上,代码是:

volatile char *p = (volatile char *)0xB8000;

for (int i = 0; i < 5; ++i)
    *(p++) = 'A';

这样,p指向正确的内存地址,并且在每次访问后,它会递增(我知道,显示的每个字符有2个字节,但这不是问题)。

但这不起作用,没有显示任何角色。它什么都没显示。但是,如果我将增量​​更改为这样的前缀,它可以工作,我可以看到屏幕上的字符!

volatile char *p = (volatile char *)0xB8000;

for (int i = 0; i < 5; ++i)
    *(++p) = 'A'

所以,我检查了汇编代码:

; Postfix
mov ecx, DWORD PTR _p$[ebp]
mov BYTE PTR [ecx], 65       ; 'A' character
mov edx, DWORD PTR _p$[ebp]
add edx, 1
mov DWORD PTR _p$[ebp], edx

; Prefix
mov ecx, DWORD PTR _p$[ebp]
add ecx, 1
mov DWORD PTR _p$[ebp], ecx
mov edx, DWORD PTR _p$[ebp]
mov BYTE PTR [edx], 65       ; 'A' character

我无法发现差异。顺便说一下,我可以使用前缀增量但是,我想了解后缀不起作用:/

汇编代码来自Visual C ++编译器,我没有任何GCC在工作:/

编辑:我知道前缀和后缀增量之间的区别,我看到这里出现的汇编代码之间的区别。但IMO,这些差异都不会导致屏幕上出现非打印字符 关于属性字节:我知道我应该正确设置它。我会用光汇编代码保留一个简单的例子,但实际上,随着增量,属性字符总是设置为&#39; A&#39;导致红色背景上的蓝色字母。

谢谢:)

1 个答案:

答案 0 :(得分:0)

经过几次测试后,我发现了这个错误的可能原因,它是关于.rodata部分没有正确链接的,所以它现在更好了。

有关详细信息,请按照OSDev Tutorial;)

上的一些说明进行操作