我正在尝试为Rust中的STM32编写一个bootloader,我无法弄清楚如何正确填充堆栈指针.我可以告诉代码应该是:
asm!("MOV SP, $0" :: "0"(stack_pointer)); // set the stack pointer
Run Code Online (Sandbox Code Playgroud)
但是编译器不同意:
error: invalid operand in inline asm: 'MOV SP, $0'
--> src/main.rs:38:5
|
38 | asm!("MOV SP, $0" :: "0"(stack_pointer)); // set the stack pointer
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: <inline asm>:1:11: error: unexpected token in operand
MOV SP,
^
--> src/main.rs:38:5
|
38 | asm!("MOV SP, $0" :: "0"(stack_pointer)); // set the stack pointer
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?它似乎在抱怨美元符号,但我直接从文档中得到了它.
根据评论中的对话,我尝试了两件事,两者都编译(!),但两者似乎都没有用(但这可能是十亿个原因中的任何一个,仍在继续):
版本A:
asm!("MOV R0, #0x0800");
asm!("LSL R0, R0, #16");
asm!("MOV R1, …Run Code Online (Sandbox Code Playgroud) 我试图通过Project Euler来自学Haskell(再次).问题14(https://projecteuler.net/problem=14)正在乞求动态编程,而且从历史上来说,我一直强烈反对monad(因为我一再学会如何使用它们以使生活更轻松而不是更难所以我试图咬紧牙关并使用状态monad来记忆我的代码...它进展不顺利.我想清楚,我已经解决了这个问题的简单/缓慢的方式,此时我正在尝试学习一些东西(即项目Euler No. 14 Haskell不是我正在寻找的).
到目前为止我的代码是:
collatzMemoCheck :: Int -> State (Map Int Int) Int
collatzMemoCheck n = state $ \s -> maybe (let (a, s') = runState (collatzFast n) s
in (a+1, Map.insert n (a+1) s'))
(\len -> (len, s))
(Map.lookup n s)
collatzFast :: Int -> State (Map Int Int) Int
collatzFast 1 = state $ \_ -> (1, Map.singleton 1 1)
collatzFast n
| even n = collatzMemoCheck (n `quot` 2)
| otherwise …Run Code Online (Sandbox Code Playgroud)