| ||||||
/* 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
| |||||||||