assembly 如何在汇编Intel x86中基于Endianness进行编写

mefy6pfw  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(128)

在执行移动100之后,EAX中的值是多少,%eax?

如果这台机器是小字节序?(朋友的回答)
0x00 0x00 0x00 0x11
我的想法:

0x44332211? Also, does those 0x matter or can I just do one like this?

对于大端:(朋友的回答)
0x11 0x00 0x00
在这里,我也认为:

0x11223344
prdp8dxp

prdp8dxp1#

eax是一个x86寄存器,因此我们讨论的是一个x86架构,它是little-endian。
为了让各行各业的读者受益,让我也提到指令movl 100, %eax是AT&T/GNU汇编语法,它的意思是“将从内存地址100开始的4个字节移动到寄存器EAX中”。在Intel/Microsoft/Borland语法中,这条相同的指令将是mov eax, [100](给予或接受DWORD PTR)。
在小端体系结构上,从包含字节0x 11、0x 22、0x 33、0x 44的存储器位置加载32位寄存器将导致该寄存器的值为0x44332211。这就是little endian的意思:反直觉的方式。
小字节序的存在是因为它比大字节序有一个小的(边界)技术优势:如果你知道存储在某个内存位置的值足够小,可以放入一个更小的寄存器,那么你可以从同一个内存位置读取到更小的寄存器,你仍然会得到正确的值。换句话说:
如果您用0x 00002211加载EAX,并将其存储到内存位置100的四个字节中,那么稍后您可以从内存位置100加载AX寄存器,您将获得0x 2211。与big endian相比,为了将该值加载到较小的寄存器中,您必须确保跳过前两个字节,并从内存位置102开始阅读。
英特尔决定为x86架构采用小字节序,尽管它相对于大字节序的优势微乎其微,因为根据工程传统,当我们必须在两个选项之间做出选择时,其他一切似乎都是平等的,我们倾向于选择具有最轻微技术优势的选项。从历史上看,任何与人类直觉和人类文化因素有关的东西都被完全忽视为可能的优势,因为它不是技术优势。事实上,我们发现大尾数更直观,因为在西方世界,我们从左到右阅读和书写,我们写的数字从最大的数字开始,但这两个事实只不过是文化事故。

相关问题