gpt4 book ai didi

assembly - 使用Rust内联汇编时奇怪的机器代码字节顺序

转载 作者:行者123 更新时间:2023-12-03 11:41:55 27 4
gpt4 key购买 nike

我目前正在尝试用Rust(Windows 32位)编写程序,该程序基本上将从它自己的.text部分提取一些特定的零件机器代码。

基本上,如果我将函数test1定义并调用为:

unsafe fn test1(){
asm!("
pushad
.byte 0x90, 0x90, 0x09, 0xC0, 0x09, 0xDB, 0x09, 0xC9, 0x90

inc eax
mov eax, ebx
xor eax, eax

.byte 0x90, 0x09, 0xC0, 0x09, 0xDB, 0x09, 0xC9, 0x90, 0x90
popad
"
:
:
:
:"intel");
}

它将输出:
inc eax
mov eax, ebx
xor eax, eax

该程序使用 .byte 0x90, 0x09, 0xC0, 0x09, 0xDB, 0x09, 0xC9, 0x90, 0x90.byte 0x90, 0x09, 0xC0, 0x09, 0xDB, 0x09, 0xC9, 0x90, 0x90来识别要检索的代码(这些操作码代表一些 nopor reg, reg,它们基本上什么也不做)。

一切正常,直到我尝试执行以下操作:
unsafe fn test2(){
asm!("
.byte 0x90, 0x90, 0x09, 0xC0, 0x09, 0xDB, 0x09, 0xC9, 0x90
"
:
:
:
:"intel");
while a < 10{
a += 1;
}
asm!("
inc eax
dec eax
.byte 0x90, 0x09, 0xC0, 0x09, 0xDB, 0x09, 0xC9, 0x90, 0x90
"
:
:
:
:"intel");
}

它仅检测 inc/dec指令,这意味着我看不到任何可能与两次内联汇编用法相同的Rust代码的汇编等效项(while循环使 增加了)。

我真的不知道Rust编译器如何处理内联汇编,但是我逻辑上认为它会遵守代码执行的顺序。

我希望我的问题足够清楚。

最佳答案

在优化的输出中,除了在两者之间执行的 assembly 将具有相同的可观察效果外,基本上没有任何保证。这意味着不能保证订购,也不能保证 assembly 看起来像输入一样。 (众所周知,编译器会将某些计算系列的循环转换为它们的等效求和函数)。

如果要在优化的程序集中找到与一段代码关联的程序集,请将该代码放入其自己的函数中,并将该函数及其调用的所有函数标记为no_inline。并确保您要查看的所有代码都具有可观察到的效果,或使用Benchmark::black_box假装它具有此功能。

关于assembly - 使用Rust内联汇编时奇怪的机器代码字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62129937/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com