[Rust] 인라인 어셈블리

Rust는 기본적으로 저수준 제어 언어이기도 하기 때문에, C와 마찬가지로 인라인 어셈블리 문법을 제공한다.

다만 아직 unstable한 기능이라 사용이 불안정할 수 있다는게 단점이다.

1.59 버전에서 stable이 되었다.

인라인 어셈블리는 asm!이라는 매크로를 통해 처리할 수 있는데, 이 기능은 현재 아래 플랫폼에 대해서만 유효하게 동작한다고 한다.

x86 and x86-64
ARM
AArch64
RISC-V
NVPTX
Hexagon
MIPS32r2 and MIPS64r2
wasm32



변수에 값 쓰기 (mov)
한번 지역변수에 있는 값을 어셈블리로 덮어써보겠다.

우선 #[feature(asm)]을 위에 달아주고, unsafe 블럭 내에서 asm으로 mov를 해주면 된다.

아래 코드는 지역변수 i에 9999값을 쓰는 간단한 예시다.

지역변수는 {}로 구멍 뚫어놓고 out(reg)을 붙인 채로 전달했는데,
out은 쓰기용이라는 뜻이고, reg는 해당 지역변수가 실제로 할당될 레지스터를 알아서 찾아서 채워넣으라는 뜻이다.



**읽고 써보기 **
이번엔 그냥 일방적으로 쓰기만 하는게 아니라 지역변수값을 읽어서 그걸 기반으로 다시 써보겠다.

이것도 기본적으로 어려울 것은 별로 없다.
곱셈 연산을 위해 l 값을 rax에 저장한 다음, r로 곱하고  그걸 다시 result에 쓰는 것이다.

여러개의 명령을 쓴다면 그냥 명령 문자열들을 가변인자로 몽땅 넘기면 된다.
그리고 변수 인자에서 out(reg)는 해당 레지스터에 쓸 것이고, in(reg)는 읽기만 한다는 뜻이다. 둘다 한다면 inout(reg)를 써주면 된다.

그렇다.

일단 내 테스트환경이 x86이라서 인텔 어셈블리로 처리가 가능했지만,
플랫폼이 달라지면 아마 해당 플랫폼의 어셈블리 구문을 사용해야할 것이다.



참조
https://doc.rust-lang.org/unstable-book/library-features/asm.html