【发布时间】:2011-08-11 08:18:57
【问题描述】:
在uc/os的源码中,下面的代码看不懂。
*stk = _DS;
它的 cmets 是获取 DS 的当前值。
你能告诉我为什么吗?
【问题讨论】:
在uc/os的源码中,下面的代码看不懂。
*stk = _DS;
它的 cmets 是获取 DS 的当前值。
你能告诉我为什么吗?
【问题讨论】:
几乎可以肯定,编译器将_DS 识别为一个特殊的“变量”,它不会从存储变量的位置提取该变量的内容,而是直接使用数据段寄存器的内容。
换句话说,a = b 可能编译为:
mov ax, [0x12341234] // assuming b is at this location.
mov [0x56785678], ax // assuming a is at this location.
而a = _DS 可能是:
push ds // or, if available: mov ax, ds
pop ax
mov [0x56785678], ax // assuming a is at this location.
【讨论】:
这是一个编译器定义的宏(我假设这是因为名称只有大写)。领先的_ 通常会告诉您它是特定于编译器的。因此,一旦预处理器运行,它将插入自己的代码,该代码实际上将返回 DS 的当前值。
【讨论】: