[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