@@ -52,7 +52,6 @@ asm := "asm!(" format_string *("," format_string) *("," operand) [","] ")"
52
52
global_asm := "global_asm!(" format_string *("," format_string) *("," operand) [","] ")"
53
53
```
54
54
55
-
56
55
## Scope
57
56
58
57
Inline assembly can be used in one of two ways.
@@ -485,6 +484,29 @@ To avoid undefined behavior, these rules must be followed when using function-sc
485
484
486
485
> ** Note** : As a general rule, the flags covered by ` preserves_flags ` are those which are * not* preserved when performing a function call.
487
486
487
+ ### Correctness and Validity
488
+
489
+ In addition to all of the previous rules, the string argument to ` asm! ` must ultimately become—
490
+ after all other arguments are evaluated, formatting is performed, and operands are translated—
491
+ assembly that is both syntactically correct and semantically valid for the target architecture.
492
+ The formatting rules allow the compiler to generate assembly with correct syntax.
493
+ Rules concerning operands permit valid translation of Rust operands into and out of ` asm! ` .
494
+ Adherence to these rules is necessary, but not sufficient, for the final expanded assembly to be
495
+ both correct and valid. For instance:
496
+
497
+ - arguments may be placed in positions which are syntactically incorrect after formatting
498
+ - an instruction may be correctly written, but given architecturally invalid operands
499
+ - an architecturally unspecified instruction may be assembled into unspecified code
500
+ - a set of instructions, each correct and valid, may cause undefined behavior if placed in immediate succession
501
+
502
+ As a result, these rules are _ non-exhaustive_ . The compiler is not required to check the
503
+ correctness and validity of the initial string nor the final assembly that is generated.
504
+ The assembler may check for correctness and validity but is not required to do so.
505
+ When using ` asm! ` , a typographical error may be sufficient to make a program unsound,
506
+ and the rules for assembly may include thousands of pages of architectural reference manuals.
507
+ Programmers should exercise appropriate care, as invoking this ` unsafe ` capability comes with
508
+ assuming the responsibility of not violating rules of both the compiler or the architecture.
509
+
488
510
### Directives Support
489
511
490
512
Inline assembly supports a subset of the directives supported by both GNU AS and LLVM's internal assembler, given as follows.
0 commit comments