如何在 Rust 中内联 ASM 字节语句?
How to inline ASM byte statement in Rust?
我写了一个简单的二进制应用程序来生成一个 c 源文件,我给它一个内存地址并拆分字符串以打印最终源文件。我是 Rust 的新手,如何改进?我也做了一些搜索和替换,最后给了我“”,我不确定为什么要替换它。
这是应用输出:
~/Research/split_mem_mk_src(master*) » cargo run
Compiling split_mem_mk_src v0.1.0 (/Users/RSRCH/Research/split_mem_mk_src)
Finished dev [unoptimized + debuginfo] target(s) in 0.46s
Running `target/debug/split_mem_mk_src`
int main(int argc, char *argv[]) {
__asm__(".byte "0x62, 0x02, 0x55, 0xd4, 0x7f, 0xb5, 0xb1, 0x8e, 0xbf, 0xcd\"")
}
我想以此结束...
int main(int argc, char *argv[]) {
__asm__(".byte 0x62, 0x02, 0x55, 0xd4, 0x7f, 0xb5, 0xb1, 0x8e, 0xbf, 0xcd");
}
我最终只想在 rust 中执行 asm 并通过 gdb 运行,所以任何关于这个的想法都会很棒。很高兴阅读文档。我找到了这个 https://doc.rust-lang.org/beta/unstable-book/library-features/asm.html 但没有看到像 C.
这样的执行字节语句
应用程序来源
fn main() {
let n = 2;
let text = "620255d47fb5b18ebfcd".to_string();
let mem_addr = text.chars()
.enumerate()
.flat_map(|(i, c)| {
if i != 0 && i % n == 0 {
Some(' ')
} else {
None
}
.into_iter()
.chain(std::iter::once(c))
})
.collect::<String>();
let final_str = format!("0x{:?}", mem_addr.replace(" ", ", 0x"));
println!("int main(int argc, char *argv[]) {{");
println!(" __asm__(\".byte {:?})", final_str.replace("0x\"", "0x"));
println!("}}");
}
```
您正在使用 {:?}
。这使用 Debug
特性,仅用于调试,始终在字符串周围包含引号并转义特殊字符,例如 "
。 Debug
不能用于产生任何类型的精确输出。
你想要的是Display
trait,当没有指定时这是默认的trait,所以你可以简单地使用{}
.
我写了一个简单的二进制应用程序来生成一个 c 源文件,我给它一个内存地址并拆分字符串以打印最终源文件。我是 Rust 的新手,如何改进?我也做了一些搜索和替换,最后给了我“”,我不确定为什么要替换它。
这是应用输出:
~/Research/split_mem_mk_src(master*) » cargo run
Compiling split_mem_mk_src v0.1.0 (/Users/RSRCH/Research/split_mem_mk_src)
Finished dev [unoptimized + debuginfo] target(s) in 0.46s
Running `target/debug/split_mem_mk_src`
int main(int argc, char *argv[]) {
__asm__(".byte "0x62, 0x02, 0x55, 0xd4, 0x7f, 0xb5, 0xb1, 0x8e, 0xbf, 0xcd\"")
}
我想以此结束...
int main(int argc, char *argv[]) {
__asm__(".byte 0x62, 0x02, 0x55, 0xd4, 0x7f, 0xb5, 0xb1, 0x8e, 0xbf, 0xcd");
}
我最终只想在 rust 中执行 asm 并通过 gdb 运行,所以任何关于这个的想法都会很棒。很高兴阅读文档。我找到了这个 https://doc.rust-lang.org/beta/unstable-book/library-features/asm.html 但没有看到像 C.
这样的执行字节语句应用程序来源
fn main() {
let n = 2;
let text = "620255d47fb5b18ebfcd".to_string();
let mem_addr = text.chars()
.enumerate()
.flat_map(|(i, c)| {
if i != 0 && i % n == 0 {
Some(' ')
} else {
None
}
.into_iter()
.chain(std::iter::once(c))
})
.collect::<String>();
let final_str = format!("0x{:?}", mem_addr.replace(" ", ", 0x"));
println!("int main(int argc, char *argv[]) {{");
println!(" __asm__(\".byte {:?})", final_str.replace("0x\"", "0x"));
println!("}}");
}
```
您正在使用 {:?}
。这使用 Debug
特性,仅用于调试,始终在字符串周围包含引号并转义特殊字符,例如 "
。 Debug
不能用于产生任何类型的精确输出。
你想要的是Display
trait,当没有指定时这是默认的trait,所以你可以简单地使用{}
.