int write_ramdisk(int nth_zone, int zone_size, unsigned char *p_src) {
  if (zone_size * (nth_zone + 1) > 2 * 1024 * 1024)
    return -1;
  else {
    __asm__("mov %%ds,%%bx\n\t"
            "mov %%es,%%dx\n\t"
            "mov $0x10,%%ax\n\t"
            "mov %%ax,%%es\n\t"
            "mov %%ax,%%ds\n\t"
            "cld\n\t"
            "rep\n\t"
            "movsl\n\t"
            "mov %%dx,%%es\n\t"
            "mov %%bx,%%ds\n\t" ::"c"(zone_size / 4),
            "D"((unsigned char *)(0x100000 + zone_size * nth_zone)),
            "S"(p_src));
    return 0;
  }
}


x86 assembly (clang, -O0):
<write_ramdisk>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0xc(%rbp),%eax
mov    -0x8(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
cmp    $0x200000,%eax
jle    1131 <write_ramdisk+0x31>
movl   $0xffffffff,-0x4(%rbp)
jmp    116d <write_ramdisk+0x6d>
mov    -0xc(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0xc(%rbp),%eax
imul   -0x8(%rbp),%eax
add    $0x100000,%eax
movslq %eax,%rdi
mov    -0x18(%rbp),%rsi
mov    %ds,%bx
mov    %es,%dx
mov    $0x10,%ax
mov    %eax,%es
mov    %eax,%ds
cld
rep movsl %ds:(%rsi),%es:(%rdi)
mov    %edx,%es
mov    %ebx,%ds
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<write_ramdisk>:
lea    0x1(%rdi),%ecx
imul   %esi,%ecx
mov    $0xffffffff,%eax
cmp    $0x200000,%ecx
jg     1144 <write_ramdisk+0x44>
lea    0x3(%rsi),%ecx
test   %esi,%esi
cmovns %esi,%ecx
sar    $0x2,%ecx
imul   %esi,%edi
add    $0x100000,%edi
movslq %edi,%rdi
mov    %rdx,%rsi
mov    %ds,%bx
mov    %es,%dx
mov    $0x10,%ax
mov    %eax,%es
mov    %eax,%ds
cld
rep movsl %ds:(%rsi),%es:(%rdi)
mov    %edx,%es
mov    %ebx,%ds
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @write_ramdisk(i32 %0, i32 %1, i8* %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i8*
store i32 %0, i32* %5
store i32 %1, i32* %6
store i8* %2, i8** %7
%8 = load i32, i32* %6
%9 = load i32, i32* %5
%10 = add nsw i32 %9, 1
%11 = mul nsw i32 %8, %10
%12 = icmp sgt i32 %11, 2097152
br i1 %12, label %13, label %14
13: ; preds = %3
store i32 -1, i32* %4
br label %24
14: ; preds = %3
%15 = load i32, i32* %6
%16 = sdiv i32 %15, 4
%17 = load i32, i32* %6
%18 = load i32, i32* %5
%19 = mul nsw i32 %17, %18
%20 = add nsw i32 1048576, %19
%21 = sext i32 %20 to i64
%22 = inttoptr i64 %21 to i8*
%23 = load i8*, i8** %7
store i32 0, i32* %4
br label %24
24: ; preds = %14, %13
%25 = load i32, i32* %4
ret i32 %25
}

LLVM IR (-O2):
define i32 @write_ramdisk(i32 %0, i32 %1, i8* %2) {
%4 = add nsw i32 %0, 1
%5 = mul nsw i32 %4, %1
%6 = icmp sgt i32 %5, 2097152
br i1 %6, label %13, label %7
7: ; preds = %3
%8 = sdiv i32 %1, 4
%9 = mul nsw i32 %1, %0
%10 = add nsw i32 %9, 1048576
%11 = sext i32 %10 to i64
%12 = inttoptr i64 %11 to i8*
tail call void asm sideeffect "mov %ds,%bx\0A\09mov %es,%dx\0A\09mov $$0x10,%ax\0A\09mov %ax,%es\0A\09mov %ax,%ds\0A\09cld\0A\09rep\0A\09movsl\0A\09mov %dx,%es\0A\09mov %bx,%ds\0A\09", "{cx},{di},{si},~{dirflag},~{fpsr},~{flags}"(i32 %8, i8* %12, i8* %2)
br label %13
13: ; preds = %3, %7
%14 = phi i32 [ 0, %7 ], [ -1, %3 ]
ret i32 %14
}