小编mik*_*ike的帖子

Os Dev的PCI IDE教程中的函数insl是做什么的?

这是调用 insl 的函数。

void ide_read_buffer(unsigned char channel, unsigned char reg, unsigned int buffer,
                     unsigned int quads) {
   /* WARNING: This code contains a serious bug. The inline assembly trashes ES and
    *           ESP for all of the code the compiler generates between the inline
    *           assembly blocks.
    */
   if (reg > 0x07 && reg < 0x0C)
      ide_write(channel, ATA_REG_CONTROL, 0x80 | channels[channel].nIEN);
   asm("pushw %es; movw %ds, %ax; movw %ax, %es");
   if (reg < 0x08)
      insl(channels[channel].base  + reg - 0x00, buffer, quads); …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly osdev ata

2
推荐指数
1
解决办法
115
查看次数

正在从 C 中的赋值表达式 UB 读取属性

我有以下代码片段:

_nhp_array_char_t intpd_str1; 
intpd_str1.length = snprintf(NULL, 0, "You\'re %.*s!", (_nhp_var_str = _nhp_var_you->to_array_char->_nhp_this_anon(_nhp_var_you->to_array_char)).length, _nhp_var_str.buffer);
intpd_str1.buffer = _nhp_malloc(intpd_str1.length + 1); 
intpd_str1.responsible_destroyer = NULL; 
snprintf(intpd_str1.buffer, intpd_str1.length + 1, "You\'re %.*s!", _nhp_var_str.length, _nhp_var_str.buffer);
Run Code Online (Sandbox Code Playgroud)

调用_nhp_var_you->to_array_char->_nhp_this_anon(_nhp_var_you->to_array_char)应该并且确实返回一个带有length22 的结构以及 的有效值buffer

然而,该表达式的intpd_str1.length = snprintf...计算结果为 14。然而,在 GDB 中,预先运行赋值表达式,然后读取_nhp_var_str.length返回正确的值 30。

我怀疑一定存在某种形式的未定义行为,尽管我还无法确认这一点,即使在搜索谷歌和SO之后也是如此。我认为,出于某种原因,在评估 时(_nhp_var_str = _nhp_var_you->to_array_char->_nhp_this_anon(_nhp_var_you->to_array_char)).length,它决定生成 的结果_nhp_var_str.length而不为 赋值_nhp_var_str

仅供参考,代码看起来很混乱,因为它是经过转译的;就编码风格而言,我无能为力来实际改变它。

c undefined-behavior

0
推荐指数
1
解决办法
62
查看次数

标签 统计

c ×2

assembly ×1

ata ×1

osdev ×1

undefined-behavior ×1

x86 ×1