| 
 | ||||||
/* write.s */ .data hello: .string "hello world\n" .text .globl _start _start: movl $SYS_write,%eax // SYS_write = 4 movl $STDOUT,%ebx // fd = fileno(stdio) movl $hello,%ecx // buf = str movl $12,%edx // count = 0x6 int $0x80 movl $SYS_exit
ssize_t write(int fd, const void *buf, size_t count)
/* mmap.s */
.data
  fd:
    .long 0
  fdlen:
    .long 0
  mappedptr:
    .long 0
.text
.globl _start
_start:
  subl $24,%esp
// open(file, O_RDONLY);
  movl $SYS_open,%eax
  movl 32(%esp),%ebx     // argv[1], %esp+8+24 de
  xorl %ecx,%ecx         // %ecx'i O_RDONLY, yani 0 yap
  int  $0x80
  test %eax,%eax         // dönen değer < 0 ise çık
  js   exit
  movl %eax,fd           // fd'i sakla
// lseek(fd,0,SEEK_END);
  movl %eax,%ebx
  xorl %ecx,%ecx         // göreli bellek konumunu sıfır yap
  movl $SEEK_END,%edx
  movl $SYS_lseek,%eax
  int   $0x80
  movl %eax,fdlen        // dosya uzunluğunu sakla
  xorl %edx,%edx
// mmap(NULL,fdlen,PROT_READ,MAP_SHARED,fd,0);
  movl %edx,(%esp)
  movl %eax,4(%esp)
  movl $PROT_READ,8(%esp)
  movl $MAP_SHARED,12(%esp)
  movl fd,%eax
  movl %eax,16(%esp)
  movl %edx,20(%esp)
  movl $SYS_mmap,%eax
  movl %esp,%ebx
  int  $0x80
  movl %eax,mappedptr    // göstericiyi sakla
// write(STDOUT, mappedptr, fdlen);
  movl $STDOUT,%ebx
  movl %eax,%ecx
  movl fdlen,%edx
  movl $SYS_write,%eax
  int  $0x80
// munmap(mappedptr, fdlen);
  movl mappedptr,%ebx
  movl fdlen,%ecx
  movl $SYS_munmap,%eax
  int  $0x80
// close(fd);
  movl fd,%ebx           // dosya tanımlayıcıyı yükle
  movl $SYS_close,%eax
  int  $0x80
exit:
// exit(0);
  movl $SYS_exit,%eax
  xorl %ebx,%ebx
  int  $0x80
  ret
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#define STDOUT 1
void
main(void)
{
  char file[] = "mmap.s";
  char *mappedptr;
  int fd, filelen;
  fd = fopen(file, O_RDONLY);
  filelen = lseek(fd, 0, SEEK_END);
  mappedptr = mmap(NULL, filelen, PROT_READ, MAP_SHARED, fd, 0);
  write(STDOUT, mappedptr, filelen);
  munmap(mappedptr, filelen);
  close(fd);
}
| %esp | %esp+4 | %esp+8 | %esp+12 | %esp+16 | %esp+20 | 
|---|---|---|---|---|---|
| 00000000 | filelen | 00000001 | 00000001 | fd | 00000000 | 
$ cat mmap.s
.include "defines.h"
.data
  file:
    .string "mmap.s"
  fd:
    .long 0
  filelen:
    .long 0
  mappedptr:
    .long 0
.globl main
main:
  push %ebp
  movl %esp,%ebp
  subl $24,%esp
// open($file, $O_RDONLY);
  movl $fd,%ebx          // fd kaydediliyor
  movl %eax,(%ebx)
// lseek($fd,0,$SEEK_END);
  movl $filelen,%ebx     // dosya uzunluğu kaydediliyor
  movl %eax,(%ebx)
  xorl %edx,%edx
// mmap(NULL,$filelen,PROT_READ,MAP_SHARED,$fd,0);
  movl %edx,(%esp)
  movl %eax,4(%esp)      // dosya uzunluğu hala %eax içerisinde
  movl $PROT_READ,8(%esp)
  movl $MAP_SHARED,12(%esp)
  movl $fd,%ebx          // dosya tanımlayıcısı yükleniyor
  movl (%ebx),%eax
  movl %eax,16(%esp)
  movl %edx,20(%esp)
  movl $SYS_mmap,%eax
  movl %esp,%ebx
  int  $0x80
  movl $mappedptr,%ebx   // ptr kaydediliyor
  movl %eax,(%ebx)
// write($stdout, $mappedptr, $filelen);
// munmap($mappedptr, $filelen);
// close($fd);
  movl %ebp,%esp
  popl %ebp
  ret
$
|  | Not | 
|---|---|
| 
Yukarıdaki kaynak kodu Örnek 9.2 örneğindeki kaynak kodundan farklıdır. Yukarıda bulunan kaynak kodu diğer sistem çağrılarını, bu bölümün konusu olmadıkları için, göstermemektedir. Yukarıdaki kod sadece mmap.s dosyasını açar, oysa Örnek 9.2 kaynak kodu komut satırı parametrelerini okumaktadır. mmap  örneği dosya uzunluğunu okumak için de lseek'i kullanmaktadır.
 | 
/* socket.s */ .text .globl _start _start: sub $12,%esp // socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); movl $AF_INET,(%esp) movl $SOCK_STREAM,4(%esp) movl $IPPROTO_TCP,8(%esp) movl $SYS_socketcall,%eax movl $SYS_socketcall_socket,%ebx movl %esp,%ecx int $0x80 movl $SYS_exit,%eax xorl %ebx,%ebx int $0x80 ret
| 
 | |||||||||