Fix the inline assembly examples
They now use the currently working syntax.
This commit is contained in:
parent
314b1f16b7
commit
3d0ad46eea
@ -58,7 +58,7 @@ but you must add the right number of `:` if you skip them:
|
||||
asm!("xor %eax, %eax"
|
||||
:
|
||||
:
|
||||
: "eax"
|
||||
: "{eax}"
|
||||
);
|
||||
# } }
|
||||
```
|
||||
@ -69,7 +69,7 @@ Whitespace also doesn't matter:
|
||||
# #![feature(asm)]
|
||||
# #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||
# fn main() { unsafe {
|
||||
asm!("xor %eax, %eax" ::: "eax");
|
||||
asm!("xor %eax, %eax" ::: "{eax}");
|
||||
# } }
|
||||
```
|
||||
|
||||
@ -83,7 +83,7 @@ expressions must be mutable lvalues:
|
||||
# #![feature(asm)]
|
||||
# #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||
fn add(a: i32, b: i32) -> i32 {
|
||||
let mut c = 0;
|
||||
let c: i32;
|
||||
unsafe {
|
||||
asm!("add $2, $0"
|
||||
: "=r"(c)
|
||||
@ -100,6 +100,21 @@ fn main() {
|
||||
}
|
||||
```
|
||||
|
||||
If you would like to use real operands in this position, however,
|
||||
you are required to put curly braces `{}` around the register that
|
||||
you want, and you are required to put the specific size of the
|
||||
operand. This is useful for very low level programming, where
|
||||
which register you use is important:
|
||||
|
||||
```
|
||||
# #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||
# unsafe fn read_byte_in(port: u16) -> u8 {
|
||||
let result: u8;
|
||||
asm!("in %dx, %al" : "={al}"(result) : "{dx}"(port));
|
||||
result
|
||||
# }
|
||||
```
|
||||
|
||||
## Clobbers
|
||||
|
||||
Some instructions modify registers which might otherwise have held
|
||||
@ -112,7 +127,7 @@ stay valid.
|
||||
# #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||
# fn main() { unsafe {
|
||||
// Put the value 0x200 in eax
|
||||
asm!("mov $$0x200, %eax" : /* no outputs */ : /* no inputs */ : "eax");
|
||||
asm!("mov $$0x200, %eax" : /* no outputs */ : /* no inputs */ : "{eax}");
|
||||
# } }
|
||||
```
|
||||
|
||||
@ -139,3 +154,14 @@ Current valid options are:
|
||||
the compiler to insert its usual stack alignment code
|
||||
3. *intel* - use intel syntax instead of the default AT&T.
|
||||
|
||||
```
|
||||
# #![feature(asm)]
|
||||
# #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||
# fn main() {
|
||||
let result: i32;
|
||||
unsafe {
|
||||
asm!("mov eax, 2" : "={eax}"(result) : : : "intel")
|
||||
}
|
||||
println!("eax is currently {}", result);
|
||||
# } }
|
||||
```
|
||||
|
Loading…
Reference in New Issue
Block a user