use*_*421 3 c c++ assembly nasm
在低级语言中,有可能mov是第一个数组元素的双字(32位),它将溢出写入第二个,第三个和第四个元素,或者mov一个字(16位)到第一个,它将溢出到第二个元件.
如何在c中实现同样的效果?当试图例如:
char txt[] = {0, 0};
txt[0] = 0x4142;
Run Code Online (Sandbox Code Playgroud)
它发出警告 [-Woverflow]
并且值txt[1] 不会改变并txt[0]设置为0x42.
如何获得与汇编相同的行为:
mov word [txt], 0x4142
先前的汇编指令将设置在第一元件[txt+0]到0x42第二元件[txt+1]到0x41.
这个建议怎么样?
将数组定义为单个变量.
uint16_t txt;
txt = 0x4142;
Run Code Online (Sandbox Code Playgroud)
并使用((uint8_t*) &txt)[0]第一个元素和((uint8_t*) &txt)[1]第二个元素访问元素.
如果您完全确定这不会导致分段错误,您必须使用memcpy()
uint16_t n = 0x4142;
memcpy((void *)txt, (void *)&n, sizeof(uint16_t));
Run Code Online (Sandbox Code Playgroud)
通过使用void指针,这是最通用的解决方案,可以推广到此示例之外的所有情况.