Embedding Assembly

Objective: Use assembly code below to invoke getpid syscall. Obtain PID from %eax and print it to stdout.

movl $20, %eax
int $0x80

Note that this should work under most unix platforms running on x86. Alternative solution that works on x86-64 would be:

movl $39, %eax
syscall

Python

Embedding assembly makes little sense in an interpreted language like Python where typical intention is to be platform-agnostic. Hovewer, for the sake of example we can use CFFI module that will compile C code on the fly. C code in turn will embed our assembly:

from cffi import FFI
ffi = FFI()
ffi.set_source("_pidlib", r"""
int get_pid() {
    int pid;
    asm("movl $20, %%eax\n"
        "int $0x80\n"
        "movl %%eax, %0\n" : "=r"(pid));
    return pid;
}
""")
ffi.cdef("int get_pid();")
ffi.compile()

from _pidlib.lib import get_pid

print(get_pid())

Rust

Intel syntax applies.

use std::arch::asm;

fn main() {
    let mut pid: u32;
    unsafe {
        asm!(
            "mov eax, $20",
            "int $0x80",
            "mov {pid:e}, eax",
             pid = out(reg) pid,
        );
    }
    println!("{}", pid);
}

Crystal

AT&T syntax applies.

fun getpid() : Int32
    pid = uninitialized Int32
    
    asm("
    movl $$20, %eax
    int $$0x80
    movl %eax, $0" : "=r"(pid))
    
    return pid
end

puts getpid